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

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

[复制链接]
STMCU小助手 发布时间:2022-2-27 16:59
问题:
* T! L3 {0 ^5 L: H" ]此问题由客户提出,客户在使用 STM32F411 开发产品的时候,采用的是 HIS 作为主时钟,同时使用了UART 与其他 MCU 进行异步通信.
8 p0 o2 m8 [6 B9 R+ s) r, g* h客户发现部分产品 UART 不能正常通信.9 ]+ w; g2 j# k8 `  r1 \

% T% T9 w9 K7 O; N1 ^0 K" \1 M2 Z0 _2 {" M& F9 V, C* P! M- Q
调研:6 Z# k9 m* J6 z
1. 通过使用示波器来测量 UART 的 TX 的波特率,发现误差较大,查看原理图和代码发现他们使用HIS 作为主时钟,且没有使用 PLL 来倍频.* v) d8 f' J* A6 ^. m8 S7 T$ X
2. 由于 UART 直接用 HIS 作为时钟源,所以考虑通过使用 LSE 校准 STM32F411 的 HIS 值来使得UART 波特率准确.: @$ ^+ R5 `0 D- ?
3. 我们 STM32 官方提供了基于 STM32F0 的 HIS 校准方法 AN4067(基于 STM32Cube).其基本原理如
8 V0 v' e0 t- q   下写的很清楚:& U6 [: j$ @5 N8 V

. n; s3 N5 w3 e 0`12(DR191O%)J4$VDWMW{4.png 6 v7 F7 ]; T1 P9 N8 D$ Y
8 O& L9 }6 Y! h' ?$ C1 Y  {. s5 g
7KYQ8${GZ2EH5NUJ@K89M.png # L5 Z, H# ?+ ?6 y4 d1 U* S

; @5 N, n4 a! j5 ^6 i4. 所以我们将其移植到 STM32F4 上:) Z; p% V, L, C3 ?1 w; x
   a. 替换 STM32F0HAL 为 STM32F4HAL, [0 }' i  G! }+ x/ a
   b. 修改工程器件相关的配置.
! T6 X! V( p0 f* f; r   c. 去掉与 STM32F4 HIS 校准无关的文件,只保留 his.c/h
3 A- Q9 u( @  E. r# I   d. 修改 main.c 的主程序,初始化校准前频率测试校准后频率测试.! ?% t/ F. B( E7 Y) y' M
     HSIFrequencyBeforeCalib 为校准前的频率值,可以在 IAR 的 Watch 窗口查看.+ Z. M% V% q9 W5 d
     HSIFrequencyAfterCalib 为校准后的频率值,可以在 IAR 的 Watch 窗口查看.0 ?5 T/ e0 A6 w* @0 O; h' [
   e. 定义使用 USE_REFERENCE_LSE 和__HSI2LSECALIBRATE_TEST__,使能使用LSE 校准 HIS 功能函数.$ |( F+ T: Y% t+ U
  1.    /* Private typedef -----------------------------------------------------------*/  B1 F# ?6 Q5 G, v
  2.    /* Private define ------------------------------------------------------------*/3 U, {7 ]5 I( H/ b$ o2 `
  3.    #ifdef USE_REFERENCE_LSE  K8 M& ^  u% _8 U/ s; K$ h
  4.    #define HSI_TIMx_COUNTER_PRESCALER ((uint32_t)0), J' @& f) \; s- `; m" z9 l
  5.    /* The signal in input capture is divided by 8 */! j$ s8 M, c( V2 Y( |2 A
  6.    #define HSI_TIMx_IC_DIVIDER TIM_ICPSC_DIV8& O) t  f4 Z. @+ ?8 N* N, X
  7.    /* The LSE is divided by 8 => LSE/8 = 32768/8 = 4096 */0 l* y# \: y4 @$ e1 s5 w
  8.    #define REFERENCE_FREQUENCY ((uint32_t) 4096) /* The reference frequency
    $ U3 A6 P/ D3 |. P* c
  9.    value in Hz */3 y+ |2 n) J6 f
  10.    /* Number of measurements in the loop */" z  }  t- c# C% @! ~+ v
  11.    #define HSI_NUMBER_OF_LOOPS ((uint32_t)50)( g7 F; y1 X" |/ O% C' ^" J- e5 ]
  12.    /* Connect LSE clock (through MCO) to TIMx Input Capture 1 */
    ) i/ w6 q5 D& o& w( Z
  13.    #ifdef __HSI2LSECALIBRATE_TEST__' J- c( x' T- v/ R
  14.    #define HSI_Timer_ConnectInput() do { ; D! `! @  e) X" }% y! o" ]
  15.    HAL_TIMEx_RemapConfig(&TimHandle, TIM_TIM5_LSE);+ a0 N* G. c4 F' b- a. V. x: d
  16.    } while(0)
    % S9 J- g( Z0 j! H* U! g' u0 ?
  17.    #else
    % ~8 ]" l7 H, v. @/ D
  18.    #define HSI_Timer_ConnectInput() do {
    & o6 ~% L5 u5 _

  19. ' L9 I. E% g/ G- k" ?4 i$ D

  20. 0 S% k4 ^9 U9 J1 N# l: e
  21. HAL_RCC_MCOConfig(RCC_MCO, RCC_MCOSOURCE_LSE, RCC_MCO_DIV1); ; N" n9 H: |8 W/ m& v; ~, h6 n
  22. HAL_TIMEx_RemapConfig(&TimHandle, TIM_TIMx_MCO);
    4 x/ A6 k' {( }2 i; |& y, y4 d
  23. } while(0)
    " W6 m! M- I- W. l
  24. #endif
复制代码
2 w, g5 F- A9 S0 t
d.详细代码参考附件源码例程.5 d# j* _7 B/ u9 g3 C# m& H6 @( [! E

3 X. j) y4 d1 F1 r* i结论:
4 Y8 j: W. H# m/ m. T" I* w1. STM32 MCU 内部高速时钟是可以通过外部提供的精确时钟源进行校准的.- l+ G! l+ l2 V5 O8 w' @# \
2. 我们提供一篇应用笔记和参考代码给客户演示如何校准 HIS,基于 STM32Cube 的良好的可移植行,很方便的从 STM32F0 移植到其他 STM32 产品上面.
# }1 L3 v  b3 }5 D4 f, z! T0 R. B3. 如果客户在使用异步通信且没有使用 PLL 作为时钟源,建议在系统启动的时候增加校准代码来增强系统的容错能力.
! \: e; v: V" F5 `3 N0 @
/ F4 p# `* N9 D4 R% m$ f
: s4 i8 i1 X# H. V7 Y- w& L
收藏 评论0 发布时间:2022-2-27 16:59

举报

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