文章目录[隐藏]
GD32串口通信
虽说GD32与stm32采用同样的ARM® Cortex®-M3内核,而且GD32很大程度上可兼容stm32的程序,但是也存在着一些差异;所以为了使用上减少出错,使用GD32时尽量采用GD32官方库来编写程序。
GD32与STM32在串口通信上的差异
GD32 | STM32 |
---|---|
USART0 | USART1 |
USART1 | USART2 |
USART2 | USART3 |
也就是GD32在串口数是从0开始,而stm32是从1开始;特别注意的是GD32在手册上串口数也是从1开始的,小编为此也是郁闷得很。
下面就是常规的串口操作啦,大致上与stm32 相同。
串口初始化
void usart_init(void)
{
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_USARTx);
rcu_periph_clock_enable(RCU_AF);
/* configure USART Tx as alternate function push-pull */
gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);
gpio_init(GPIOA, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, GPIO_PIN_10);
/* USART configure */
usart_deinit(USARTx);
nvic_irq_enable(USARTx_IRQn, 0, 0);
usart_baudrate_set(USARTx, bd);
usart_word_length_set(USARTx, USART_WL_8BIT);
usart_stop_bit_set(USARTx, USART_STB_1BIT);
usart_parity_config(USARTx, USART_PM_NONE);
usart_hardware_flow_rts_config(USARTx, USART_RTS_DISABLE);
usart_hardware_flow_cts_config(USARTx, USART_CTS_DISABLE);
usart_receive_config(USARTx, USART_RECEIVE_ENABLE);
usart_transmit_config(USARTx, USART_TRANSMIT_ENABLE);
usart_interrupt_enable(USARx, USART_INT_RBNE);
usart_interrupt_enable(USARTx, USART_INT_ERR);
usart_enable(USARTx);
}
串口发送
void UARTx_SendSpBuffer(uint32_t usart_periph,uint8_t* pSda,uint8_t len)
{
int i=0;
for(i=0;i<len;i++)
{
while(RESET == usart_flag_get(usart_periph, USART_FLAG_TBE));//等待数据寄存器变空
usart_data_transmit(usart_periph, *pSda);
pSda++;
}
while(RESET == usart_flag_get(usart_periph, USART_FLAG_TC));
}
串口接受函数
void USARTx_IRQHandler(void )
{
if(RESET != usart_interrupt_flag_get(USARTx, USART_INT_FLAG_RBNE))
{
/* receive data */
value = (uint8_t)usart_data_receive(USARTx);
usart_interrupt_flag_clear(USARTx,USART_INT_FLAG_ERR_FERR);
}
}
附:
1.modbus rtu格式说明
功能码说明
功能码 | 说明 |
---|---|
03 | 读取输出寄存器 |
04 | 读取输入寄存器 |
06 | 写单个寄存器 |
10 | 写多个寄存器 |
CRC校验说明
modbus crc16为高位在后,低位在前
功能码 | 说明 |
---|---|
CRCL | 低位在前 |
CRCH | 高位在后 |
读操作
modbus读取数据采用功能码03或04,其中正常来说03读取输出寄存器数据,04读取输入寄存器数,也就是03读取设置参数等数据,04读取实时采集的数据。
项目 | Value | 位数 |
---|---|---|
通信地址 | 0~255 | 8位 |
功能码 | 03/04 | 8位 |
起始地址 | 0~65535 | 16位 |
寄存器个数 | 0~65535 | 16位 |
CRC校验 | 0~65535 | 16位 |
写操作
项目 | Value | 位数 |
---|---|---|
通信地址 | 0~255 | 8位 |
功能码 | 06 | 8位 |
起始地址 | 0~65535 | 16位 |
待写入的数据 | 0~65535 | 16位 |
CRC校验 | 0~65535 | 16位 |
2.GD32中断函数名及中断服务函数
项目 | 路径 |
---|---|
中断函数名及其优先级 | gd32f10x.h |
中断服务函数 | startup_gd32f10x_md.s |
版权声明:本文为CSDN博主「Little Studio」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_31227875/article/details/116981071
暂无评论