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