客户反馈在批量生产阶段,发现部分产品的MCU的RTC在低温(0℃)下工作不正常,但是在常温下又是正常的,且其他正常的MCU的RTC在常温与低温下都是正常的。
通过与客户邮件沟通,了解到客户使用的MCU型号是:STM32F030C6T6TR。在产品的主从结构中主要用作电源管理和时钟管理。通过客户的描述,似乎相同型号不同片子都存在较大的差异。
由于时间紧急,在了解到初步信息后立即拜访客户,针对客户认为有问题的MCU芯片做针对性试验。通过STM32CubMx生成测试工程,分别使用LSI(40K),LSE(32.768K),RTC工作时每秒通过LED1(PB5)取反一次(通过LED1灯是否闪烁来指示RTC是否工作正常),然后分别测量OSC管脚与PA8脚(输出LSI或LSE),并对比ST官方的NUCLEO-F030板,最终测试结果如下:
Test item | Temperature | Low-speed clock type | LED1(use PB5 to indicate the RTC status) | OSC pin | PA8 output clock |
---|---|---|---|---|---|
Use Customer board without any modify | Indoor temperature(25℃) | Use LSI(40KHz) | OK(Flash every second) | N/A | OK(Output 40K waveform) |
Use Customer board without any modify | Under the low temperature(0℃) | Use LSI(40KHz) | OK(Flash every second) | N/A | OK(Output 40K waveform) |
Use Customer board without any modify | Indoor temperature(25℃) | Use LSE(32.768KHz) | OK(Flash every second) | 32.768K waveform | OK(Output 32.768K waveform) |
Use Customer board without any modify | Under the low temperature(0℃) | Use LSE(32.768KHz) | Failed(no flash) | 32.768K waveform detected | Failed(no output waveform) |
Use the Customer board and modify the LSE load capacitance value to 6.8pF | Indoor temperature(25℃) | Use LSE(32.768KHz) | OK(Flash every second) | 32.768K waveform | OK(Output 32.768K waveform) |
Use the Customer board and modify the LSE load capacitance value to 6.8pF | Under the low temperature(0℃) | Use LSE(32.768KHz) | OK(Flash every second) | 32.768K waveform | OK(Output 32.768K waveform) |
Use ST Nucleo-F030 board | Indoor temperature(25℃) | Use LSE(32.768KHz) | OK(Flash every second) | 32.768K waveform | OK(Output 32.768K waveform) |
Use ST Nucleo-F030 board | Under the low temperature(0℃) | Use LSE(32.768KHz) | OK(Flash every second) | 32.768K waveform | OK(Output 32.768K waveform) |
但客户对于这种解释是不接受的,理由是现在设计的负载电容5.1pF是通过测试后的值,精度可以达到6.5ppm,但如果改为6.8pF,那么精度将会变到大约30ppm,这个会严重影响到MCU的RTC的时间精准度,系统在长时间运行后,时间必然会偏差很大,超出设计合理范围,这个是不允许的。
既然客户不接受修改负载电容,那么首先我们重新梳理下客户的晶振设计各种参数是否准确,客户的LSE电路设计如下所示:
index | parameters | Sym | Typical | Unit |
---|---|---|---|---|
1 | Nominal Frequency | F0 | 32.768 | KHz |
2 | Load Capacitance | CL | 7.0 | pF |
3 | Equivalent Series Resistance | ESR | 70 | KΩ |
4 | Shunt Capacitance | C0 | 1.0 | pF |
提交给division,最终定位到LSE的驱动等级过高,在AN2867这个文档中,有这样的描述:
AN2867随后给出了一张表,列出了驱动等级与gm_min、gm_crit_max的关系,如下:
也就是说,在使用最高驱动模式下,此时与之对应的CL应该使用12.5pF,而客户所使用的CL是7pF,这个与手册建议的内容是不相符的。从图4可以看出,在最高驱动等级模式下,此时驱动电流最大(1.6uA),但这里使用了一个比较小的负载电容(CL=7pF),按AN2867所述,此时有可能导致振荡回路饱和,振荡不稳定,工作周期扭曲。
此时,应该对应地下调这个LSE驱动等级,减小驱动电流,这里按比例估算的话(12.5pF/1.6uA=7pF/xuA == > x=1.6*7/12.5 =0.89uA ),这里除了最高档可以外,其他都可以,保守起见,使用Medium High相对合适。
打开STM32F030的参考手册,在7.4.9节中:
另外,从图1中所作的测试结果来看,实际上,在低温条件下,RTC出现问题的时候,OSC pin还是能正常捕捉到波形,只不过,PA8脚这个MCO上没有波形,只是维持在高电平。于是,对于驱动电流过大所导致的振荡回路饱和,振荡不稳定,工作周期扭曲,这里理解为MCO脚与MCU内部振荡回路的连接点,也就是MCO所表现的波形。
AN2867这个文档总结了关于STM32晶振匹配方面的信息。里边有提到,负载电容CL值越大,所需的驱动电流也就越大,但牵引度越小。这也就解释了表1中通过增大C1&C2的电容值,原本出现问题的RTC能恢复正常的现象,这是由于C1&C2的电容值变大将导致负载电容CL变大,进而对应所需的驱动电流也就跟着增加,这反而减少了在高驱动模式情况下振荡回路出现饱和的机会。
在一般情况下,关于晶振这方便我们往往比较关注的是gain margin的计算,它的值太小的话会导致不起振,但同时,我们也应该适当关注由驱动电流过大导致振荡回路饱和的情况。
AN2867这个文档的中文版是精简版,若要真正研究的话,建议还是看英文原版。