历史上的今天
返回首页

历史上的今天

今天是:2025年03月06日(星期四)

正在发生

2019年03月06日 | 关于STM32使用RTC时复位后程序死在 RTC

2019-03-06 来源:eefocus

在软件仿真时如果不需要配置,则程序会死在 RTC_WaitForSynchro() 函数中。而下载到硬件上时,有时候可以跑,有时候也会在该函数中死循环。


可能的原因:

首先,一定要确认是否使能了对后备寄存器和RTC的访问。

系统复位后,对后备寄存器和RTC的访问被禁止,这是为了防止对后备区域(BKP)的意外写操作。执行以下操作将使能对后备寄存器和RTC的访问: 


● 设置寄存器RCC_APB1ENR的PWREN和BKPEN位,使能电源和后备接口时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
● 设置寄存器PWR_CR的DBP位,使能对后备寄存器和RTC的访问
PWR_BackupAccessCmd(ENABLE);

另外还要使能RTC时钟 RCC_RTCCLKCmd(ENABLE); 虽然该函数的说明中说只在RCC_RTCCLKConfig()函数调用之后才能调用,但是实际上如果不调用该函数,仿真时就会在 RTC_WaitForSynchro() 函数中死循环,等待RTC时钟同步。

也就是说,不论是否需要配置RTC寄存器,每次系统复位都需要执行如下操作:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);PWR_BackupAccessCmd(ENABLE);RCC_RTCCLKCmd(ENABLE);

其次,STM32的RTC对外部LSE要求比较高,最好使用负载电容为6pF的晶振。在芯片的DataSheet中有明确的说明,不能使用12.5pF的晶振。“ To avoid exceeding the maximum value of CL1 and CL2 (15 pF) it is strongly recommended to use a resonator with a load capacitance CL≤ 7 pF. Never use a resonator with a load

capacitance of 12.5 pF.”


参考代码:
#include "RTC.h"
__IO uint32_t TimeDisplay;
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);        
NVIC_InitStructure.NVIC_IRQChannel=RTC_IRQn;           
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_Init(&NVIC_InitStructure);                       


}


void RTC_Config(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP | RCC_APB1Periph_PWR,ENABLE); 
PWR_BackupAccessCmd(ENABLE); 
BKP_DeInit(); 
RCC_LSEConfig(RCC_LSE_ON);  
while(RCC_GetFlagStatus(RCC_FLAG_HSERDY)==RESET){} 
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); 
RCC_RTCCLKCmd(ENABLE); 
RTC_WaitForSynchro();      
RTC_WaitForLastTask();  
RTC_ITConfig(RTC_IT_SEC,ENABLE); 
RTC_WaitForLastTask(); 
RTC_SetPrescaler(32767); 
RTC_WaitForLastTask(); 
}


void Time_Ajust(void)
{
RTC_WaitForLastTask();
RTC_SetCounter(Time_Regulate());
RTC_WaitForLastTask();  
}


uint32_t Time_Regulate()
{
uint32_t temp_hour=0xff,temp_minute=0xff,temp_sec=0xff;

printf("Set hour:");
while(temp_hour==0xff){
USART_Scanf(23);
}
printf("  %d",temp_hour);
printf("Set minute:");
while(temp_minute==0xff){
USART_Scanf(59);
}
printf("  %d",temp_minute);
printf("Set second:");
while(temp_sec==0xff){
USART_Scanf(59);
}
printf("  %d",temp_sec);

return temp_hour*3600+temp_minute*60+temp_sec;
}




void RTC_Init(void)
{
if(BKP_ReadBackupRegister(BKP_DR1)==0xA5A5){

printf("\r\n This is a RTC demo! \r\n");
printf("\r\n RTC not yet configured \r\n");

RTC_Config();

Time_Ajust();

}
if(RCC_GetFlagStatus(RCC_FLAG_PORRST)!=RESET)
{
printf("\r\n not occured \r\n");
}
else if(RCC_GetFlagStatus(RCC_FLAG_PINRST)!=RESET)
{
printf("\r\n no need to config \r\n");
}
RTC_WaitForSynchro(); 
RTC_ITConfig(RTC_IT_SEC,ENABLE);
RTC_WaitForLastTask();



}


void Time_show(void)
{
printf("\r\n");
while(1){
if(TimeDisplay==0)
{
Time_Display(RTC_GetCounter());
TimeDisplay=1;
}
}
}


void Time_Display(uint32_t Timewar)
{
unsigned int min=0,hour=0,sec=0;

hour=Timewar/3600;
min=Timewar%3600/60;
sec=Timewar%60;

printf("%.2d:%.2d:%.2d",hour,min,sec);

}


uint8_t USART_Scanf(uint32_t value)
{
uint32_t index=0;
uint32_t temp[2]={0,0};

while(index<2){
while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE)==RESET){}
temp[index]=USART_ReceiveData(USART1);
index++;
if(temp[index-1]

推荐阅读

史海拾趣

Datakey Electronics公司的发展小趣事

在电子产品行业,产品质量是企业生存和发展的基石。Datakey Electronics始终坚守品质至上的原则,从原材料采购到生产流程控制,再到产品检验和售后服务,每一个环节都严格把关。正是这种对品质的执着追求,使Datakey Electronics的产品在市场上树立了良好的口碑,赢得了客户的信赖。

GarrettCom公司的发展小趣事

研发:GarrettCom(现为Belden的一部分)始终将技术创新作为企业发展的核心驱动力。公司不断投入研发资源,致力于开发更加先进、可靠的工业网络通信产品。通过持续的技术创新,GarrettCom不仅推动了工业通信技术的进步,还为客户提供了更加高效、便捷的通信解决方案。

应用:这些创新产品被广泛应用于工业自动化、交通监控、能源管理等多个领域,为客户创造了巨大的价值。同时,GarrettCom还积极参与国际标准的制定和推广工作,为行业的标准化发展做出了积极贡献。

Hokuriku公司的发展小趣事

进入21世纪后,环保和可持续发展成为全球关注的焦点。Hokuriku Electric积极响应这一趋势,将环保理念融入产品研发和生产过程中。公司投入大量资源研发绿色电子产品,减少生产过程中的能源消耗和废弃物排放。同时,Hokuriku Electric还积极参与行业内的环保倡议和合作项目,推动整个电子行业的可持续发展。这一举措不仅赢得了社会各界的广泛赞誉,还为公司带来了更多的商业机会和合作伙伴。

Cantec Electronic Co Ltd公司的发展小趣事

在追求经济效益的同时,Cantec Electronic Co Ltd也积极履行社会责任,坚持绿色发展理念。公司投入大量资金进行环保设施的建设和改造,确保生产过程中的废弃物得到有效处理。同时,公司还积极研发环保型电子产品,推动整个行业的绿色转型。这一举措不仅提升了公司的社会形象,也为公司的可持续发展提供了有力保障。

Crowd Supply公司的发展小趣事

Crowd Supply的创立源于几位麻省理工大学的毕业生对于硬件创新的热情与追求。他们意识到,许多优秀的硬件项目因缺乏资金和市场渠道而无法实现商业化。于是,他们决定创建一个平台,专门服务于这些创新项目,帮助它们从原型设计走向市场。这就是Crowd Supply的初心,也是其使命所在——将原创、有用、受人尊敬的硬件带入生活。

Cornell Dubilier公司的发展小趣事

Cornell Dubilier公司的历史可以追溯到1909年,当时公司创始人William Dubilier凭借其开创性的云母电容器技术,为无线电广播通信带来了革命性的改变。这项技术的突破,使得Cornell Dubilier公司在早期电子行业中崭露头角。随后的几十年里,公司逐渐扩大生产规模,增加产品线,并开始涉足其他电子元件和组件的制造。

问答坊 | AI 解惑

电压不足期间支持电信电源的小电容

本设计实例介绍如何在短暂电压不足期间使电信设备保持正常工作。首先必须了解电信设备专用电源的几个细节。向电信设备馈电的电源的共模电压为-48V,尽管实际电压范围可能是-42.5V ~ -56V、-40V ~ -60V,甚至超出这些范围。公共电源——“砖块”DC/D ...…

查看全部问答>

最近在看FLASH的资料,想用FPGA进行写入和读出

最近在看FLASH的资料,想用FPGA进行写入和读出 高手讲讲怎么做啊…

查看全部问答>

我在深圳五年的销售心得

关于我自己      1、业务员和客户聊天的时候哪些话题不需要聊太多关于技术和理论的话题,需要的是今天的新闻呀、天气呀等话题。因此,业务员在日常的时候必须多读些有关经济、销售方面的书籍、杂志,尤其必须每天阅读报纸,了解国家、社会消 ...…

查看全部问答>

wince 打印问题

请问WINCE 打印一般用哪些类来实现? 可以用CPrintDialog类吗,我在VS2005中为什么编译会出现\'CPrintDialog\' : undeclared identifier?…

查看全部问答>

麻烦有能力的高手提供下设计思路!谢谢了

单位需要设计一种ISA转PCI的接口卡 用途是把以前老设备上面的ISA接口卡(主要是s1240程控机)转用点现在PCI口上使用.通过查询资料,我发现用专用芯片pci9052 似乎是最省力的办法。但是由于本人学的是通信专业,对硬件设计基本不明白,数电模电忘记差 ...…

查看全部问答>

WinCE5/6如何实现程序开机自动运行,并且程序可以运行配置的命令参数

[HKEY_LOCAL_MACHINE\\Init]     \"Launch10\"=\"shell.exe\"     \"Launch20\"=\"device.exe\"     \"Launch30\"=\"gwes.dll\"     \"Depend30\"=hex:14,00     \"Launch50\"=\"taskman.e ...…

查看全部问答>

如何获得在wince 5.0上已安装软件的信息

如题。 不是mobile. 一般在[HKEY_LOCAL_MACHINE]software\\apps下会有一些安装后软件的信息。 我已能获取到已安装软件的全部文件的详细路径信息和注册表信息。 但是不能得到该软件的主程序,也就是启动程序的exe的路径等信息,导致我没法利用这 ...…

查看全部问答>

寂寞的液晶和触摸按键

    最近闲来无事,申请了个8bit的小板子玩玩,主要是上面有触摸按键,手头还有个液晶,所以就想结合起来搞点东西。说实在的,就是闲的。     先说着板子,前一段在某群接到可以申请最小系统的通知,要知道,这家的 ...…

查看全部问答>

对eeworld的点点建议

这样问也不知道冒不冒昧,但是还是得问问soso姐,姐姐,从我个人在论坛每个子模块查资料找东西来看,我觉得子模块有点乱,咱们能不能把子模块中的帖子细细分下类呢?比如说,软件和资料,我们把模块细化分一下类,新回复的东西还是固有不变,这样大 ...…

查看全部问答>

ARM Crotex-m0程序跳转BX

128KB的Flash中我存储了两段程序 第一个基址是0x00000000 第二个基址是0x00001000  这两个程序是不相关的,独立的, 第一个程序我是用新唐的ICP软件下载的,第二个程序是我通过自己写在LDROM中的程序下载到0x00001000 , 现在我希望能够 ...…

查看全部问答>