一个老话题:STM32F1的RTC上电不起振问题?新发现?
本帖最后由 下弦月-339376 于 2017-10-12 10:58 编辑量产的产品,之前就偶尔出现屏幕上电不亮,最近越来越多。连电脑发现是卡死在 等待RTC时钟:/* Loop until RSF flag is set */ while ((RTC->CRL & RTC_FLAG_RSF) == (uint16_t)RESET)
我用示波器测,不亮的屏幕,确实有些是外部32768没波形。但有些也有,屏幕也不亮。
网上查,说是F1的RTC做的不太好,比较挑晶体。必须是6pf的。但看有网友说是换了6pf也会出问题,还有人说是低温下,问题更多。
偶然发现,不亮的屏幕,如果把电池扣掉,那每次都可以点亮了???
然后就又继续搜索到这个 http://blog.csdn.net/jinchengzhou/article/details/53036560,说是因为没有执行RTC_Configuration()
刚好我的程序就是这样写的:所以我想问一下,之前大家碰到的RTC不起振,是不是也是只要每次都执行一次RTC_Configuration就好了?
我这个程序,就是如果上电碰到A5A5标志位,就直接走下边去了,没有再次初始化RTC,然后就卡死了。如果每次都初始化就好了,但时间也就复位了
本帖最后由 馒头弟 于 2018-6-5 09:50 编辑
用过,偶尔不起振,低温下不起振的频率更高,之前没有做处理,被骂死了。后面是初始化一定次数没成功就切内置的了 = =! 建议看下勘误手册 本帖最后由 wenyangzeng 于 2018-6-5 09:33 编辑
上电时,RTC寄存器写保护。要打开写操作,需要向RTC_WPR寄存器中写一个序列。
先写入0xCA,再写入0x53即可关闭写保护。写别的数据将关闭写保护,比如写入0x00等。
日历初始化和配置
按照以下步骤设置RTC的时间日期以及对时钟输入的预分频:
1、设置初始化和状态寄存器RTC_ISR中的INIT为为1进入初始化模式。在这个模式下,RTC
时间寄存器计数停止,可被更新
2、判断RTC_ISR中的INITF位,判断RTC是否已经被初始化过。当读出数据为1时,即可进入
初始化模式。这个过程将持续大约两个RTC时钟周期
3、为了得到1Hz的计数器时钟,先对RTC_PRER寄存器中的同步分频值PREDIV_S进行
设置再对该寄存器中的一部分频值PREDIV_A进行设置。即使只有一个分频值需要写入,
另一个分频值也需要再写入一遍。
4、将要设置的时间和日期写入RTC_CR和RTC_DR的影子寄存器,在RTC_CR中设置时间格式。
5、向INTI位写入0,退出初始化模式。这时,RTC_DR和RTC_CR就会将日期信息从影子寄存
器中加载到寄存器中,并在4个RTC时钟周期后自动开始运行。uint8_t RTC_Configuration(void)
{
RTC_InitTypeDef RTC_InitStructure;
uint16_t retry=0X1fFF;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//使能PWR时钟
PWR_BackupAccessCmd(ENABLE); //使能后备寄存器访问
if(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
RCC_LSEConfig(RCC_LSE_ON);
if(RTC_ReadBackupRegister(RTC_BKP_DR0)!=0x5050) //是否第一次配置?
{
RCC_LSEConfig(RCC_LSE_ON);//LSE 开启
while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) //检查指定的RCC标志位设置与否,等待低速晶振就绪
{
retry++;
Delay(10);
}
if(retry==0) return 1;//LSE 开启失败.
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //设置RTC时钟(RTCCLK),选择LSE作为RTC时钟
RCC_RTCCLKCmd(ENABLE); //使能RTC时钟
RTC_InitStructure.RTC_AsynchPrediv = 0x7F;//RTC异步分频系数(1~0X7F)
RTC_InitStructure.RTC_SynchPrediv= 0xFF;//RTC同步分频系数(0~7FFF)
RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;//RTC设置为,24小时格式
RTC_Init(&RTC_InitStructure);
RTC_Set_Time(20,25,56,RTC_H12_AM); //设置时间
RTC_Set_Date(17,1,16,4); //设置日期
RTC_WriteBackupRegister(RTC_BKP_DR0,0x5050); //标记已经初始化过了
}
else
{
RCC_RTCCLKCmd(ENABLE);
RTC_WaitForSynchro();
}
return 0;
}
不起振的原因很多,比如我遇到过,电路设计有问题,原来是设计用内置晶振,节约两个IO口的,但是也布设32.768K晶振的位置,当发现内置不准时,又要用外置,结果有一大把产品外置晶振不工作,有些甚至把电路部分手工断开也不工作,设计的失败,根本无法挽救。程序只占一部分。 官方我记得有一篇说不起振的原因,电容匹配问题,你自己先用STM32CubeMX配置跑一个试试啊 www.stmcu.com.cn
STM32F030低温下RTC不工作 - 实战经验 我也碰到过,我觉得应该不是软件问题,
因为,换了个新的晶振就好了,
我反而觉得是晶振和电容不匹配,
建议,细调一下匹配电容。看看效果如何。 问题很有可能是 你初始化的地方有问题,或者是复位后对寄存器的处理不合适,
先看看经典例子的 初始化过程 有源晶振也不贵,如果成本核算适合,加个有源晶振替换无源的什么问题都没有了。我在较高端设计上一概如此。有时不妨考虑采用陶瓷谐振器,那玩意的Q值相当高,需要串联电阻,并且价格比晶振还要便宜,批量不到0.1元。试试吧,别一条胡同走死了。
页:
[1]
2