最近在项目中,我使用了芯源的CW32 MCU,并成功实现了低功耗模式下通过RTC定时唤醒系统的功能。这篇帖子将分享我的实现过程以及一些代码片段,希望能对大家有所帮助。
1. 项目背景
在低功耗应用场景中,MCU通常需要进入睡眠模式以降低功耗,同时还需要保持某些功能运行,如定时唤醒系统来执行任务。CW32 MCU的RTC模块具备低功耗下保持运行的能力,因此我决定使用RTC定时唤醒MCU,并记录时间。
2. 硬件准备
我使用了CW32 MCU开发板,并通过外接一个32.768kHz的晶振为RTC提供时钟源。主系统时钟会在不需要时被关闭,从而降低功耗。
3. 实现流程- RTC初始化:首先,我配置RTC时钟源为外部低速晶振(LSE),并设置时间和日期。
- 进入低功耗模式:然后,将MCU置于睡眠模式,并通过RTC定时唤醒。
- 唤醒后的处理:每次系统唤醒后读取时间,并打印出来。
4. 代码实现
RTC初始化代码:
void RTC_Init(void) {
RTC_TimeTypeDef sTime = {0};
RTC_DateTypeDef sDate = {0};
// 使能RTC时钟
__HAL_RCC_RTC_ENABLE();
// 配置RTC时钟源为LSE
RTC_HandleTypeDef hrtc;
hrtc.Instance = RTC;
hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
hrtc.Init.AsynchPrediv = 127;
hrtc.Init.SynchPrediv = 255;
hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
if (HAL_RTC_Init(&hrtc) != HAL_OK) {
Error_Handler();
}
// 设置时间
sTime.Hours = 0x12;
sTime.Minutes = 0x30;
sTime.Seconds = 0x00;
HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
// 设置日期
sDate.WeekDay = RTC_WEEKDAY_MONDAY;
sDate.Month = RTC_MONTH_JANUARY;
sDate.Date = 0x01;
sDate.Year = 0x21;
HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
}
低功耗模式设置:
void Enter_LowPowerMode(void) {
// 使能RTC中断
HAL_NVIC_SetPriority(RTC_Alarm_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn);
// 设置闹钟触发时间,1分钟后唤醒
RTC_AlarmTypeDef sAlarm = {0};
sAlarm.AlarmTime.Hours = 0x12;
sAlarm.AlarmTime.Minutes = 0x31;
sAlarm.AlarmTime.Seconds = 0x00;
sAlarm.Alarm = RTC_ALARM_A;
HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN);
// MCU进入低功耗模式
HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
}
唤醒后读取时间:
void RTC_Alarm_IRQHandler(void) {
HAL_RTC_AlarmIRQHandler(&hrtc);
// 获取当前时间
RTC_TimeTypeDef sTime;
RTC_DateTypeDef sDate;
HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
printf("当前时间: %02d:%02d:%02d\n", sTime.Hours, sTime.Minutes, sTime.Seconds);
}
5. 测试结果
通过上述代码,MCU成功进入睡眠模式,并在1分钟后由RTC闹钟中断唤醒,唤醒后能正确读取并打印当前时间。整个流程非常流畅,低功耗模式下的功耗显著降低,非常适合应用于长时间运行的物联网设备中。
6. 总结
芯源CW32 MCU的RTC功能在低功耗应用中非常实用,尤其是在需要定时任务的场景下。我个人在这个项目中获得了不少收获,期待能在更多低功耗应用中使用CW32 MCU。
如果大家在使用过程中遇到问题或有其他需求,欢迎一起讨论!
|