打印
[产品应用]

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

[复制链接]
44|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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初始化代码
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。

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

使用特权

评论回复
沙发
公羊子丹| | 2024-10-4 12:47 | 只看该作者
哇,这个RTC定时唤醒功能看起来挺实用的!正好我最近也在研究低功耗,学习了!

使用特权

评论回复
板凳
周半梅| | 2024-10-4 12:47 | 只看该作者
你的代码写得很清晰,我之前在配置RTC的时候卡了好久,看来是忽略了中断那块。谢谢分享!

使用特权

评论回复
地板
帛灿灿| | 2024-10-4 12:47 | 只看该作者
看完你的帖子,感觉芯源的CW32 MCU在低功耗方面还真有点厉害啊,准备试试。

使用特权

评论回复
5
童雨竹| | 2024-10-4 12:48 | 只看该作者
这个RTC唤醒设置时间的方式我觉得很灵活,有没有其他定时任务的例子可以分享下?

使用特权

评论回复
6
万图| | 2024-10-4 12:48 | 只看该作者
实际测试功耗降低了多少?很想知道你用在什么项目上,感觉特别适合做长期供电的设备。

使用特权

评论回复
7
Wordsworth| | 2024-10-4 12:48 | 只看该作者
我也用过CW32,RTC挺方便的,低功耗模式下稳定性不错!你的代码结构很整齐,学习了!

使用特权

评论回复
8
Bblythe| | 2024-10-4 12:48 | 只看该作者
你用的32.768kHz晶振是板子上自带的吗?我自己接了一个,有时候不太准。

使用特权

评论回复
9
Pulitzer| | 2024-10-4 12:49 | 只看该作者
低功耗模式下的功耗表现如何?有用仪器测过具体的mA吗?

使用特权

评论回复
10
Uriah| | 2024-10-4 12:49 | 只看该作者
谢谢分享代码,正好我项目上用到RTC,赶紧参考一下!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

3271

帖子

0

粉丝