[APM32F0] APM32F072串口波特率如何跑到3M以上?

[复制链接]
4346|38
 楼主| JunKook 发表于 2023-7-29 17:01 | 显示全部楼层 |阅读模式
最近有客户在使用极海APM32F072CBT6时,遇到串口波特率不能配置到3M以上的问题,因为在数据手册中有明确指示072的串口波特率最高可以配置到6M。客户使用极海当前SDK例程库(V1.7)串口波特率最多只能配置到3M,这是怎么回事呢?APM32F072的串口波特率无法配置到更高的速率吗?
答案当然是否定的。经过我们内测试验,发现这个问题是由于当前SDK例程库(V1.7)的底层软件配置有缺失,当前的例程库在配置USART_Config这个函数底层的时候,其配置方式只能讲串口波特率配置到3M,如下所示:
  1. void USART_Config(USART_T* uart, USART_Config_T* configStruct)
  2. {
  3.     uint32_t temp, fCLK, intDiv, fractionalDiv;

  4.     /** Disable USART */
  5.     uart->CTRL1_B.UEN = 0x00;

  6.     /** WLS, PCEN, TXEN, RXEN */
  7.     temp = uart->CTRL1;
  8.     temp &= 0xE9F3;
  9.     temp |= (uint32_t)configStruct->mode | \
  10.             (uint32_t)configStruct->parity | \
  11.             (uint32_t)configStruct->wordLength;
  12.     uart->CTRL1 = temp;

  13.     /** STOP bits */
  14.     temp = uart->CTRL2;
  15.     temp &= 0xCFFF;
  16.     temp |= configStruct->stopBits;
  17.     uart->CTRL2 = temp;

  18.     /** Hardware Flow Control */
  19.     temp = uart->CTRL3;
  20.     temp &= 0xFCFF;
  21.     temp |= (uint32_t)configStruct->hardwareFlowCtrl;
  22.     uart->CTRL3 = temp;

  23.     if (uart == USART1)
  24.     {
  25.         fCLK = RCM_ReadUSART1CLKFreq();
  26.     }
  27.     else if (uart == USART2)
  28.     {
  29.         fCLK = RCM_ReadUSART2CLKFreq();
  30.     }
  31.     else
  32.     {
  33.         fCLK = RCM_ReadPCLKFreq();
  34.     }

  35.     intDiv = ((25 * fCLK) / (4 * (configStruct->baudRate)));
  36.     temp = (intDiv / 100) << 4;
  37.     fractionalDiv = intDiv - (100 * (temp >> 4));
  38.     temp |= ((((fractionalDiv * 16) + 50) / 100)) & ((uint8_t)0x0F);

  39.     uart->BR = temp;
  40. }
通过查阅《APM32F072x8xB用户手册 V1.6》,第22.4.4.5章节,有说明串口采样率可配置为波特率的8倍和16倍,如下图所示,以上配置是默认使用16倍采样率来配置的,如果系统时钟为48M,那么串口波特率最高就只能配置到48M/16=3M,是无法配置到更高波特率的。
采样率.png
那么要想配置到更高波特率,需要对此配置软件做哪些修改呢?
显然这里我们需要使用8倍的采样率,才能配置更高的波特率,因为48M/8=6M。那么USART_Config的底层驱动软件需要更改为:
  1. void USART_Config(USART_T* uart, USART_Config_T* configStruct)
  2. {
  3.     uint32_t temp, fCLK, intDiv, fractionalDiv;
  4.         uint32_t divider = 0, tmpreg = 0;
  5.        

  6.     /** Disable USART */
  7.     uart->CTRL1_B.UEN = 0x00;

  8.     /** WLS, PCEN, TXEN, RXEN */
  9.     temp = uart->CTRL1;
  10.     temp &= 0xE9F3;
  11.     temp |= (uint32_t)configStruct->mode | \
  12.             (uint32_t)configStruct->parity | \
  13.             (uint32_t)configStruct->wordLength;
  14.     uart->CTRL1 = temp;

  15.     /** STOP bits */
  16.     temp = uart->CTRL2;
  17.     temp &= 0xCFFF;
  18.     temp |= configStruct->stopBits;
  19.     uart->CTRL2 = temp;

  20.     /** Hardware Flow Control */
  21.     temp = uart->CTRL3;
  22.     temp &= 0xFCFF;
  23.     temp |= (uint32_t)configStruct->hardwareFlowCtrl;
  24.     uart->CTRL3 = temp;

  25.     if (uart == USART1)
  26.     {
  27.         fCLK=RCM_ReadUSART1CLKFreq();
  28.     }
  29.     else if (uart == USART2)
  30.     {
  31.         fCLK=RCM_ReadUSART2CLKFreq();
  32.     }
  33.     else
  34.     {
  35.         fCLK=RCM_ReadPCLKFreq();
  36.     }

  37.        
  38.         /* Determine the integer part */
  39.         //if ((USARTx->CR1 & USART_CR1_OVER8) != 0)
  40.         if (uart->CTRL1_B.OSMCFG != RESET)/*!<Ovensampling by 8*/
  41.         {
  42.         /* (divider * 10) computing in case Oversampling mode is 8 Samples */
  43.         divider = (uint32_t)((2 * fCLK) / (configStruct->baudRate));
  44.         tmpreg  = (uint32_t)((2 * fCLK) % (configStruct->baudRate));
  45.         }
  46.         else /* if ((USARTx->CR1 & CR1_OVER8_Set) == 0) */
  47.         {
  48.         /* (divider * 10) computing in case Oversampling mode is 16 Samples */
  49.         divider = (uint32_t)((fCLK) / (configStruct->baudRate));
  50.         tmpreg  = (uint32_t)((fCLK) % (configStruct->baudRate));
  51.         }

  52.         /* round the divider : if fractional part i greater than 0.5 increment divider */
  53.         if (tmpreg >=  (configStruct->baudRate) / 2)
  54.         {
  55.         divider++;
  56.         }

  57.         /* Implement the divider in case Oversampling mode is 8 Samples */
  58.         //if ((USARTx->CR1 & USART_CR1_OVER8) != 0)
  59.         if (uart->CTRL1_B.OSMCFG != RESET)
  60.         {
  61.         /* get the LSB of divider and shift it to the right by 1 bit */
  62.         tmpreg = (divider & (uint16_t)0x000F) >> 1;

  63.         /* update the divider value */
  64.         divider = (divider & (uint16_t)0xFFF0) | tmpreg;
  65.         }

  66.         uart->BR = (uint16_t)divider;
  67. }
这里我们就把8配采样率的配置加进来了,但是当我们运行的时候我们却发现了另外一个问题,那就是串口波特率配置为4M和6M都是没问题的,配置为5M的时候无法正常通讯。这又是怎么一回事呢?原来手册中也给了我们提醒,当使用8倍采样率的时候,可配置更高的通讯速度,但是时钟容忍度较小。因为48可以被4和6整除,但是不能被5整除,这就会造成在串口通讯过程中,串口波特率的时钟周期存在有较大误差,当我们把系统时钟更改为5M*8=40M时,5M的波特率通讯也随之正常。
以上就是如何配置APM32F072的软件底层来实现高速串口波特率通讯的方法,不过极海在下一版SDK中会将此配置方式更新进去,届时请各位工程师留意下载最新的SDK例程库。

评论

写的不错  发表于 2023-11-6 14:02
柔柔弱弱r 发表于 2023-7-29 20:20 | 显示全部楼层
albertaabbot 发表于 2023-8-4 15:07 | 显示全部楼层
使用SPI接口。               
pl202 发表于 2023-8-4 15:30 | 显示全部楼层
要确保芯片的串口硬件支持更高速的波特率。
cashrwood 发表于 2023-8-4 15:42 | 显示全部楼层
串口波特率自适应是怎么做的?              
loutin 发表于 2023-8-4 15:51 | 显示全部楼层
当将串口波特率提高到非常高的速度时,可能会遇到一些挑战,比如信号失真、噪声等问题。
rosemoore 发表于 2023-8-4 16:03 | 显示全部楼层
在一般情况下,串口的波特率是不能超过设备的最大波特率的。
robertesth 发表于 2023-8-4 16:13 | 显示全部楼层
高速传输需要良好的信号完整性。使用质量良好的串口线缆,并确保线缆长度不超过规定的最大长度。
jtracy3 发表于 2023-8-4 16:22 | 显示全部楼层
高速波特率对硬件要求更高              
wwppd 发表于 2023-8-4 16:30 | 显示全部楼层
在设计和布局电路板时,需要注意信号完整性和EMC问题,以确保稳定的通信。
yeates333 发表于 2023-8-4 16:41 | 显示全部楼层
串口波特率的实现依赖于硬件               
youtome 发表于 2023-8-4 16:49 | 显示全部楼层
可以使用串口调试工具等进行调试和测试,确保高速数据传输的稳定性和正确性。
linfelix 发表于 2023-8-4 17:04 | 显示全部楼层
串口实验时波特率怎么调才合适?              
jackcat 发表于 2023-8-4 17:19 | 显示全部楼层
可以先使用较低的波特率进行通信,逐步增加波特率,直到达到 3M 以上。
pixhw 发表于 2023-8-4 17:27 | 显示全部楼层
需要使用特殊的通信协议来实现超高波特率的通信。
louliana 发表于 2023-8-4 17:35 | 显示全部楼层
可以使用超高速的RS-485通信协议来实现3M以上的波特率。
backlugin 发表于 2023-8-4 17:42 | 显示全部楼层
请参考芯片的数据手册或技术规格以了解其最大支持速度。
iyoum 发表于 2023-8-4 17:50 | 显示全部楼层
串口通信的参数如何设置              
janewood 发表于 2023-8-4 17:59 | 显示全部楼层
确保你的操作系统和串口驱动程序支持更高的波特率。
usysm 发表于 2023-8-4 18:06 | 显示全部楼层
数据格式对波特率的影响很大              
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:极海半导体
简介:珠海极海半导体有限公司是一家致力于开发工业级/车规级微控制器、模拟与混合信号IC及系统级芯片的集成电路设计型企业。极海团队拥有20年集成电路设计经验和嵌入式系统开发能力,可为客户提供核心可靠的芯片产品及方案,实现准确感应、安全传输和实时控制,助力客户在智慧家居、高端消费电子、工业控制、汽车电子、智慧能源以及通信设施等领域的拓展创新。

15

主题

55

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部