帮忙写一下STM32校准内置rtc的完整代码
时间: 2023-07-10 19:05:59 浏览: 205
MAX31856的STM32代码,完整,好用,注释清晰,本人原创。还有中文资料和原理图。
5星 · 资源好评率100%
好的,下面是一份基于STM32的校准内置RTC的完整代码:
```c
#include "stm32f4xx.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_pwr.h"
#include "stm32f4xx_rtc.h"
#include "stm32f4xx_tim.h"
#include "stm32f4xx_usart.h"
#include "misc.h"
#define RTC_CLOCK_SOURCE_LSE /* 使用外部低速晶振作为RTC时钟源 */
__IO uint32_t AsynchPrediv = 0, SynchPrediv = 0;
volatile uint8_t rtc_set_flag = 0;
void RTC_Config(void);
void RTC_TimeRegulate(uint32_t TimeVar);
void RTC_AlarmConfig(void);
int main(void)
{
RTC_TimeTypeDef RTC_TimeStructure;
RTC_DateTypeDef RTC_DateStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
PWR_BackupAccessCmd(ENABLE); /* 允许访问备份寄存器 */
RTC_Config(); /* 配置RTC */
if (RTC_ReadBackupRegister(RTC_BKP_DR0) != 0x32F2) /* 判断是否第一次配置 */
{
RTC_TimeStructure.RTC_Hours = 0x00;
RTC_TimeStructure.RTC_Minutes = 0x00;
RTC_TimeStructure.RTC_Seconds = 0x00;
RTC_TimeStructure.RTC_H12 = RTC_H12_AM;
RTC_DateStructure.RTC_Year = 0x20;
RTC_DateStructure.RTC_Month = RTC_Month_January;
RTC_DateStructure.RTC_Date = 0x01;
RTC_DateStructure.RTC_WeekDay = RTC_Weekday_Thursday;
RTC_TimeRegulate(RTC_Format_BIN); /* 初始化RTC时间 */
RTC_WriteBackupRegister(RTC_BKP_DR0, 0x32F2); /* 标记已经初始化过 */
}
else
{
RTC_TimeRegulate(RTC_Format_BIN); /* 恢复之前设置的RTC时间 */
}
RTC_AlarmConfig(); /* 配置RTC闹钟 */
while (1)
{
if (rtc_set_flag) /* 如果需要设置时间,则进入设置时间模式 */
{
rtc_set_flag = 0;
RTC_TimeStructure.RTC_Hours = 0x00;
RTC_TimeStructure.RTC_Minutes = 0x00;
RTC_TimeStructure.RTC_Seconds = 0x00;
RTC_TimeStructure.RTC_H12 = RTC_H12_AM;
RTC_DateStructure.RTC_Year = 0x20;
RTC_DateStructure.RTC_Month = RTC_Month_January;
RTC_DateStructure.RTC_Date = 0x01;
RTC_DateStructure.RTC_WeekDay = RTC_Weekday_Thursday;
RTC_TimeRegulate(RTC_Format_BIN); /* 进入时间设置模式,等待用户设置时间 */
}
RTC_GetTime(RTC_Format_BIN, &RTC_TimeStructure); /* 获取RTC时间 */
RTC_GetDate(RTC_Format_BIN, &RTC_DateStructure); /* 获取RTC日期 */
printf("Current Time: %02d:%02d:%02d\n", RTC_TimeStructure.RTC_Hours, RTC_TimeStructure.RTC_Minutes, RTC_TimeStructure.RTC_Seconds);
printf("Current Date: %02d/%02d/%02d\n", RTC_DateStructure.RTC_Year, RTC_DateStructure.RTC_Month, RTC_DateStructure.RTC_Date);
delay_ms(1000); /* 每隔1秒更新一次时间 */
}
}
void RTC_Config(void)
{
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); /* 配置RTC时钟源 */
RCC_RTCCLKCmd(ENABLE); /* 使能RTC时钟 */
RTC_WaitForSynchro(); /* 等待RTC寄存器同步 */
RTC_InitStructure.RTC_AsynchPrediv = 0x7F; /* 计算异步分频器的值 */
RTC_InitStructure.RTC_SynchPrediv = 0xFF; /* 计算同步分频器的值 */
RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24; /* 设置小时格式 */
RTC_Init(&RTC_InitStructure); /* 初始化RTC */
RTC_ITConfig(RTC_IT_ALRA, ENABLE); /* 使能RTC闹钟中断 */
NVIC_EnableIRQ(RTC_Alarm_IRQn); /* 使能RTC闹钟中断 */
RTC_TamperCmd(DISABLE); /* 关闭RTC Tamper功能 */
RTC_TamperFilterConfig(RTC_TamperFilter_Disable); /* 禁用Tamper滤波器 */
RTC_TamperSamplingFreqConfig(RTC_TamperSamplingFreq_RTCCLK_Div32768); /* 设置Tamper采样频率 */
RTC_TamperPinsPrechargeDuration(RTC_TamperPrechargeDuration_1RTCCLK); /* 设置Tamper预充电时间 */
RTC_TamperPullUpCmd(DISABLE); /* 禁用Tamper上拉电阻 */
}
void RTC_TimeRegulate(uint32_t TimeVar)
{
RTC_TimeTypeDef RTC_TimeStructure;
RTC_DateTypeDef RTC_DateStructure;
RTC_TimeStructInit(&RTC_TimeStructure); /* 初始化RTC时间 */
if (TimeVar == RTC_Format_BIN) /* 如果是二进制格式 */
{
RTC_TimeStructure.RTC_Hours = 0x00; /* 小时 */
RTC_TimeStructure.RTC_Minutes = 0x00; /* 分钟 */
RTC_TimeStructure.RTC_Seconds = 0x00; /* 秒钟 */
RTC_TimeStructure.RTC_H12 = RTC_H12_AM; /* 设置为AM */
RTC_DateStructure.RTC_Year = 0x20; /* 年份 */
RTC_DateStructure.RTC_Month = RTC_Month_January; /* 月份 */
RTC_DateStructure.RTC_Date = 0x01; /* 日 */
RTC_DateStructure.RTC_WeekDay = RTC_Weekday_Thursday; /* 星期 */
}
RTC_SetTime(TimeVar, &RTC_TimeStructure); /* 设置RTC时间 */
RTC_SetDate(TimeVar, &RTC_DateStructure); /* 设置RTC日期 */
}
void RTC_AlarmConfig(void)
{
RTC_AlarmTypeDef RTC_AlarmStructure;
RTC_AlarmCmd(RTC_Alarm_A, DISABLE); /* 关闭RTC闹钟A */
RTC_AlarmStructInit(&RTC_AlarmStructure); /* 初始化RTC闹钟A */
RTC_AlarmStructure.RTC_AlarmTime.RTC_Hours = 0x00; /* 闹钟小时 */
RTC_AlarmStructure.RTC_AlarmTime.RTC_Minutes = 0x01; /* 闹钟分钟 */
RTC_AlarmStructure.RTC_AlarmTime.RTC_Seconds = 0x00; /* 闹钟秒钟 */
RTC_AlarmStructure.RTC_AlarmTime.RTC_H12 = RTC_H12_AM; /* 设置为AM */
RTC_AlarmStructure.RTC_AlarmDateWeekDaySel = RTC_AlarmDateWeekDaySel_Date; /* 闹钟匹配日期而非星期 */
RTC_AlarmStructure.RTC_AlarmDateWeekDay = 0x01; /* 闹钟日期为1号 */
RTC_AlarmStructure.RTC_AlarmMask = RTC_AlarmMask_None; /* 不忽略任何字段 */
RTC_SetAlarm(RTC_Format_BIN, RTC_Alarm_A, &RTC_AlarmStructure); /* 设置RTC闹钟A */
RTC_AlarmCmd(RTC_Alarm_A, ENABLE); /* 使能RTC闹钟A */
}
void RTC_Alarm_IRQHandler(void)
{
if (RTC_GetITStatus(RTC_IT_ALRA) != RESET) /* 如果是RTC闹钟中断 */
{
RTC_ClearITPendingBit(RTC_IT_ALRA); /* 清除中断标志位 */
rtc_set_flag = 1; /* 标记需要设置时间 */
RTC_AlarmCmd(RTC_Alarm_A, DISABLE); /* 关闭RTC闹钟A */
}
}
```
需要注意的是,该代码使用了外部低速晶振作为RTC时钟源。如果使用其他时钟源,则需要相应修改代码中的相关配置。另外,代码中的时间设置模式仅为示例,可以根据实际需求进行修改。
阅读全文