stm32的RTC闹钟

1.在HAL_RTC_MspInit中开中断:

/*##-4- Configure the NVIC for RTC Alarm ###################################*/
	HAL_NVIC_SetPriority(41, 0x0f, 0);
	HAL_NVIC_EnableIRQ(41);
注意:SubPriority的问题,因为使用的是最低的优先级,导致中断一直都等不到,后来把优先级设成最高,终于可以了,但是还没搞明白》》》》》》》问题待思考。


2.编写RTC_Alarm_IRQHandler中断函数(不编写会导致找不到RTC_Alarm的中断函数转为default中断)

extern RTC_HandleTypeDef RtcHandle;
void RTC_Alarm_IRQHandler(void)
{
	HAL_RTC_AlarmIRQHandler(&RtcHandle);
}


### STM32 RTC 闹钟功能配置与实现 #### 配置概述 STM32RTC 模块支持两个独立的闹钟事件(Alarm A 和 Alarm B)。这些闹钟可以通过设置特定的时间触发中断或唤醒系统。RTC 的时钟源可以选择外部晶体振荡器(LSE)、内部低速时钟(LSI)或其他分频后的时钟信号[^1]。 为了确保时间精度,推荐使用 LSE(32.768 kHz 外部晶振)作为 RTC 的时钟源。通过初始化 RTC 并配置相应的闹钟参数,可以实现定时提醒或周期性操作的功能。 --- #### 初始化代码示例 以下是基于 HAL 库的 STM32 RTC 初始化和闹钟配置代码: ```c #include "stm32f4xx_hal.h" // RTC 初始化函数 void Rtc_My_Init(void) { RCC_PeriphCLKInitTypeDef PeriphClkInitStruct; // 启用 LSE 作为 RTC 时钟源 __HAL_RCC_PWR_CLK_ENABLE(); HAL_PWR_EnableBkUpAccess(); PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; // 使用 LSE if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) { Error_Handler(); } // 开启 RTC 时钟 __HAL_RCC_BKP_CLK_ENABLE(); __HAL_RCC_RTC_ENABLE(); RTC_TimeTypeDef sTime = {0}; RTC_DateTypeDef sDate = {0}; // 设置当前时间和日期 sTime.Hours = 12; sTime.Minutes = 30; sTime.Seconds = 0; sDate.WeekDay = RTC_WEEKDAY_MONDAY; sDate.Month = RTC_MONTH_JANUARY; sDate.Date = 1; sDate.Year = 23; if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK || HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK) { Error_Handler(); } } // 配置闹钟 A void RTC_Alarm_MyA(void) { RTC_AlarmTypeDef sAlarm = {0}; sAlarm.Alarm = RTC_ALARM_A; sAlarm.AlarmTime.Hours = 13; sAlarm.AlarmTime.Minutes = 0; sAlarm.AlarmTime.Seconds = 0; sAlarm.AlarmMask = RTC_ALARMMASK_NONE; // 不屏蔽任何字段 sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_ALL; // 子秒掩码全选 if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK) { Error_Handler(); } } ``` 上述代码实现了以下功能: - **启用 LSE**:将 LSE 设定为 RTC 的时钟源。 - **设置初始时间和日期**:通过 `HAL_RTC_SetTime` 和 `HAL_RTC_SetDate` 函数完成。 - **配置闹钟 A**:设定时间为每天下午 1 点整,并开启中断模式。 --- #### 中断处理程序 当闹钟被触发时,会进入对应的中断服务程序(ISR)。以下是 ISR 的简单实现: ```c void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc) { // 当闹钟 A 被触发时执行的操作 LED_Toggle(); // 假设有一个 LED 切换函数用于指示闹钟已触发 } ``` 此回调函数会在每次闹钟 A 触发时调用,可以根据实际需求修改其中的内容。 --- #### 注意事项 1. 如果需要使用多个闹钟,则需分别配置 Alarm A 和 Alarm B。 2. 在调试过程中,建议检查 LSE 是否正常工作以及 RTC 寄存器是否正确写入数据[^2]。 3. 若使用 CubeMX 工具生成项目框架,记得在时钟树中使能 LSE 及 RTC 功能。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值