RTC毫秒级Alarm触发

  1. RTC闹钟设置寄存器

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

在这里插入图片描述

  1. RTC可编程计数器

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

在这里插入图片描述

  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);			//退出配置模式
	}
}

原文地址:https://www.cnblogs.com/hhsxy/p/14018383.html