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

【经验分享】如何用 LSE 校准 STM32F4 内部 RC 振荡器

[复制链接]
STMCU小助手 发布时间:2022-2-27 16:59
问题:% S2 {3 f( N+ k# B; n; `
此问题由客户提出,客户在使用 STM32F411 开发产品的时候,采用的是 HIS 作为主时钟,同时使用了UART 与其他 MCU 进行异步通信.( \! S5 T# C0 j
客户发现部分产品 UART 不能正常通信.
. J4 e9 e4 c% u, `2 k& Z
. G( ]  x7 `+ l2 T# f9 p. Q' r
; `0 k4 y' @: \, D调研:
( m" \; ?/ l; P: f* j3 @1. 通过使用示波器来测量 UART 的 TX 的波特率,发现误差较大,查看原理图和代码发现他们使用HIS 作为主时钟,且没有使用 PLL 来倍频.
4 Q$ T: I% m0 }, V. x" n) V; ^/ F2. 由于 UART 直接用 HIS 作为时钟源,所以考虑通过使用 LSE 校准 STM32F411 的 HIS 值来使得UART 波特率准确.. {1 D# t% q$ _9 ]1 C" o$ P/ R
3. 我们 STM32 官方提供了基于 STM32F0 的 HIS 校准方法 AN4067(基于 STM32Cube).其基本原理如& D0 N5 r( A( }  b* x0 ^2 s# h0 R
   下写的很清楚:9 N) _5 N# G! d9 O" z
$ i- \$ _+ i0 l+ O+ _0 I) }
0`12(DR191O%)J4$VDWMW{4.png
1 d  r: Q* Z, [/ e0 ~0 F! m# m  t; `+ N8 ?7 {0 |
7KYQ8${GZ2EH5NUJ@K89M.png
. P: T8 E8 I! _* E0 m
' x* E' P0 w' |9 F9 b# T0 D4. 所以我们将其移植到 STM32F4 上:
9 T/ E' r: p- S1 q   a. 替换 STM32F0HAL 为 STM32F4HAL* z! ?7 y" A+ v1 n9 O3 Q
   b. 修改工程器件相关的配置.- U; [* \; a) _! T% _, r1 N
   c. 去掉与 STM32F4 HIS 校准无关的文件,只保留 his.c/h& k% T% L) w+ K: o! Z0 C$ J8 ~
   d. 修改 main.c 的主程序,初始化校准前频率测试校准后频率测试.: w/ _: x6 E7 Y! }% i7 U3 s
     HSIFrequencyBeforeCalib 为校准前的频率值,可以在 IAR 的 Watch 窗口查看.5 u& Q, k2 G% _  E7 f
     HSIFrequencyAfterCalib 为校准后的频率值,可以在 IAR 的 Watch 窗口查看." Y6 _  P& X4 K: g6 D8 g5 A5 b4 l
   e. 定义使用 USE_REFERENCE_LSE 和__HSI2LSECALIBRATE_TEST__,使能使用LSE 校准 HIS 功能函数.
$ q& i8 m( b$ _
  1.    /* Private typedef -----------------------------------------------------------*/! ]- v9 M: @: R1 h; L: j7 u
  2.    /* Private define ------------------------------------------------------------*/
    + i; ?4 L: I* e4 d+ X
  3.    #ifdef USE_REFERENCE_LSE1 Z4 L8 A- ^/ Q( J- d
  4.    #define HSI_TIMx_COUNTER_PRESCALER ((uint32_t)0)
    0 E, H0 r5 P/ ^% x: p! U0 g/ |- S
  5.    /* The signal in input capture is divided by 8 */2 e9 X% m0 V" S9 s+ M2 N. j
  6.    #define HSI_TIMx_IC_DIVIDER TIM_ICPSC_DIV8
    - V  N# y7 U& @! w. y& J# `; d( t9 u
  7.    /* The LSE is divided by 8 => LSE/8 = 32768/8 = 4096 */. a5 W% I: i7 ~2 _: x/ l8 s9 k! K
  8.    #define REFERENCE_FREQUENCY ((uint32_t) 4096) /* The reference frequency
    6 A" a* X& {( Z- j; I7 k
  9.    value in Hz */
    6 T) C& V, m2 n% T% r: R
  10.    /* Number of measurements in the loop */9 x1 P1 [# O9 q" G
  11.    #define HSI_NUMBER_OF_LOOPS ((uint32_t)50)
    , G6 o- N% ?2 M8 ?
  12.    /* Connect LSE clock (through MCO) to TIMx Input Capture 1 */3 L' m% w. t6 v) R( D* B3 V) |! o
  13.    #ifdef __HSI2LSECALIBRATE_TEST__* b$ d' X3 S" I; Y! M0 z* u: y3 b5 w
  14.    #define HSI_Timer_ConnectInput() do { 6 W# G  Q* h2 x- s4 ~! x
  15.    HAL_TIMEx_RemapConfig(&TimHandle, TIM_TIM5_LSE);
    " B" U& A8 _3 b
  16.    } while(0)
    ) Q/ q& n6 V2 m- U7 S
  17.    #else" b5 W) |7 Z1 U' \3 g; k! S
  18.    #define HSI_Timer_ConnectInput() do {& B5 B) I/ b8 D
  19. 9 x6 s' [' q0 U! a

  20. ( U- e- |5 E- q4 x, J2 \  I
  21. HAL_RCC_MCOConfig(RCC_MCO, RCC_MCOSOURCE_LSE, RCC_MCO_DIV1);
    & p. A% C6 K" I2 \1 ~) R
  22. HAL_TIMEx_RemapConfig(&TimHandle, TIM_TIMx_MCO);
    3 a9 ^6 |: M3 I8 O9 {3 z
  23. } while(0)
    0 p. o8 ~9 O  S) X6 S; O
  24. #endif
复制代码
( [* a" t* t7 s& w- t$ c7 _8 H7 a
d.详细代码参考附件源码例程.# R# ?. |/ ~7 \! }* b/ }8 o6 f
+ e* G+ ?- K# p2 O; N$ p6 q
结论:
1 r8 {# w% T, W( v/ B1. STM32 MCU 内部高速时钟是可以通过外部提供的精确时钟源进行校准的.
3 {5 A  B, Q- L  n2. 我们提供一篇应用笔记和参考代码给客户演示如何校准 HIS,基于 STM32Cube 的良好的可移植行,很方便的从 STM32F0 移植到其他 STM32 产品上面.3 B! T4 C1 D, u0 M' B3 N
3. 如果客户在使用异步通信且没有使用 PLL 作为时钟源,建议在系统启动的时候增加校准代码来增强系统的容错能力." g7 O. p, i" l2 G* n  b: c  O+ q

9 E% x, N' z- c
; ^1 F4 {2 b3 a3 y6 G
赞 收藏 评论0 发布时间:2022-2-27 16:59

举报

0个回答

所属标签

相似技术帖

官网相关资源

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