1 前言客户反馈在批量生产阶段,发现部分产品的
MCU 的 RTC 在低温(0℃)下工作不正常,但是在常温下又是正常的,且其他正常的 MCU 的 RTC 在常温与低温下都是正常的。
2 问题跟进与分析通过与客户邮件沟通,了解到客户使用的 MCU 型号是:STM32F030C6T6TR。在产品的主从结构中主要用作
电源管理和时钟管理。通过客户的描述,似乎相同型号不同片子都存在较大的差异。
由于时间紧急,在了解到初步信息后立即拜访客户,针对客户认为有问题的 MCU 芯片做针对性试验。通过STM32CubMx 生成测试工程,分别使用 LSI(40K),LSE(32.768K),RTC 工作时每秒通过 LED1(PB5)取反(通过 LED1 灯是否闪烁来指示 RTC 是否工作正常),然后分别测量 OSC 管脚与 PA8 脚(输出 LSI 或 LSE),并对比 ST 的 NUCLEO-F030 板,终测试结果如下:
STM32F030 低温下 RTC 不工作通过测试结果,我们得到如下信息:
l 当使用 LSI 时,无论常温还是低温下都能正常工作。
l 当使用 LSE 时,常温下能正常工作,但在低温(0℃)时,RTC 不再工作(LED1 停止闪烁),且 PA8 管脚无输出,但保持为高电平,且此时 OSC 管脚此时是存在 32.768K 的波形的。
l 通过修改负载电容 C1&C2 的电容值从 5.1pF 修改到 6.8pF 时,原本低温下不工作的 RTC 又能恢复正常工作。
l 对比 ST 的 NUCLEO-F030 板子,在常温与低温下均能正常工作。
STM32F030 低温下 RTC 不工作STM32F030 低温下 RTC 不工作从测试结果来看,通过修改负载电容的方式能让原本不能正常工作的 RTC 恢复正常工作,这个似乎为客户的负载电容不能精准的匹配系统的原因所致。
但客户对于这种解释是不接受的,理由是现在设计的负载电容 5.1pF 是通过测试后的值,精度可以达到 6.5ppm,但如果改为 6.8pF,那么精度将会变到大约 30ppm,这个会影响到 MCU 的 RTC 的时间精准度,系统在长时间运行后,时间必然会偏差很大,超出设计合理范围,这个是不允许的。
3 问题分析既然客户不接受修改负载电容,那么首先我们重新梳理下客户的晶振设计各种参数是否准确,客户的 LSE 电路设计如下所示:
STM32F030 低温下 RTC 不工作如上图,图中的 MR10 10Mohm 这个反馈电阻在实际电路中是没有加的,晶振使用的是 TXC 的,从晶振厂商提供的数据手册中得到相关参数如下:
STM32F030 低温下 RTC 不工作再者,由于客户代码中使用的 LSE drive 配置的是等级,从下图芯片对应的数据手册中可以找到对应的 gm值为 25uA/V,此时的驱动电流为 1.6uA:
STM32F030 低温下 RTC 不工作上图有提到 AN2867 这个文档,于是我们打开这个文档,在 3.4 节,发现有这个要求:
STM32F030 低温下 RTC 不工作也就是要求 gain margin 的值要求大于 5,这样晶振才能正常起振,那么 gain margin 又是如何计算的呢?接下来找到 gainmargin 的计算公式,如下:
STM32F030 低温下 RTC 不工作其中 gm 就是图 4 中从数据手册中提到的跨导值,STM32F030 LSE 的不同驱动等级对应着不同的 gm 值,由于我们的测试代码使用的是 CubeMx 自动生成的代码,其默认使用的是等级,且客户使用的也是等级,因此,这个得出的 gm 值为 25 uA/V, gm 有了,那么上面公式中的 gmcrit 又该如何计算,我们接下来找到它的计算公式,如:
STM32F030 低温下 RTC 不工作通过晶振对应参数,我们可以得出:
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终得到:
gain_magin =gm/g_mcrit =2.5E-05/7.6E-07 =32.89这个值是远大于 5,因此,理论上不会存在晶振不起振是的问题,实际上当在低温下,之前在测试中也有发现晶振也是有起振,有波形输出的,只不过 PA8 脚没有波形输出,那个又是什么问题呢?
提交给 pision,终定位到 LSE 的驱动等级过高,在 AN2867 这个文档中,有这样的描述:
STM32F030 低温下 RTC 不工作也就是说,在 STM32F0 和 STM32F3 中,当使用驱动模式(gm_crit_max=5uA/V, 见 Figure9 gm_crit_max)时,对应地应该只使用在 CL=12.5pF 的晶振上,以此避免振荡回路饱和,从而导致启动失败。若此时使用了一个较小的 CL(如 CL=6pF),那么会导致振荡频率不稳定和工作周期可能被扭曲。
AN2867 随后给出了一张表,列出了驱动等级与 gm_min、gm_crit_max 的关系,如下:
STM32F030 低温下 RTC 不工作如上图,对于 STM32F0,当使用驱动模式 High 时,此时的 gm_min=25 uA/V,这个与数据手册中是一致的,另外 gm_crit_max =5uA/V,正是上面所描述的。
也就是说,在使用驱动模式下,此时与之对应的 CL 应该使用 12.5pF,而客户所使用的 CL 是 7pF,这个与手册AN2867 的建议内容是不相符的。从图 4 可以看出,在驱动等级模式下,此时驱动电流(1.6uA),但这里使用了一个比较小的负载电容(CL=7pF),按 AN2867 所述,此时有可能导致振荡回路饱和,振荡不稳定,工作周期扭曲。
此时,应该对应地下调这个 LSE 驱动等级,减小驱动电流,这里有 4 档(见 Figure 9):Low,Medium Low,Medium High,High。 目前使用的是 High,正是它出了问题,为保守起见,使用 Medium High 相对合适。
打开 STM32F030 的参考手册,在 7.4.9 节中:
STM32F030 低温下 RTC 不工作如上图,将 LSEDRV[1:0]这两个为修改为 10 即可,将原先低温下 RTC 有问题的 MCU 芯片修改后再次放到低温下进行验证,测试结果为正常。由于此问题是部分芯片有可能会出现的问题,客户需要对修改后的芯片进行持续跟踪,至今没有再反馈出现过此问题,由此,此问题基本算是解决。
另外,从图 1 中所作的测试结果来看,实际上,在低温条件下,RTC 出现问题的时候,OSC pin 还是能正常捕捉到波形,只不过,PA8 脚这个 MCO 上没有波形,只是维持在高电平。于是,对于驱动电流过大所导致的振荡回路饱和,振荡不稳定,工作周期扭曲,这里理解为 MCO 脚与 MCU 内部振荡回路的连接点,也就是 MCO 所表现的波形。
总结AN2867 这个文档总结了关于 STM32 晶振匹配方面的信息。里边有提到,负载电容 CL 值越大,所需的驱动电流也就越大,但牵引度越小。这也就解释了表 1 中通过增大 C1&C2 的电容值,原本出现问题的 RTC 能恢复正常的现象,这是由于 C1&C2 的电容值变大将导致负载电容 CL 变大,进而对应所需的驱动电流也就跟着增加,这反而减少了在高驱动模式情况下振荡回路出现饱和的机会。