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

跳坑记——F407串口波特率总是偏小

[复制链接]
power568 发布时间:2019-10-16 16:06
       好久没搞407了,最近有项目又要使用407,移植了网上的库版本程序( MCD Application Team @version V1.0.0),看起来——系统能够运行,LED闪灯频率也正确。但是配置串口的时候,波特率总是比预计的小3倍左右。
* G8 b) d( U& K9 x# H% R7 ^5 n  X       串口配置如下:! v6 y6 H) q& P; g" P2 @

  1. 2 }3 e' u0 |0 [
  2. void DriveUartOneInit(void)0 ?1 J* x8 o# R# }6 X
  3. {( Y3 ?  ], u' H4 l# {8 h
  4.         GPIO_InitTypeDef        gpioInit;
    . X, X' p# h! i9 C+ R
  5.         USART_InitTypeDef        usartInit;
    ) [' `* J# f" X4 x5 x% ~# Y

  6. $ K& s" _9 t. O2 k  B
  7.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1);) g7 h4 ?' Z* |. R: }& Y+ ~+ U
  8.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);) K# k( p* ]6 ~; i# x7 t6 u& B
  9.        
    1 }& r4 a" L9 q& g8 @/ }3 B
  10.         GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);" L2 }( N6 T6 c
  11.         GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);4 T9 ~; m) m- j; w, Y- n, e

  12. 9 ]7 z, `) @1 \
  13.   gpioInit.GPIO_Speed = GPIO_Speed_25MHz;
    ' ]" I- Z8 r9 O8 x1 _9 [9 d  H
  14.   gpioInit.GPIO_PuPd = GPIO_PuPd_NOPULL;! H0 Z/ S3 |+ u9 ]5 D
  15.   gpioInit.GPIO_OType = GPIO_OType_PP;
    ! Z9 G) o9 K( `* @
  16.   gpioInit.GPIO_Mode = GPIO_Mode_AF;- ^, T4 L  I7 l1 x5 t
  17. - H$ m' V. J8 C8 ^% f& i' d/ P# h
  18.         //// txd0 \7 z4 a- t$ j
  19.   gpioInit.GPIO_Pin = GPIO_Pin_9; * l- f+ T8 {& p  w$ A2 C8 r
  20.   GPIO_Init(GPIOA, &gpioInit);
    & h: m! C& G* L' M3 J4 m
  21.   & [" P/ q* y. l* J) ^$ `3 Q- L2 c
  22.   //// rxd
    1 Y5 s6 U, Q7 V2 u2 F+ n" U) N4 x! J
  23.   gpioInit.GPIO_Pin = GPIO_Pin_10 ;3 U% C: N& p( q
  24.   GPIO_Init(GPIOA, &gpioInit);
    8 `! a0 z' w0 t! M( Y$ I
  25.   , `& @4 F+ n! P$ a# |" V
  26.   //USART 初始化设置
    - Q0 \& O7 m$ M; \* O6 l/ O
  27.         usartInit.USART_BaudRate = 115200;
    , Q; i1 X& M4 D- L; M
  28.         usartInit.USART_WordLength = USART_WordLength_8b;
    ! d9 X5 j) {. t' L: w; b
  29.         usartInit.USART_StopBits = USART_StopBits_1;4 d0 b4 I$ j- v& E$ Y! m
  30.         usartInit.USART_Parity = USART_Parity_No;
    3 e6 }5 k4 h+ M+ k3 K1 C0 w/ i
  31.         usartInit.USART_HardwareFlowControl = USART_HardwareFlowControl_None;2 ^# P! O' ~! u6 B+ p+ O: q
  32.         usartInit.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    8 \+ `% U- B7 j: j* L' Y  f
  33.   USART_Init(URT_ONE_NUM, &usartInit);# J: D, S- y6 ]' T4 Q
  34. }
复制代码
      使用MCO输出验证了时钟与自己预设的一样,确定MCU整体的时钟配置是正确的。
! x2 o3 D! o, C5 P( K       那就是怀疑串口配置相关的时钟有问题,调试跟踪发现,USART_Init调用了系统时钟相关的函数RCC_GetClocksFreq,这个函数会调用外部晶振HSE_VALUE宏定义,但是这个值不是我预设的值。系统调用的是stm32f4xx.h的HSE_VALUE,而我定义的是在system_stm32f4xx.c文件内,但是文件system_stm32f4xx.c先包含了stm32f4xx.h,故文件system_stm32f4xx.c内的定义无效,更改定义后波特率正常。; k% a* |& H  r4 J# w9 ~

: ^8 j6 ]! c% Z1 e       !!! 所以写程序的时候还需要更加小心谨慎,要不然自己挖的坑还得自己找自己填......( V" r. ~% ?: G6 |& e
4 t; i" j. C8 \9 X9 o6 Z8 E* M
赞 收藏 评论6 发布时间:2019-10-16 16:06

举报

6个回答
奏奏奏 回答时间:2019-10-16 16:49:51
为什么不直接用 STM32CubeMX 配置。省了这些麻烦。
radio2radio 回答时间:2019-10-16 17:48:56
首选官方推荐的工具,且更新至最新版本,出这种问题的机会小很多。
momo1235678 回答时间:2019-10-16 22:59:13
多谢分享
mylovemcu 回答时间:2019-10-17 08:26:36
那你是改底层了?改完底层一个麻烦的问题就是重装软件或者在其他电脑上重新编译还是会出错,因为底层还是原来那个
power568 回答时间:2019-10-31 10:12:23
奏奏奏 发表于 2019-10-16 16:49
! E  j8 s: W& H  `& h, d2 B9 k为什么不直接用 STM32CubeMX 配置。省了这些麻烦。
8 V( q/ [* |7 ~$ I& w( q7 Y
这个工具生成,执行文件空间太大了,不喜欢。。。
power568 回答时间:2019-10-31 10:13:29
mylovemcu 发表于 2019-10-17 08:26
1 c/ [# b$ X- g4 k8 C那你是改底层了?改完底层一个麻烦的问题就是重装软件或者在其他电脑上重新编译还是会出错,因为底层还是原 ...

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