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");
-
- }
|