第一次将STM32嵌入式单片机应用到项目上,而且完全独立开发,首次接触嵌入式单片机,过程有点坎坷。此章手记,仅仅记录关于RTC硬件应用问题。 简练的描述此次项目设计验证中遇到的问题。设备经过数天的上下行参数设置、温补、三阶互调之后。设备送入老化箱进行高低温测试。问题出来了,进行低温老化的时候,当温度低于0℃时,设备如果重新上电,就无法启动。
起初怀疑HSE外部7.3728MHz晶振失振,于是阅读了官方AN2586应用笔记,根据Pierce振荡器的设计说明,重新计算了CL、RExt及振荡器的增益裕量。最终在官方推荐的范围被选定指标:CL1、CL2=20p,RExt=390Ω(经过一番计算,还是选用参考参数靠谱,毕竟经过验证的参数)。
调试过程中又出现原先芯片被搞坏现象,详细阅读了LSE相关说明后恍然大悟,烧芯片的不只是VBat,过大的gmcrit会导致内部振荡电路,其原因下文详细介绍。
对于STM32™的LSE部分,推荐使用CL < 7pF的晶振(译注:过大的CL会导致过大的gmcrit,从而无法保证足够的增益裕量)。需要注意的另一项,LSE尽量不要加限流电阻,原因下方有说明。
在应用手机最后一页结论有相关说明:对于振荡器是否能够起振来说,增益裕量是最重要的参数。在针对具体应用选择合适的晶振时,首先要计算增益裕量。第二个重要的参数是根据晶振制造商提供的数据,来选择外部负载电容,这决定了晶振频率的准确性。第三个重要的参数是外部限流电阻用以限制晶振的驱动级别。对于32kHz的振荡器来说,一般不推荐使用外部限流电阻(译注:因为LSE的常见问题是振荡器驱动能力不足而非晶振被过分驱动)。所以,32.768KHz最好不要串限流电阻。
电路修改完,复测完毕,丢进老化箱继续,好家伙,低温重启时又挂掉,这个时候,有点头大了,难道不只是硬件问题?开始检查RTC初始化程序,最大嫌疑是初始化函数中调用固件库“stm32f10x_rtc.c”中的void RTC_WaitForLastTask(void)
//此函数为等待最近一次对RTC寄存器的写操作完成。当外部晶振失振时,对RTC寄存器写操作时死在“while ((RTC->CRL & RTC_FLAG_RTOFF) == (uint16_t)RESET)语句中”如图所示:
问题找到自然有办法解决了,哈! |