GD32串口通信注意事项

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

生成海报
点赞 0

Little Studio

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

Lin总线通信在STM32作为主机代码以及从机程序

距离上次做资料准备已经过去六天了。最近在学车,上周末就没有开电脑。这周开始进行了Lin通信的代码整理,目前是可以正常通信的了,采用的是增强型校验方式。后期再进一步跟进研究。。。更新一博,留

GD32精确延时和时间戳

目前网上很多都是利用systick频繁产生中断进行计数,然后实现延时。我写的这写接口,systick产生中断的频率很低,cpu效率很高。而且同时实现了毫秒延时,微秒延时,以及

趣聊51之串口通信(概念篇)

对于刚刚接触单片机的同学们来说,串口通信似乎是一个神秘感十足的东西,笔者在刚刚开始学习51单片机时,读的是郭天祥先生的那本著名的《新概念51单片机教程》,贼厚的一本书,但是等