你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
abend 发布时间:2015-1-7 17:39
使用STM32 Nucleo-L053R8开发板,基于HAL库做开发,中断方式做串口收发数据,会出现数据丢失或者错误的情况,如下图:
232err.jpg

后来收到了论坛做活动优惠购买的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。
2.097.jpg

48.jpg

重新配置L053的串口时钟为32Mhz,然后运行程序,串口数据丢失的现象消失。

32.jpg
相关时钟配置代码的代码:
  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();

收藏 评论16 发布时间:2015-1-7 17:39

举报

16个回答
abend 回答时间:2015-1-9 10:38:05
dsjsjf 发表于 2015-1-7 21:54
时钟配置不对,串口数据当然有问题了

不是时钟配置不对,是时钟频率相对于自己代码中串口的频繁操作相对偏慢了。我在代码中用中断方式,只要串口有一个字符进来,就立刻产生一个中断。
之前配的那个串口时钟频率,其实用来实现很多坛友们发帖分享的什么串口输出hello world之类,不会有任何问题。
xioahuihui 回答时间:2019-3-14 10:44:52
中北小灰灰one 发表于 2019-3-14 09:35
我的stm32f401因为开启USB所以APB1的时钟只有30MHz,PC接收串口数据全部都是错误的。不启用USB情况下,给APB ...

STM32F401 USB与USART不能同时使用。
xioahuihui 回答时间:2019-3-14 09:35:49
我的stm32f401因为开启USB所以APB1的时钟只有30MHz,PC接收串口数据全部都是错误的。不启用USB情况下,给APB1配置48MHz串口正常。
guomenhaolaogon 回答时间:2015-1-7 18:10:03
这个得多注意下 了
台湾华瑞 回答时间:2015-1-7 18:44:47
这么多代码,
埃斯提爱慕 回答时间:2015-1-7 21:54:53
提示: 作者被禁止或删除 内容自动屏蔽
wamcncn 回答时间:2015-1-8 13:54:17
两个板子用的不一样,移值的时候要注意时钟配置
zhaofei1 回答时间:2015-1-8 14:37:22
学习了啊、、
flintlovesam 回答时间:2015-1-8 14:59:56
回一个  哈哈
abend 回答时间:2015-1-9 10:31:51
哎 写原创技术文章没人理
万里-363223 回答时间:2015-1-10 09:11:17
这个问题值得注意..........
黄小狼 回答时间:2015-1-10 09:58:14
嘿嘿,以前有也遇到时钟不对造成的丢数问题
大秦正声 回答时间:2015-1-10 10:19:14
不错的经验
w453509596 回答时间:2015-1-10 12:04:42
学习了!!!!
啊蕾蕾 回答时间:2017-9-7 19:36:18
我也出现了这个错误  但是编译可以进行,串口助手收不到数据(萌新提问)
12下一页

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版