RTC毫秒级Alarm触发
程序员文章站
2024-02-22 20:31:47
...
- RTC闹钟设置寄存器
当可编程计数器的值与RTC_ALR中的32位值相等时,即触发一个闹钟事件,并且产生RTC闹钟 中断。
- RTC可编程计数器
RTC核有一个32位可编程的计数器,可通过两个16位的寄存器访问。计数器以预分频器产生的 TR_CLK时间基准为参考进行计数。RTC_CNT寄存器用来存放计数器的计数值。
- 操作步骤:
1.去掉写保护
2.允许闹钟中断
3.配置闹钟时间,也就是写RTC_ALR寄存器
4.加上写保护
以上是在RTC时钟初始化完成的基础上
当以RTC时钟经过分频之后的时基上计数,计数的值存放在RTC_CNT中,当RTC_CNT的值==RTC_ALR得值时,产生闹钟中断,然后在闹钟中断中清零RTC_CNT,使其产生下一次闹钟中断
毫米级的实现,设置分频值为40,则RTC以1K的频率计数,记一次数为1ms,设置RTC_ALR=1;就会没隔1ms产生一次闹钟中断。
- 源码:
#include "hardware.h"
/**
* @brief RTC中断初始化,用于睡眠定时唤醒
* @param
* @retval
*/
void rtc_INT_init(uint16_t ms)
{
LL_RTC_InitTypeDef RTC_InitStruct = {0};
LL_PWR_EnableBkUpAccess();
/* Enable BKP CLK enable for backup registers */
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_BKP);
/* Peripheral clock enable */
LL_RCC_EnableRTC();
/* RTC interrupt Init */
NVIC_SetPriority(RTC_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),0, 0));
NVIC_EnableIRQ(RTC_IRQn);
/** Initialize RTC and set the Time and Date
*/
RTC_InitStruct.AsynchPrescaler = 40;
LL_RTC_Init(RTC, &RTC_InitStruct);
LL_RTC_DisableWriteProtection(RTC);
LL_RTC_EnableIT_ALR(RTC);
LL_RTC_ALARM_Set(RTC, ms);
LL_RTC_EnableWriteProtection(RTC);
/*寄存器版*/
//RTC->CRL|=1<<4; //进入配置模式
//RTC->ALRH=0x0000; //设置闹钟时间高位数据
//RTC->ALRL=ms; //设置闹钟时间低位数据,以RTC时钟频率计数到该值产生闹钟中断
//RTC->CRH|=1<<1; //允许闹钟中断
//RTC->CRL&=~(1<<4); //退出配置模式
}
void RTC_IRQHandler(void)
{
if(LL_RTC_IsActiveFlag_ALR(RTC))
{
LL_RTC_ClearFlag_ALR(RTC);
LL_RTC_DisableWriteProtection(RTC);
LL_RTC_TIME_Set(RTC, 0x0000);
LL_RTC_EnableWriteProtection(RTC);
/*寄存器版*/
//RTC->CRL|=1<<4; //进入配置模式
//RTC->CNTH=0x0000; //设置计数器高位
//RTC->CNTL=0x0000; //设置计数器低位,闹钟中断中清零该寄存器使其产生下一次闹钟中断
//RTC->CRL&=~(1<<4); //退出配置模式
}
}
推荐阅读