最近在项目中,我使用了芯源的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。
如果大家在使用过程中遇到问题或有其他需求,欢迎一起讨论!
|