stm32闹钟的代码
时间: 2024-09-30 13:00:35 浏览: 53
在STM32单片机上设置闹钟通常涉及RTC(实时时钟)模块,这是一个低功耗、高精度的时间管理单元。以下是一个简单的示例,展示如何使用STM32F103的RTC设置定时器闹钟:
```c
#include "stm32f1xx_rcc.h"
#include "stm32f1xx_tim.h"
// RTC相关寄存器地址
#define RTC_CR ((RTC_TypeDef *)RTC_BASE + RCC_RTC_BKUPR)
#define RTC_ALRMAR ((RTC_TypeDef *)RTC_BASE + RTC_ALRMAR)
#define RTC_ALRMARH ((RTC_TypeDef *)RTC_BASE + RTC_ALRMAR + 4)
void init_RTC(void) {
// 开启RTC时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
PWR_BackupAccessCmd(ENABLE);
// 将BKP CR寄存器设为0x66,开启备用时钟
*RTC_CR = 0x66;
// 如果没有配置过RTC,先初始化
if (RTC_GetFlagStatus(RTC_FLAG_WUT) != RESET) {
RTC_ClearITPendingBit(RTC_IT_WUT);
RTC_SetAlarmTime(RTC_Alarm_A, RTC_DateTimeStructSet(2023, 12, 31, 0, 0, 0)); // 设置闹钟时间
RTC_SetWakeUpCounter(RTC WakeUpCounterConfig(WAKEUPCOUNTER_ENABLE, WAKEUPCOUNTER_VALUE_3)); // 配置唤醒计数器
}
}
void set_RTC_alarm(uint16_t hour, uint8_t minute, uint8_t second) {
RTC_DateTimeStruct alarm_time = {0};
alarm_time.hour = hour;
alarm_time.minute = minute;
alarm_time.second = second;
// 更新闹钟时间
*RTC_ALRMAR = alarm_time.hour & 0xFF; // 保存小时到ALRMAR寄存器
*RTC_ALRMARH = alarm_time.hour >> 8;
// 清除闹钟中断标志
RTC_ClearITPendingBit(RTC_IT_ALRA);
}
void enable_RTC_interrupt() {
RTC_ITConfig(RTC_IT_ALRA, ENABLE); // 开启闹钟中断
NVIC_EnableIRQ(RTC_IRQn); // 启动RTC中断处理程序
}
阅读全文