stm32f103c8t6 待机模式 rtc
时间: 2023-08-23 11:05:40 浏览: 192
STM32F103C8T6是一款低功耗的微控制器,它支持多种低功耗模式,包括待机模式。RTC(Real-Time Clock)是一个独立的硬件模块,也可以在待机模式下工作,以提供实时时钟和日历功能。
在进入待机模式之前,需要先配置RTC模块。首先,需要启用RTC时钟,设置时钟源,并配置RTC时钟分频器。然后,设置RTC时钟和日历时间,以及RTC闹钟和中断。
进入待机模式时,需要执行以下步骤:
1. 禁止所有外设时钟和中断。
2. 配置待机模式和唤醒源。
3. 进入待机模式。
唤醒源可以是外部中断、RTC闹钟、UART接收等。当唤醒源触发时,MCU会自动唤醒,并从待机模式中恢复。在唤醒后,需要重新启用外设时钟和中断,并重新配置RTC时钟和日历时间。
下面是一个简单的示例代码,演示如何配置RTC和进入待机模式:
```c
// 启用RTC时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
// 设置RTC时钟源和分频器
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
RCC_RTCCLKCmd(ENABLE);
RTC_WaitForSynchro();
// 配置RTC时钟和日历时间
RTC_InitTypeDef RTC_InitStruct;
RTC_InitStruct.RTC_HourFormat = RTC_HourFormat_24;
RTC_InitStruct.RTC_AsynchPrediv = 0x7F;
RTC_InitStruct.RTC_SynchPrediv = 0xFF;
RTC_Init(&RTC_InitStruct);
RTC_TimeTypeDef RTC_TimeStruct;
RTC_TimeStruct.RTC_Hours = 12;
RTC_TimeStruct.RTC_Minutes = 0;
RTC_TimeStruct.RTC_Seconds = 0;
RTC_SetTime(RTC_Format_BIN, &RTC_TimeStruct);
RTC_DateTypeDef RTC_DateStruct;
RTC_DateStruct.RTC_WeekDay = RTC_Weekday_Wednesday;
RTC_DateStruct.RTC_Month = RTC_Month_June;
RTC_DateStruct.RTC_Date = 30;
RTC_DateStruct.RTC_Year = 21;
RTC_SetDate(RTC_Format_BIN, &RTC_DateStruct);
// 配置RTC闹钟和中断
RTC_AlarmTypeDef RTC_AlarmStruct;
RTC_AlarmStruct.RTC_AlarmTime.RTC_Hours = 12;
RTC_AlarmStruct.RTC_AlarmTime.RTC_Minutes = 5;
RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds = 0;
RTC_AlarmStruct.RTC_AlarmDateWeekDaySel = RTC_AlarmDateWeekDaySel_Date;
RTC_AlarmStruct.RTC_AlarmDateWeekDay = 0x1F;
RTC_AlarmStruct.RTC_AlarmMask = RTC_AlarmMask_DateWeekDay;
RTC_SetAlarm(RTC_Format_BIN, RTC_Alarm_A, &RTC_AlarmStruct);
RTC_ITConfig(RTC_IT_ALR, ENABLE);
NVIC_EnableIRQ(RTC_IRQn);
// 配置待机模式和唤醒源
PWR_EnterSTANDBYMode();
// 唤醒后重新配置RTC时钟和日历时间
RTC_TimeStruct.RTC_Hours = 12;
RTC_TimeStruct.RTC_Minutes = 5;
RTC_TimeStruct.RTC_Seconds = 0;
RTC_SetTime(RTC_Format_BIN, &RTC_TimeStruct);
RTC_DateStruct.RTC_WeekDay = RTC_Weekday_Wednesday;
RTC_DateStruct.RTC_Month = RTC_Month_June;
RTC_DateStruct.RTC_Date = 30;
RTC_DateStruct.RTC_Year = 21;
RTC_SetDate(RTC_Format_BIN, &RTC_DateStruct);
```
阅读全文