打印
[其他ST产品]

时钟频率引起STM32串口数据错误

[复制链接]
477|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
duo点|  楼主 | 2023-6-13 11:00 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
使用STM32 Nucleo-L053R8开发板,基于HAL库做开发,中断方式做串口收发数据,会出现数据丢失或者错误的情况,如下图:

后来收到了论坛做活动优惠购买的STM32 Nucleo_F072RB,这两者,F072是ARM Cortex-M0,内核,L053是ARM Cortex-M0+内核,但是因为我的代码是用兼容的HAL库写的,所以很容易就移植到了F072RB平台编译通过。下载到F072RB上运行发现,串口数据丢失或者错误的问题完全消失。
请教了一位有ARM核MCU开发经验的朋友,朋友说中断方式操作串口最好使用FIFO。但是STM32的这两个MCU都没有串口FIFO,且这也解释不了为何F072运行正常,而L053运行出错。朋友再次指出查看一下时钟配置。
发现L053的程序代码中给串口配的时钟频率只有2.097Mhz,但是F072的达到了48Mhz。

相关时钟配置代码的代码:

view plaincopy to clipboardprint?

  • RCC_OscInitTypeDef RCC_OscInitStruct;  
  •   
  •    RCC_ClkInitTypeDef RCC_ClkInitStruct;  
  •   
  •    RCC_PeriphCLKInitTypeDef PeriphClkInit;  
  •   
  •   
  •    __PWR_CLK_ENABLE();  
  •   
  •   
  •    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);  
  •   
  •   
  •    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;  
  •   
  •    RCC_OscInitStruct.HSIState = RCC_HSI_ON;  
  •   
  •    RCC_OscInitStruct.HSICalibrationValue = 16;  
  •   
  •    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;  
  •   
  •      
  • RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;  
  •   
  •    RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_4;  
  •   
  •    RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_2;  
  •   
  •    HAL_RCC_OscConfig(&RCC_OscInitStruct);  
  •   
  •   
  •    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;  
  •   
  •    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;  
  •   
  •    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;  
  •   
  •    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;  
  •   
  •    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;  
  •   
  •    HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);  
  •   
  •   
  • PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_USART2;  
  •   
  •      
  • PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;  
  •   
  •    PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;  
  •   
  •    HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);  
  •   
  •   
  •    __SYSCFG_CLK_ENABLE();  


使用特权

评论回复
沙发
V853| | 2023-6-13 15:34 | 只看该作者
串口的时钟配置太低了?

使用特权

评论回复
板凳
天天向善| | 2023-6-13 15:35 | 只看该作者
这个2.097Mhz是怎么配出来的?

使用特权

评论回复
地板
软核硬核| | 2023-6-13 15:35 | 只看该作者
串口丢包的可能性非常小。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

440

主题

1669

帖子

1

粉丝