STMCU小助手
发布时间:2022-2-25 20:02
|
1 前言 客户反馈在批量生产阶段,发现部分产品的 MCU 的 RTC 在低温(0℃)下工作不正常,但是在常温下又是正常的,且其他正常的 MCU 的 RTC 在常温与低温下都是正常的。4 f9 F! k* f& ]! ?' |6 B 2 问题跟进与分析 通过与客户邮件沟通,了解到客户使用的 MCU 型号是:STM32F030C6T6TR。在产品的主从结构中主要用作电源管理和时钟管理。通过客户的描述,似乎相同型号不同片子都存在较大的差异。 由于时间紧急,在了解到初步信息后立即拜访客户,针对客户认为有问题的 MCU 芯片做针对性试验。通过STM32CubMx 生成测试工程,分别使用 LSI(40K),LSE(32.768K),RTC 工作时每秒通过 LED1(PB5)取反一次(通过 LED1 灯是否闪烁来指示 RTC 是否工作正常),然后分别测量 OSC 管脚与 PA8 脚(输出 LSI 或 LSE),并对比 ST 官方的 NUCLEO-F030 板,最终测试结果如下:, H: c8 b j2 S! \: R % {7 n3 Y2 K- {% z2 E
& V5 F9 ?* F* ~9 \8 y 通过测试结果,我们得到如下信息:7 C' H# I) v1 g/ b8 w r7 D 当使用 LSI 时,无论常温还是低温下都能正常工作。: e( Q0 y0 J3 ^ 当使用 LSE 时,常温下能正常工作,但在低温(0℃)时,RTC 不再工作(LED1 停止闪烁),且 PA8 管脚无输出,但保持为高电平,且此时 OSC 管脚此时是存在 32.768K 的波形的。/ H; P1 D( N8 P2 z3 G0 w 通过修改负载电容 C1&C2 的电容值从 5.1pF 修改到 6.8pF 时,原本低温下不工作的 RTC 又能恢复正常工作。 对比 ST 官方的 NUCLEO-F030 板子,在常温与低温下均能正常工作。
* |3 [3 R6 B# c! n# f! A
0 l1 G! l* |; y- f) b5 i 从测试结果来看,通过修改负载电容的方式能让原本不能正常工作的 RTC 恢复正常工作,这个似乎为客户的负载电容不能精准的匹配系统的原因所致。* G' d6 Z' U V2 s) V . P. i: T# a5 N 但客户对于这种解释是不接受的,理由是现在设计的负载电容 5.1pF 是通过测试后的值,精度可以达到 6.5ppm,但如果改为 6.8pF,那么精度将会变到大约 30ppm,这个会影响到 MCU 的 RTC 的时间精准度,系统在长时间运行后,时间必然会偏差很大,超出设计合理范围,这个是不允许的。4 {! _3 M" w3 B8 s9 E - ]9 J+ Y/ t. q! i1 n' l$ j( h 3 问题分析3 m$ E- g* V3 q0 u' N) x 既然客户不接受修改负载电容,那么首先我们重新梳理下客户的晶振设计各种参数是否准确,客户的 LSE 电路设计如下所示:$ \9 c' c6 Q1 ?3 f; V
( l) p3 m e7 R# f8 z" j( o- p 如上图,图中的 MR10 10Mohm 这个反馈电阻在实际电路中是没有加的,晶振使用的是 TXC 的,从晶振厂商提供的数据手册中得到相关参数如下: 7 m9 `/ N) B3 F" X: d0 \
再者,由于客户代码中使用的 LSE drive 配置的是最高等级,从下图芯片对应的数据手册中可以找到对应的 gm值为 25uA/V,此时的驱动电流为 1.6uA:
; a. L' ~$ U3 i3 s% [% G 6 t# N+ y+ O0 L0 o# Q 上图有提到 AN2867 这个文档,于是我们打开这个文档,在 3.4 节,发现有这个要求: 5 c% K! F" K0 n+ O9 J- D9 M
1 ^- h8 l. U1 H. \ 0 A$ G0 J, z! T# [9 x3 ? 也就是要求 gain margin 的值要求大于 5,这样晶振才能正常起振,那么 gain margin 又是如何计算的呢?接下来找到 gainmargin 的计算公式,如下: 8 r6 r6 @9 y% l% I
" m1 m$ [" k+ T; L& I) v6 c5 R 其中 gm 就是图 4 中从数据手册中提到的跨导值,STM32F030 LSE 的不同驱动等级对应着不同的 gm 值,由于我们的测试代码使用的是 CubeMx 自动生成的代码,其默认使用的是最高等级,且客户使用的也是最高等级,因此,这个得出的 gm 值为 25 uA/V, gm 有了,那么上面公式中的 gmcrit 又该如何计算,我们接下来找到它的计算公式,如: 9 F3 G4 k# }! r2 o3 }( P4 \
通过晶振对应参数,我们可以得出:2 H0 g* c, W: n6 k ESR =70KΩ, C0 =1.0pF, CL =7.0pF, 而 F 就是 LSE 的频率,为 32.768KHz. 于是: g_mcrit =4 * 7E4 * POWER(2*PI()*32768,2) * POWER ((1.0E-12 + 7.0E-12),2) =7.6E-07. B* h/ x, d- D) ^ 最终得到: gain_magin =gm/g_mcrit =2.5E-05/7.6E-07 =32.89 这个值是远大于 5,因此,理论上不会存在晶振不起振是的问题,实际上当在低温下,之前在测试中也有发现晶振也是有起振,有波形输出的,只不过 PA8 脚没有波形输出,那个又是什么问题呢?7 Z+ M- v7 k5 Z' c2 Q, k : |- U" A( p# t8 B$ P 提交给 division,最终定位到 LSE 的驱动等级过高,在 AN2867 这个文档中,有这样的描述:% S5 t8 T8 W, n8 k$ L" k . ]; ?/ a) n2 Z' b v
也就是说,在 STM32F0 和 STM32F3 中,当使用最高驱动模式(gm_crit_max=5uA/V, 见 Figure9 gm_crit_max)时,对应地应该只使用在 CL=12.5pF 的晶振上,以此避免振荡回路饱和,从而导致启动失败。若此时使用了一个较小的 CL(如 CL=6pF),那么会导致振荡频率不稳定和工作周期可能被扭曲。' s! I* j/ c, m' s$ m$ a( q8 S3 V AN2867 随后给出了一张表,列出了驱动等级与 gm_min、gm_crit_max 的关系,如下: N" ?! P4 v6 e" e, [" Z ' v, Q$ u$ ~# h5 n+ o
1 t! g. i* q. G8 }7 d. P 1 j- C. {, ?: x% @ 如上图,对于 STM32F0,当使用最高驱动模式 High 时,此时的 gm_min=25 uA/V,这个与数据手册中是一致的,另外 gm_crit_max =5uA/V,正是上面所描述的。 5 @, e0 L* P$ v( t0 N R H5 }& K 也就是说,在使用最高驱动模式下,此时与之对应的 CL 应该使用 12.5pF,而客户所使用的 CL 是 7pF,这个与手册AN2867 的建议内容是不相符的。从图 4 可以看出,在最高驱动等级模式下,此时驱动电流最大(1.6uA),但这里使用了一个比较小的负载电容(CL=7pF),按 AN2867 所述,此时有可能导致振荡回路饱和,振荡不稳定,工作周期扭曲。 此时,应该对应地下调这个 LSE 驱动等级,减小驱动电流,这里有 4 档(见 Figure 9) ow,Medium Low,MediumHigh,High. 目前使用的是 High,正是它出了问题,为保守起见,使用 Medium High 相对合适。^# l8 G4 }8 l$ T; x: D 打开 STM32F030 的参考手册,在 7.4.9 节中:
如上图,将 LSEDRV[1:0]这两个为修改为 10 即可,将原先低温下 RTC 有问题的 MCU 芯片修改后再次放到低温下进行验证,测试结果为正常。由于此问题是部分芯片有可能会出现的问题,客户需要对修改后的芯片进行持续跟踪,至今没有再反馈出现过此问题,由此,此问题基本算是解决。 - B# P3 T8 y. t' O Q 另外,从图 1 中所作的测试结果来看,实际上,在低温条件下,RTC 出现问题的时候,OSC pin 还是能正常捕捉到波形,只不过,PA8 脚这个 MCO 上没有波形,只是维持在高电平。于是,对于驱动电流过大所导致的振荡回路饱和,振荡不稳定,工作周期扭曲,这里理解为 MCO 脚与 MCU 内部振荡回路的连接点,也就是 MCO 所表现的波形。 * |; v! R. `7 u5 P7 b 3 Z& a/ z' [( v1 e4 H 3 总结 AN2867 这个文档总结了关于 STM32 晶振匹配方面的信息。里边有提到,负载电容 CL 值越大,所需的驱动电流也就越大,但牵引度越小。这也就解释了表 1 中通过增大 C1&C2 的电容值,原本出现问题的 RTC 能恢复正常的现象,这是由于 C1&C2 的电容值变大将导致负载电容 CL 变大,进而对应所需的驱动电流也就跟着增加,这反而减少了在高驱动模式情况下振荡回路出现饱和的机会。 在一般情况下,关于晶振这方便我们往往比较关注的是 gain margin 的计算,它的值太小的话会导致不起振,但同时,我们也应该适当关注由驱动电流过大导致振荡回路饱和的情况。+ k1 K6 Z* q+ w & a% ]0 ^' c q% z |
DMA 原理从 0 到 1:为什么它能解放 CPU?一文讲透 DMA 的工作流程
小白也能明白的STM32的低功耗与唤醒机制
STM32系统中2种数据掉电保护的方法
分享STM32F051中文参考手册(重制书签版)
AI工具训练营-用ChatGPT解决HID Keyboard实现的问题
STM32固件库分享,超全系列整理
STM32小白入门指南:从基础到OTA实现方案
STM32超详细学习笔记
新手必看!STM32单片机应该怎么学?
如果你解决了这些问题,就可以直接学STM32
微信公众号
手机版