STM32常见问题:低温下部分产品RTC不工作的问题探析

发布者:MysticGlow最新更新时间:2023-07-11 来源: elecfans关键字:STM32  低温 手机看文章 扫描二维码
随时随地手机看文章

前言

客户反馈在批量生产阶段,发现部分产品的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板,最终测试结果如下:

1、当使用LSI时,无论常温还是低温下都能正常工作。

2、当使用LSE时,常温下能正常工作,但在低温(0℃)时,RTC不再工作(LED1停止闪烁),且PA8管脚无输出,但保持为高电平,且此时OSC管脚此时是存在32.768K的波形的。

3、通过修改负载电容C1&C2的电容值从5.1pF修改到6.8pF时,原本低温下不工作的RTC又能恢复正常工作。

4、对比ST官方的NUCLEO-F030板子,在常温与低温下均能正常工作。

从测试结果来看,通过修改负载电容的方式能让原本不能正常工作的RTC恢复正常工作,这个似乎为客户的负载电容不能精准的匹配系统的原因所致。


但客户对于这个做法不接受的,理由是现在设计的负载电容5.1pF是通过测试后的值,精度可以达到6.5ppm,但如果改为6.8pF,那么精度将会变到大约30ppm,这个会影响到MCU的RTC的时间精准度,系统在长时间运行后,时间必然会偏差很大,超出设计合理范围,这个是不允许的。


问题分析

既然客户不接受修改负载电容,那么首先我们重新梳理下客户的晶振设计各种参数是否准确,客户的LSE电路设计如下所示:

如上图,图中的MR10 10Mohm这个反馈电阻在实际电路中是没有加的,晶振使用的是TXC的,从晶振厂商提供的数据手册中得到相关参数如下:

再者,由于客户代码中使用的LSE drive配置的是最高等级,从下图芯片对应的数据手册中可以找到对应的gm值为25uA/V,此时的驱动电流为1.6uA:

前面提到过AN2867这个文档,我们打开这个文档,在3.4节,发现有这个要求:

也就是要求gain margin的值要求大于5,这样晶振才能正常起振,那么gain margin又是如何计算的呢?接下来找到gainmargin 的计算公式,如下:

其中gm就是图4中从数据手册中提到的跨导值,STM32F030 LSE的不同驱动等级对应着不同的gm值,由于我们的测试代码使用的是CubeMx自动生成的代码,其默认使用的是最高等级,且客户使用的也是最高等级,因此,这个得出的gm值为25 uA/V, gm有了,那么上面公式中的gmcrit又该如何计算,我们接下来找到它的计算公式,如:

通过晶振对应参数,我们可以得出:

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脚没有波形输出,那个又是什么问题呢?

最终定位到LSE的驱动等级过高,在AN2867这个文档中,有这样的描述:

也就是说,在STM32F0和STM32F3中,当使用最高驱动模式(gm_crit_max=5uA/V, 见Figure9gm_crit_max)时,对应地应该只使用在CL=12.5pF的晶振上,以此避免振荡回路饱和,从而导致启动失败。若此时使用了一个较小的CL(如CL=6pF),那么会导致振荡频率不稳定和工作周期可能被扭曲。

AN2867随后给出了一张表,列出了驱动等级与gm_min、gm_crit_max的关系,如下:

如上图,对于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档(见Figure9):Low,Medium Low,Medium High,High. 目前使用的是High,正是它出了问题,为保守起见,使用Medium High相对合适。

如上图,将LSEDRV[1:0]这两个为修改为10即可,将原先低温下RTC有问题的MCU芯片修改后再次放到低温下进行验证,测试结果为正常。由于此问题是部分芯片有可能会出现的问题,客户需要对修改后的芯片进行持续跟踪,至今没有再反馈出现过此问题,由此,此问题基本解决。


总结

AN2867这个文档总结了关于STM32晶振匹配方面的信息。里边有提到,负载电容CL值越大,所需的驱动电流也就越大,但牵引度越小。这也就解释了表1中通过增大C1&C2的电容值,原本出现问题的RTC能恢复正常的现象,这是由于C1&C2的电容值变大将导致负载电容CL变大,进而对应所需的驱动电流也就跟着增加,这反而减少了在高驱动模式情况下振荡回路出现饱和的机会。


关键字:STM32  低温 引用地址:STM32常见问题:低温下部分产品RTC不工作的问题探析

上一篇:关于STM32F103C8T6内部Flash划分的详细说明
下一篇:基于STM32芯片的电源监控器应用方案

推荐阅读最新更新时间:2024-11-08 15:47

STM32对内部Flash的保护措施
1、STM32对内部Flash的保护措施 所有STM32的芯片都提供对Flash的保护,防止对Flash的非法访问 - 写保护和读保护。 1)、读保护即大家通常说的 加密 ,是作用于整个Flash存储区域。一旦设置了Flash的读保护,内置的Flash存储区只能通过程序的正常执行才能读出,而不能通过下述任何一种方式读出: 通过调试器(JTAG或SWD); 从RAM中启动并执行的程序; 2)、写保护是以四页(1KB/页) Flash存储区为单位提供写保护,对被保护的页实施编程或擦除操作将不被执行,同时产生操作错误标志。 读与写设置的效果见下表: 读保护 写保护 对Flash的操作功能
[单片机]
STM32 HAL库头文件包含关系
如图,从左到右下的顺序写: -------------------------------------------------------------------------------------------------------------------------------- The header of the common HAL driver file(stm32f1xx_hal.h) includes the common configurations for the whole HAL library.It is the only header file that is included in th
[单片机]
<font color='red'>STM32</font> HAL库头文件包含关系
基于STM32系列单片机的数控正弦波逆变电源设计与实现
逆变电源应用广泛,特别是精密仪器对逆变电源的性能要求更高。高性能逆变电源不仅要求工作稳定、逆变效率高、输出波形特性好、保护功能齐全,还要求逆变电源小型化、智能化、并且具备可扩展性。文中提出一种基于STM32系列单片机STM32F103VE的纯数字式正弦逆变电源,该电源的全部功能由单片机控制实现,具有输出电压、频率稳定,效率高,保护功能齐全的特点。 1 系统设计 系统的整体框架如图1所示。系统采用高频逆变方案,即前级升压加后级逆变的结构,这样可以避免使用笨重的工频变压器,有效的降低了电源的体积、重量及成本,提升电源的效率。电路的工作原理是,12 V的直流输入电压经过滤波后由推挽升压和全桥整流升压到350 V的直流母线电压,再
[单片机]
基于<font color='red'>STM32</font>系列单片机的数控正弦波逆变电源设计与实现
stm32 keil实现串口printf输出中文字符
添加如下代码,可以GNUC的方式实现 #ifdef __GNUC__ /* With GCC/RAISONANCE, small printf (option LD Linker- Libraries- Small printf set to 'Yes') calls __io_putchar() */ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif /* __GNUC__ */ int main() { whil
[单片机]
stm32的几种读保护措施讲解
综合网上讲解的几种读保护措施,这里简单总结下: 采用stm32唯一ID作为加密的字符,使用固定密码,采用16位字节AES加密的方式生成密文,然后写进flash,,app程序执行的时候需要判断读取的stm32唯一ID号和AES解密出来是否一致,是执行程序,否则不执行,测试过,但这个方案针对生产比较麻烦,这里不采用 ChipUniqueID = *(__IO u32 *)(0X1FFFF7F0); // 高字节 ChipUniqueID = *(__IO u32 *)(0X1FFFF7EC); // ChipUniqueID = *(__IO u32 *)(0X1FFFF7E8); // 低字节 ChipUniqueID =
[单片机]
STM32开发板的TIM3开启和关闭
关闭定时器中断要考虑好多情况 1)关闭定时器时,定时器是否在处在工作状态 2)关闭定时器时,定时器是否正好进入中断,造成关闭程序出现断层,进而无法实现完整关闭程序,此时可以使用高一级别的外部中断强制进入外部中断服务函数进行关闭程序 3)关闭定时器时,关闭定时器的程序是否在定时器服务函数里面?还是在总函数里面?还是在外部中断服务函数里面?是需要考量的? 4)关闭定时器时,定时器的中断触发时间是否太紧凑?定时器的中断总次数是否太小?都会影响关闭定时器程序运行的连续性。 以下为关闭程序: 首先打开时钟,然后才能进行关闭操作。 RCC- APB1ENR|=1 1; //TIM3时钟使能 TIM3- ARR=arr; //设定计数器自
[单片机]
STM32笔记之外部中断GPIO
b) 初始化函数定义: void EXTI_Configuration(void); //定义IO中断初始化函数 c) 初始化函数调用: EXTI_Configuration();//IO中断初始化函数调用简单应用: d) 初始化函数: void EXTI_Configuration(void) { EXTI_InitTypeDef EXTI_InitStructure; //EXTI初始化结构定义 EXTI_ClearITPendingBit(EXTI_LINE_KEY_BUTTON);//清除中断标志 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_P
[单片机]
STM32 DMA
DMA,全称为:Direct Memory Access,即直接存储器访问,DMA 传输将数据从一个地址空间复制到另外一个地址空间。当 CPU 初始化这个传输动作,传输动作本身是由DMA 控制器 来实行和完成。典型的例子就是移动一个外部内存的区块到芯片内部更快的内存区。像是这样的操作并没有让处理器工作拖延,反而可以被重新排程去处理其他的工作。 DMA 传输对于高效能嵌入式系统算法和网络是很重要的。DMA 传输方式无需 CPU 直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为 RAM 与 I/O 设备开辟一条直接传送数据的通路,能使 CPU 的效率大为提高。DMA 是个非常好的功能,它不但能减轻 CPU 负担
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved