【无标题】STM32 RTC闹钟中断和唤醒待机模式

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全局中断的介绍:
 

复制

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();

}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值