欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

RTC毫秒级Alarm触发

程序员文章站 2024-02-22 20:31:47
...
  1. RTC闹钟设置寄存器

当可编程计数器的值与RTC_ALR中的32位值相等时,即触发一个闹钟事件,并且产生RTC闹钟 中断。

RTC毫秒级Alarm触发

  1. RTC可编程计数器

RTC核有一个32位可编程的计数器,可通过两个16位的寄存器访问。计数器以预分频器产生的 TR_CLK时间基准为参考进行计数。RTC_CNT寄存器用来存放计数器的计数值。

RTC毫秒级Alarm触发

  1. 操作步骤:

1.去掉写保护
2.允许闹钟中断
3.配置闹钟时间,也就是写RTC_ALR寄存器
4.加上写保护
以上是在RTC时钟初始化完成的基础上
当以RTC时钟经过分频之后的时基上计数,计数的值存放在RTC_CNT中,当RTC_CNT的值==RTC_ALR得值时,产生闹钟中断,然后在闹钟中断中清零RTC_CNT,使其产生下一次闹钟中断
毫米级的实现,设置分频值为40,则RTC以1K的频率计数,记一次数为1ms,设置RTC_ALR=1;就会没隔1ms产生一次闹钟中断。

  1. 源码:
#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);			//退出配置模式
	}
}