RTC代表的是实时时钟的意思。因为它提供的时钟基准比较准确所以用处还是很多的。本文章主要讲解基于STM32F103上的RTC闹钟中断功能以及用闹钟中断唤醒STM32的待机模式。
需要注意RTC的几个要点:1.RTC的值被设定后它就会一直按照设定的基准时间自己递增,如果你的硬件设备上发现一个纽扣电池,那就是给RTC功能供电用的。因此就算关闭掉设备的主电源,RTC的运行也是不受影响的,当然如果扣掉纽扣电池或者不带纽扣电池它就不工作了。2.每次STM32复位后这个RTC值它重新计数还是继续计数要考虑清楚3.RTC的值是有上限的,它的最大值就是2的32次方减一,这个数字很大因此不用太关心。
本文章的第一个例程是让RTC一次设定值后一秒递增一个单位,每过40秒就触发一个闹钟并进入中断,每经过一秒就将秒数输出到计算机上。下面就是RTC的初始化配置。(第一个程序从正点原子的程序上修改得来)
u8 RTC_Init()
{
u8 temp = 0;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP|RCC_APB1Periph_PWR,ENABLE);//电源时钟和背部时钟
PWR_BackupAccessCmd(ENABLE); //允许背部区域写
if (BKP_ReadBackupRegister(BKP_DR1) != 0xC0B4)
{
BKP_DeInit();
RCC_LSEConfig(RCC_LSE_ON);
while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
{
temp++;
delay_ms(10);
}
if(temp>=250)return 1;
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
RCC_RTCCLKCmd(ENABLE);
RTC_WaitForLastTask();
RTC_WaitForSynchro();
RTC_ITConfig(RTC_IT_SEC|RTC_IT_ALR, ENABLE); //打开RTC的秒中断和闹钟中断
RTC_WaitForLastTask();
RTC_EnterConfigMode(); //进入配置RTC模式
RTC_SetPrescaler(32767);
RTC_SetCounter(0); //初始值设定为0s
RTC_WaitForLastTask();
RTC_SetAlarm(40); //闹钟值设定为40s
RTC_WaitForLastTask(); //等待上述配置完成
RTC_ExitConfigMode(); //退出配置模式
BKP_WriteBackupRegister(BKP_DR1, 0XC0B4);
PWR_BackupAccessCmd(DISABLE); //不允许背部区域写操作
}
else
{
PWR_BackupAccessCmd(DISABLE);
RTC_WaitForSynchro();
RTC_ITConfig(RTC_IT_SEC|RTC_IT_ALR,ENABLE); //打开RTC的秒中断和闹钟中断
RTC_WaitForLastTask();
}
NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn; //RTC全局中断的中断配置
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
return 0;
}
//此初始化函数在主函数中的用法
while(RTC_Init())
{
printf("INIT Programing is ERROR!!\r\n");
}
if (BKP_ReadBackupRegister(BKP_DR1) != 0xC0B4) 的意思就是让STM32上电后自检是不是第一次运行这个程序。BKP_ReadBackupRegister(BKP_DR1)代表读取BKP_DR1的值,如果第一次运行这个程序那这个值一定是0X0000,值和0XC0B4不相等就进入配置初始化程序。BKP_WriteBackupRegister(BKP_DR1, 0XC0B4)代表往BKP_DR1这个寄存器中写入0XC0B4,注意BKP_DR1这个值被写入之后就算复位他也不会被清除成0000。这样的话就算复位或者重新上电,初始程序也不会再执行一遍,所以RTC的值就不会再重新设置了。如果想要RTC的值重新从0开始计数,那就可以吧0XC0B4改成一个新的数字,重新下载一次程序就可以了。
接下来的时钟配置选择打开外部低速时钟LSE,它向RTC提供时钟频率。它频率为是32.768KHZ.我们需要分频后使用它。分成1HZ。
根据上图1HZ = 32768/(32767+1) 所以RTC_SetPrescaler(32767)就能明白什么意思了吧。 为RTC提供时钟频率还是有两种选择的,这里我们用一种就够了。 RTC_WaitForLastTask()和RTC_WaitForSynchro()都是等待最近的写操作完成的意思,在RTC配置的时候这两条尤其第一条都是很重要的,如果添加位置不当或缺失程序有时候会卡在一个地方。 |
接下来打开RTC的秒中断和闹钟中断。在接下来就是对RTC的一些具体配置比如初始值和计数频率以及闹钟数值的配置。按照ST的说法:
接下来打开RTC的秒中断和闹钟中断。在接下来就是对RTC的一些具体配置比如初始值和计数频率以及闹钟数值的配置。按照ST的说法:下面就是RTC全局中断的介绍:
复制文章来源:https://www.toymoban.com/news/detail-851247.html
void RTC_IRQHandler()
{
if(RTC_GetITStatus(RTC_IT_ALR)!=RESET) //是否闹钟中断发生
{
printf("THE ALARM READY =%d \r\n",RTC_GetCounter());//输出此时的秒数
RTC_ClearITPendingBit(RTC_IT_ALR);
PWR_BackupAccessCmd(ENABLE);
RTC_EnterConfigMode();
RTC_WaitForLastTask();
RTC_SetAlarm(40+RTC_GetCounter()); //配置下次闹钟为40s后
RTC_WaitForLastTask();
RTC_ExitConfigMode();
PWR_BackupAccessCmd(DISABLE);
}
if(RTC_GetITStatus(RTC_IT_SEC)!=RESET) //是否秒中断发生
{
printf("Time is =%d \r\n",RTC_GetCounter()); //输出此时的秒数
}
RTC_ClearITPendingBit(RTC_IT_SEC|RTC_IT_OW); //清除秒中断标志位和溢出位
RTC_WaitForLastTask();
}
文章来源地址https://www.toymoban.com/news/detail-851247.html
到了这里,关于【无标题】STM32 RTC闹钟中断和唤醒待机模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!