STM32RTC配置代码
时间: 2025-01-07 21:50:49 浏览: 17
### STM32 RTC 配置 示例代码 教程
#### 使用STM32CubeMX进行RTC配置
对于STM32系列微控制器而言,通过STM32CubeMX工具可以简化RTC模块的初始化过程。启动STM32CubeMX并创建新工程,在Pinout & Configuration界面找到RCC选项卡下的Low Power Settings部分开启LSE(低速外部晶振),这是RTC工作的基础条件之一[^1]。
接着进入Clock Configuration页面调整系统时钟树形结构图中的LSI/LSE作为RTC时基源。之后切换至Connectivity标签页内的RTC节点设定Time和Date参数值以及Alarm中断使能状态等属性。
完成上述硬件层面上的基础搭建工作后点击GENERATE CODE按钮自动生成初始化C语言框架文件供后续开发使用。
#### 初始化函数解析
生成后的`main.c`文件里包含了如下所示的关键初始化语句:
```c
/* USER CODE BEGIN PV */
RTC_HandleTypeDef hrtc;
/* USER CODE END PV */
/* USER CODE BEGIN PM */
static void MX_RTC_Init(void);
/* USER CODE END PM */
int main(void)
{
/* Initialize all configured peripherals */
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART2_UART_Init();
MX_IWDG_Init();
MX_RTC_Init();
while (1)
{
// 主循环体...
}
}
/**
* @brief RTC MSP Initialization
* This function configures the hardware resources used in this example:
* - Peripheral's clock enable
* - Peripheral's GPIO Configuration
* @param hrtc: RTC handle pointer
* @retval None
*/
void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc)
{
if(hrtc->Instance==RTC)
{
__HAL_RCC_BKP_CLK_ENABLE();
/**Enable BKP reset state and clear it to avoid potential issues after a system reset.
*/
__HAL_RCC_BACKUPRESET_FORCE();
__HAL_RCC_BACKUPRESET_RELEASE();
/**Configure the source of time base synchronization signal for the calendar counter.
*/
__HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSI); // 或者 RCC_RTCCLKSOURCE_LSE
/**Initialize low power interface clocks before entering STOP mode or using backup domain features.
*/
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSI; // 或者 RCC_RTCCLKSOURCE_LSE
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
/**Ensure that MSI is running when waking up from Stop Mode with RTC Clock enabled,
otherwise, an unexpected behavior may occur due to lack of stable internal oscillator output frequency during wake-up phase.
*/
HAL_PWREx_EnableBkUpRegulator();
}
}
```
以上代码片段展示了如何利用STM32Cube库API来实现基本的时间管理功能,包括但不限于时间日期获取、报警事件触发等功能调用方式。
#### 设置时间和日期
为了向RTC写入具体的时间戳数据,可以通过下面的方法来进行操作:
```c
RTC_TimeTypeDef sTime = {0};
RTC_DateTypeDef DateToUpdate = {0};
// Set Time
sTime.Hours = 0xFF & HOUR;
sTime.Minutes = MINUTE;
sTime.Seconds = SECOND;
if(HAL_OK != HAL_RTC_SetTime(&hrtc,&sTime,FORMAT_BIN))
{
Error_Handler();
}
// Set Date
DateToUpdate.WeekDay = WEEKDAY;
DateToUpdate.Month = MONTH;
DateToUpdate.Date = DAY;
DateToUpdate.Year = YEAR;
if(HAL_OK != HAL_RTC_SetDate(&hrtc,&DateToUpdate,FORMAT_BIN))
{
Error_Handler();
}
```
这里需要注意的是传入给`HAL_RTC_SetTime()`和`HAL_RTC_SetDate()`两个函数的第一个参数应当是指向前述声明过的全局变量`htc`实例对象;第二个参数则分别为表示目标时刻点信息的数据结构指针;第三个参数指定输入格式为二进制形式即`FORMAT_BIN`。
#### 处理秒级更新中断
当需要处理每秒钟到来一次的周期性信号时,则可以在stm32_hal_conf.h头文件中定义宏定义以激活对应类型的IRQ通道,并编写相应的ISR服务例程去响应这种特定场景下产生的异步请求消息:
```c
#define USE_FULL_ASSERT 1
#define HSE_VALUE ((uint32_t)8000000)
extern "C" void RTC_IRQHandler(void){
HAL_RTC_AlarmIRQHandler(&hrtc);
}
void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc){
static uint32_t count=0;
count++;
printf("Second %d\n",count);
}
```
这段程序实现了每当发生一秒间隔过后就会自动打印当前累计次数的效果展示目的。
阅读全文