GD32F350.串口速率问题

 在最近使用GD32F350的时候需要将串口速率配置到4M并且是TTL电平下使用,查看数据手册发现当时钟频率为108MHz,过采样为8,最高速度可达6.75MBits/s,因此4M速率是可以达到的。

测试条件:GD32F350与STM32F103在4M下单字节通讯
问题现象:串口误码严重

最开始排查是否是传输线过长导致,缩短线距到5CM,问题没有得到解决
怀疑STM32F103这边问题,用两个STM32在4M下通讯完全没有误码现象

 问题指向GD32F350,串口通过总线APB2时钟来配置速率,根据需求的波特率、过采样值和外部时钟计算得出波特率分频系数,这是一个16位的数字,包含12位整数部分和4位小数部分。波特率发生器使用这两部分组合所得的数值来确定波特率。由于具有小数部分的波特率分频系数,将使USART能够产生所有标准波特率 去配置串口整数寄存器和小数寄存器。

计算式
USARTDIV= PCLK / 过采样值 × Baud Rate

 时钟树配置为:采用外部8M时钟经PLL倍频后产生108M主频,总线APB2默认最高54M,
查看发现4M串口速率不是54M的整数倍,分频系数必然产生小数部分;怀疑会导致波特率不准。

改进措施:更改主频到96M,二分频产生APB2时钟48M,满足整数倍关系。

再次测试没有出现误码情况。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
GD32F350是一款基于ARM Cortex-M3内核的微控制器,可以通过其内置的串口模块实现串口通讯。以下是实现串口通讯的基本步骤: 1. 确定串口波特率、数据位、停止位和校验位等参数,并根据需要进行初始化配置。 2. 使能串口模块。 3. 使用串口发送数据:将需要发送的数据写入发送缓冲区,等待发送完成中断或者轮询发送完成标志位。 4. 使用串口接收数据:通过中断或者轮询方式,检查接收缓冲区是否有新数据到达,如果有则读取并处理。 下面是一个简单的示例代码,演示如何在GD32F350上实现串口通讯: ```c #include "gd32f3x0.h" void usart_config(void) { /* 使能USART1时钟 */ rcu_periph_clock_enable(RCU_USART1); /* 配置USART1 GPIO 引脚 */ gpio_af_set(GPIOB, GPIO_AF_7, GPIO_PIN_6); gpio_af_set(GPIOB, GPIO_AF_7, GPIO_PIN_7); gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_6); gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_7); gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6); gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7); /* 配置USART1参数:波特率115200,8数据位,无校验位,1停止位 */ usart_baudrate_set(USART1, 115200U); usart_word_length_set(USART1, USART_WL_8BIT); usart_stop_bit_set(USART1, USART_STB_1BIT); usart_parity_config(USART1, USART_PM_NONE); usart_hardware_flow_rts_config(USART1, USART_RTS_DISABLE); usart_hardware_flow_cts_config(USART1, USART_CTS_DISABLE); /* 使能USART1 */ usart_enable(USART1); } void usart_send_byte(uint8_t data) { /* 等待发送缓冲区为空 */ while (usart_flag_get(USART1, USART_FLAG_TBE) == RESET); /* 将数据写入发送缓冲区 */ usart_data_transmit(USART1, data); } uint8_t usart_receive_byte(void) { /* 等待接收缓冲区非空 */ while (usart_flag_get(USART1, USART_FLAG_RBNE) == RESET); /* 读取接收缓冲区数据 */ return usart_data_receive(USART1); } int main(void) { uint8_t data; /* 配置USART1 */ usart_config(); while (1) { /* 发送数据 */ usart_send_byte('H'); usart_send_byte('e'); usart_send_byte('l'); usart_send_byte('l'); usart_send_byte('o'); usart_send_byte('\r'); usart_send_byte('\n'); /* 接收数据 */ data = usart_receive_byte(); } } ``` 在这个示例代码中,我们使用USART1模块实现串口通讯,并且将波特率设置为115200,数据位为8,无校验位,停止位为1。在main函数中,我们通过usart_send_byte函数向串口发送数据,并通过usart_receive_byte函数接收数据。注意,在发送数据之前要等待发送缓冲区为空,在接收数据之前要等待接收缓冲区非空。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mapoplus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值