STM32F103RCT6 用内部RTC 内部晶振实现1S 定时的代码
时间: 2024-12-20 21:16:20 浏览: 26
STM32F103RCT6是一款基于Cortex-M3内核的微控制器,其内部集成了Real-Time Clock (RTC)模块,可以用于定时任务。下面是一个简单的示例,展示如何利用内部RTC和内部晶振设置1秒定时:
```c
#include "stm32f1xx_hal.h"
// 定义RTC时间结构体和配置常量
RTC_HandleTypeDef hrtc;
static RTC_TimeTypeDef s_timeType;
static RTC_DateTypeDef s_date;
// 初始化函数
void init_RTC(void)
{
// 配置RTC时钟源为内部振荡器(默认)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
PWR_BackupAccessCmd(ENABLE); // 允许对备用寄存器区的访问
// 初始化RTC
hrtc.Instance = RTC;
hrtc.Init.HourFormat = RTC_HourFormat_24; // 小时格式24小时制
hrtc.Init.DateOrder = RTC_Date_LMDD; // 日期顺序为日-月-年
hrtc.Init.DaylightSaving = RTC_DateSave_Off; // 关闭夏令时
HAL_RTC_Init(&hrtc);
// 设置时间为当前时间 + 1秒
s_timeType.Hours = 0;
s_timeType.Minutes = 0;
s_timeType.Seconds = 1; // 设定秒数为1
s_date.WeekDay = RTC_WD_Saturday;
s_date.Month = RTC_January;
s_date.Date = 1; // 设定日期为1(此处假设为当前日期+1)
HAL_RTC_SetTime(&hrtc, &s_timeType, NULL);
HAL_RTC_SetDate(&hrtc, &s_date, NULL);
}
// 每隔一秒触发的回调函数
void RTC_IRQHandler(void)
{
if (HAL_RTC_GetStatus(&hrtc) == RTC_STATUS_TIMESTAMP_OVERFLOW)
{
// 当RTC计时溢出时,这里处理1秒定时完成的业务逻辑
// ...
HAL_RTC_ResetTimer(&hrtc); // 重置计时器
}
}
// 主程序入口
int main(void)
{
init_RTC();
// 开启RTC中断
__HAL_RCC_RTC_ENABLE();
HAL_NVIC_SetPriority(RTC_IRQn, 0, 0); // 设置RTC中断优先级
HAL_NVIC_EnableIRQ(RTC_IRQn);
while (1) {
// ... 其他主循环内容
}
return 0;
}
```
阅读全文