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

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

[复制链接]
abend 发布时间:2015-1-7 17:39
使用STM32 Nucleo-L053R8开发板,基于HAL库做开发,中断方式做串口收发数据,会出现数据丢失或者错误的情况,如下图:* V! A; w  C, B
232err.jpg
! c1 F% O5 I/ Z7 _* W7 o, B2 h4 z$ G/ g$ Z/ a
后来收到了论坛做活动优惠购买的STM32 Nucleo_F072RB,这两者,F072是ARM Cortex-M0,内核,L053是ARM Cortex-M0+内核,但是因为我的代码是用兼容的HAL库写的,所以很容易就移植到了F072RB平台编译通过。下载到F072RB上运行发现,串口数据丢失或者错误的问题完全消失。% A# b" T# J7 L- X" x  O6 R
请教了一位有ARM核MCU开发经验的朋友,朋友说中断方式操作串口最好使用FIFO。但是STM32的这两个MCU都没有串口FIFO,且这也解释不了为何F072运行正常,而L053运行出错。朋友再次指出查看一下时钟配置。. J  l% t! h. X6 y$ G" m
发现L053的程序代码中给串口配的时钟频率只有2.097Mhz,但是F072的达到了48Mhz。" ~( I' U: n2 W/ y2 t1 w; s6 R
2.097.jpg
5 i! \$ C/ k8 T, E9 G; K/ |. [, K: r/ ~6 x" Y
48.jpg # G5 q, R! i+ R4 {. q
/ Z  w6 Q- c% |2 E! [  A  O
重新配置L053的串口时钟为32Mhz,然后运行程序,串口数据丢失的现象消失。
* y4 P4 m: @7 U1 _2 \
0 G/ Q1 m( c# X8 o  m1 F 32.jpg
/ d1 d6 r" I$ ?, ]. C5 e相关时钟配置代码的代码:
$ b( \& {( D! D4 ^6 r  RCC_OscInitTypeDef RCC_OscInitStruct;
1 Y1 e1 f5 r: w5 z5 U  RCC_ClkInitTypeDef RCC_ClkInitStruct;
, X% ?* r( f! A6 ]6 c1 m8 r: D2 C  RCC_PeriphCLKInitTypeDef PeriphClkInit;7 U" X0 A2 a2 y) b9 p

6 [! b5 Z6 }  t5 U& _' z  __PWR_CLK_ENABLE();6 X7 a1 s0 J9 m9 I$ L

, k3 F+ q- w7 k! d; G, }' @! Y  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);" f6 G4 u2 c1 N! F( k/ z

3 r1 n0 n2 t6 K3 S$ Z; Y  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;9 N( f% x, V* ~1 _( e
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
: Q4 i4 Q+ U$ T, Z9 B  RCC_OscInitStruct.HSICalibrationValue = 16;+ r5 K/ b+ w  {9 g9 [
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
; P* `3 D& a7 q$ I2 Z  H  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
' w7 X- ~* S# M5 Y' W  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_4;1 e6 d- d8 O3 c7 |
  RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_2;

8 @' s5 T  J. b/ U) V  HAL_RCC_OscConfig(&RCC_OscInitStruct);' v( y& z) O( l  x. H9 b

! u3 ^3 e; ~; U( \( d' P( S9 o, H  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;
4 ~) y- H8 f. Z- n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;" E- o2 J3 _* A3 |
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
5 ]8 S! Z8 u* P9 Z* d  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;# B, V$ M4 B; ^6 q2 ^; d/ D; ~
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;; C) Q/ p) ]  L& }) Y4 |
  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);9 g: v7 r7 q( q) w
% o" a0 E1 W7 S- m: Y5 o, i
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_USART2;- _- b- G( Y/ c) H% u* ]3 B
  PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;) W* R0 W" C8 j; _# I$ u
  PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;
1 c* M; y8 I# g/ R$ }/ w4 r
  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);, C) J& x$ H  L3 W6 D( C: f$ D, u

- L+ _/ J  X* Q9 S$ m% d* y  __SYSCFG_CLK_ENABLE();* n8 f# V# a$ u, c3 v8 ~4 W2 r

7 j5 o/ @* b8 \5 `% d; E
赞 收藏 评论16 发布时间:2015-1-7 17:39

举报

16个回答
abend 回答时间:2015-1-9 10:38:05
dsjsjf 发表于 2015-1-7 21:54
  g4 k/ e& W: o! _9 T; X时钟配置不对,串口数据当然有问题了

% I7 o3 h$ u) x$ p, k" _1 x. }不是时钟配置不对,是时钟频率相对于自己代码中串口的频繁操作相对偏慢了。我在代码中用中断方式,只要串口有一个字符进来,就立刻产生一个中断。
6 A9 j' Y& I8 S3 B8 i& J) v8 N之前配的那个串口时钟频率,其实用来实现很多坛友们发帖分享的什么串口输出hello world之类,不会有任何问题。
xioahuihui 回答时间:2019-3-14 10:44:52
中北小灰灰one 发表于 2019-3-14 09:35& z  S( J7 i, D, x5 \" ^; h% G7 e/ D
我的stm32f401因为开启USB所以APB1的时钟只有30MHz,PC接收串口数据全部都是错误的。不启用USB情况下,给APB ...
9 z5 u. f( I( E
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
我也出现了这个错误  但是编译可以进行,串口助手收不到数据(萌新提问)
( t  B# j9 j6 B
12下一页

所属标签

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