[产品应用] 使用芯源CW32 MCU实现低功耗模式下的RTC定时唤醒功能

[复制链接]
1826|12
 楼主| Clyde011 发表于 2024-10-4 12:46 | 显示全部楼层 |阅读模式
最近在项目中,我使用了芯源的CW32 MCU,并成功实现了低功耗模式下通过RTC定时唤醒系统的功能。这篇帖子将分享我的实现过程以及一些代码片段,希望能对大家有所帮助。

1. 项目背景
在低功耗应用场景中,MCU通常需要进入睡眠模式以降低功耗,同时还需要保持某些功能运行,如定时唤醒系统来执行任务。CW32 MCU的RTC模块具备低功耗下保持运行的能力,因此我决定使用RTC定时唤醒MCU,并记录时间。

2. 硬件准备
我使用了CW32 MCU开发板,并通过外接一个32.768kHz的晶振为RTC提供时钟源。主系统时钟会在不需要时被关闭,从而降低功耗。

3. 实现流程
  • RTC初始化:首先,我配置RTC时钟源为外部低速晶振(LSE),并设置时间和日期。
  • 进入低功耗模式:然后,将MCU置于睡眠模式,并通过RTC定时唤醒。
  • 唤醒后的处理:每次系统唤醒后读取时间,并打印出来。

4. 代码实现
RTC初始化代码
  1. void RTC_Init(void) {
  2.     RTC_TimeTypeDef sTime = {0};
  3.     RTC_DateTypeDef sDate = {0};

  4.     // 使能RTC时钟
  5.     __HAL_RCC_RTC_ENABLE();
  6.    
  7.     // 配置RTC时钟源为LSE
  8.     RTC_HandleTypeDef hrtc;
  9.     hrtc.Instance = RTC;
  10.     hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
  11.     hrtc.Init.AsynchPrediv = 127;
  12.     hrtc.Init.SynchPrediv = 255;
  13.     hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
  14.     hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
  15.     hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
  16.     hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;

  17.     if (HAL_RTC_Init(&hrtc) != HAL_OK) {
  18.         Error_Handler();
  19.     }

  20.     // 设置时间
  21.     sTime.Hours = 0x12;
  22.     sTime.Minutes = 0x30;
  23.     sTime.Seconds = 0x00;
  24.     HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
  25.    
  26.     // 设置日期
  27.     sDate.WeekDay = RTC_WEEKDAY_MONDAY;
  28.     sDate.Month = RTC_MONTH_JANUARY;
  29.     sDate.Date = 0x01;
  30.     sDate.Year = 0x21;
  31.     HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
  32. }



低功耗模式设置
  1. void Enter_LowPowerMode(void) {
  2.     // 使能RTC中断
  3.     HAL_NVIC_SetPriority(RTC_Alarm_IRQn, 0, 0);
  4.     HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn);

  5.     // 设置闹钟触发时间,1分钟后唤醒
  6.     RTC_AlarmTypeDef sAlarm = {0};
  7.     sAlarm.AlarmTime.Hours = 0x12;
  8.     sAlarm.AlarmTime.Minutes = 0x31;
  9.     sAlarm.AlarmTime.Seconds = 0x00;
  10.     sAlarm.Alarm = RTC_ALARM_A;
  11.     HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN);

  12.     // MCU进入低功耗模式
  13.     HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
  14. }
唤醒后读取时间
  1. void RTC_Alarm_IRQHandler(void) {
  2.     HAL_RTC_AlarmIRQHandler(&hrtc);

  3.     // 获取当前时间
  4.     RTC_TimeTypeDef sTime;
  5.     RTC_DateTypeDef sDate;
  6.    
  7.     HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
  8.     HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN);

  9.     printf("当前时间: %02d:%02d:%02d\n", sTime.Hours, sTime.Minutes, sTime.Seconds);
  10. }

5. 测试结果
通过上述代码,MCU成功进入睡眠模式,并在1分钟后由RTC闹钟中断唤醒,唤醒后能正确读取并打印当前时间。整个流程非常流畅,低功耗模式下的功耗显著降低,非常适合应用于长时间运行的物联网设备中。

6. 总结
芯源CW32 MCU的RTC功能在低功耗应用中非常实用,尤其是在需要定时任务的场景下。我个人在这个项目中获得了不少收获,期待能在更多低功耗应用中使用CW32 MCU。

如果大家在使用过程中遇到问题或有其他需求,欢迎一起讨论!

公羊子丹 发表于 2024-10-4 12:47 | 显示全部楼层
哇,这个RTC定时唤醒功能看起来挺实用的!正好我最近也在研究低功耗,学习了!
周半梅 发表于 2024-10-4 12:47 | 显示全部楼层
你的代码写得很清晰,我之前在配置RTC的时候卡了好久,看来是忽略了中断那块。谢谢分享!
帛灿灿 发表于 2024-10-4 12:47 | 显示全部楼层
看完你的帖子,感觉芯源的CW32 MCU在低功耗方面还真有点厉害啊,准备试试。
童雨竹 发表于 2024-10-4 12:48 | 显示全部楼层
这个RTC唤醒设置时间的方式我觉得很灵活,有没有其他定时任务的例子可以分享下?
万图 发表于 2024-10-4 12:48 | 显示全部楼层
实际测试功耗降低了多少?很想知道你用在什么项目上,感觉特别适合做长期供电的设备。
Wordsworth 发表于 2024-10-4 12:48 | 显示全部楼层
我也用过CW32,RTC挺方便的,低功耗模式下稳定性不错!你的代码结构很整齐,学习了!
Bblythe 发表于 2024-10-4 12:48 | 显示全部楼层
你用的32.768kHz晶振是板子上自带的吗?我自己接了一个,有时候不太准。
Pulitzer 发表于 2024-10-4 12:49 | 显示全部楼层
低功耗模式下的功耗表现如何?有用仪器测过具体的mA吗?
Uriah 发表于 2024-10-4 12:49 | 显示全部楼层
谢谢分享代码,正好我项目上用到RTC,赶紧参考一下!
星辰大海不退缩 发表于 2024-10-8 22:29 | 显示全部楼层
CW32 MCU的RTC功能在低功耗应用中非常实用
chenqianqian 发表于 2024-10-9 07:30 来自手机 | 显示全部楼层
在低功耗应用中,主要就是通过定时唤醒或者外部中断事件来唤醒MCU。
小小蚂蚁举千斤 发表于 2024-10-9 17:30 | 显示全部楼层
RTC定时中断唤醒功能非常符合现有项目需求
您需要登录后才可以回帖 登录 | 注册

本版积分规则

155

主题

5872

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部