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

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

[复制链接]
abend 发布时间:2015-1-7 17:39
使用STM32 Nucleo-L053R8开发板,基于HAL库做开发,中断方式做串口收发数据,会出现数据丢失或者错误的情况,如下图:0 J. V: S4 [% z6 Q& a
232err.jpg & K* F% k) v4 s' L; N6 S, `
2 ~7 e+ G9 Y$ f9 P
后来收到了论坛做活动优惠购买的STM32 Nucleo_F072RB,这两者,F072是ARM Cortex-M0,内核,L053是ARM Cortex-M0+内核,但是因为我的代码是用兼容的HAL库写的,所以很容易就移植到了F072RB平台编译通过。下载到F072RB上运行发现,串口数据丢失或者错误的问题完全消失。" n+ e7 e3 W1 X1 r
请教了一位有ARM核MCU开发经验的朋友,朋友说中断方式操作串口最好使用FIFO。但是STM32的这两个MCU都没有串口FIFO,且这也解释不了为何F072运行正常,而L053运行出错。朋友再次指出查看一下时钟配置。
5 G- }2 F4 c' d( K9 j# i, u. V发现L053的程序代码中给串口配的时钟频率只有2.097Mhz,但是F072的达到了48Mhz。4 n- F5 X8 w. s/ d, E
2.097.jpg
+ r9 s  T+ R0 H5 G; F
, Y; l$ Y+ Z1 c9 H* h8 C1 s 48.jpg : q6 S6 B7 D5 {5 {

" s5 l1 h; e: g0 N. s9 h2 |重新配置L053的串口时钟为32Mhz,然后运行程序,串口数据丢失的现象消失。' a; H! {" B7 {

1 W8 B6 v4 E# E- N 32.jpg : [% W4 @) x' d( ~, }  E
相关时钟配置代码的代码:
5 @0 [$ h- @5 m5 L+ M0 Z5 g! Y  RCC_OscInitTypeDef RCC_OscInitStruct;
9 X8 x4 h( p% i: F+ j% h6 A: ^: E  RCC_ClkInitTypeDef RCC_ClkInitStruct;
* T) Y9 H$ d+ H" s" E( v  RCC_PeriphCLKInitTypeDef PeriphClkInit;& A0 S. D9 ]" k4 X* R

6 h, G- q- Q$ q  __PWR_CLK_ENABLE();
3 k6 ^6 E& E! a5 o4 ^$ ~& e0 M
$ s: M8 \- \4 l! |! ?  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
9 `2 f- p' F7 q1 J: ^/ o6 l# j& {. n8 Z8 S8 o4 y5 {+ ]6 T0 }* X
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
; p+ d( Q; E% Q6 ^' _0 Q) I  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
% J, h% i. ^7 U# a1 d  RCC_OscInitStruct.HSICalibrationValue = 16;
8 K; d# h9 ]4 r- M( g) Y$ X5 a  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;! c3 h( S- @0 U) X) k# E7 w% P
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;# o1 O7 X% }- I
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_4;
. V" U( v" {" u  H3 H  RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_2;

) K0 f& V2 ]0 P  p3 N7 @  HAL_RCC_OscConfig(&RCC_OscInitStruct);7 @  o) s1 P0 _% f: @2 w& J" l

. N$ K; {% S9 t' H* r& P& s  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;
& R  h7 S, m" y! k# z3 ?2 x  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
2 W# Q% J# o5 h: w* y  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
9 i! ^' Q$ E8 J4 q1 m  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
2 r, m  ^: f  I9 {" D+ h  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
0 V5 ?0 J+ G/ ?& [% F2 |  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);# ~9 ?# o. N3 X3 P" y9 Y! `
( w7 u2 u: a' p& ], }3 C! V
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_USART2;7 y9 m" d) w" }' q
  PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
( d4 l2 a3 H# F6 l5 n, A" B  l. ^  PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;

" k$ `0 E7 e" Z- K5 ^9 X# s) o; s  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);( E) G( M) I5 T2 h4 ]( s2 P& y

$ w6 m5 o; K- W; S  __SYSCFG_CLK_ENABLE();. I8 j- `& ^; |" U* i0 |
+ J! E; M. \0 v" n. ^
赞 收藏 评论16 发布时间:2015-1-7 17:39

举报

16个回答
abend 回答时间:2015-1-9 10:38:05
dsjsjf 发表于 2015-1-7 21:54
+ {. Q1 J  B0 M3 J! h9 u8 ?* s6 A时钟配置不对,串口数据当然有问题了

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

+ c" z1 @7 r. K, O  {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
我也出现了这个错误  但是编译可以进行,串口助手收不到数据(萌新提问)& K* G4 h& F5 F# T: B% X0 m1 E
12下一页

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版