0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

CKS32F4xx系列低功耗模式之STANDBY模式

中科芯MCU 来源:中科芯MCU 2023-07-07 09:41 次阅读

CKS32F4xx低功耗模式

STANDBY模式

第十七期 2023.7.6

本章中,我们主要对CKS32F4xx系列的待机模式(STANDBY)做详细介绍。在该模式下,芯片功耗最低,1.2V供电区域、PLL、HSI和HSE振荡器也完全被关闭。除备份域(RTC寄存器、RTC备份寄存器和备份SRAM)和待机电路中的寄存器外,SRAM和寄存器内容丢失。因此,从待机模式唤醒后,只能从头开始执行程序,那我们如何进入STANDBY模式及唤醒方式,可以按照下述表格中的步骤执行即可:

66834bd4-1bf9-11ee-962d-dac502259ad0.jpg

CKS32F4xx系列标准库把进入STANDBY模式这部分的操作封装到PWR_EnterSTANDBYMode函数中了,需要先通过PWR_CR设置PDDS位以及SLEEPDEEP位,使得芯片进入深度睡眠时进入待机模式,接着调用__force_stores函数确保存储操作完毕后再调用WFI指令,从而进入待机模式。需要注意的是,调用本函数前,还需要清空WUF 寄存器位才能进入待机模式。

RTC时钟简介

CKS32F4xx系列的RTC,是一个独立的BCD定时器/计数器,RTC提供一个日历时钟(包含年月日时分秒信息)、两个可编程闹钟(ALARM A和ALARM B)中断,以及一个具有中断功能的周期性可编程唤醒标志。RTC还包含用于管理低功耗模式的自动唤醒单元。两个32位寄存器包含二进码十进数格式(BCD)的秒、分钟、小时(12或24小时制)、星期几、日期、月份和年份。此外,还可提供二进制格式的亚秒值。系统可以自动将月份的天数补偿为28、29(闰年)、30和31天。并且还可以进行夏令时补偿。其它32位寄存器还包含可编程的闹钟亚秒、秒、分钟、小时、星期几和日期。此外,还可以使用数字校准功能对晶振精度的偏差进行补偿。RTC模块和时钟配置是在后备区域,即在系统复位或从待机模式唤醒后RTC的设置和时间维持不变,只要后备区域供电正常,那么RTC将可以一直运行。但是在系统复位后,会自动禁止访问后备寄存器和RTC,以防止对后备区域(BKP)的意外写操作。所以在要设置时间之前,先要取消备份区域(BKP)写保护。RTC的框图,如下图所示:

67f11c30-1bf9-11ee-962d-dac502259ad0.png

采用RTC周期性唤醒STANDBY模式实验

程序设计主要要点如下:

① RTC初始化;

② RTC周期性自动唤醒;

③清除WUF标志位,进入待机状态。

1)初始化RTC配置函数

void CKS_RTC_Init(void)
{
  uint16_t retry = 0x1FFF; 
  RTC_InitTypeDef  RTC_InitStructure;


  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); 
  PWR_BackupAccessCmd(ENABLE); 


  RCC_LSEConfig(RCC_LSE_ON);   
  while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)  
  {
    retry--; 
    Delay(0xffff);
  }
  if(retry == 0)
  {
    return 1; 
  }
  RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);     
  RCC_RTCCLKCmd(ENABLE);   


  RTC_InitStructure.RTC_AsynchPrediv  =  0x7F;
  RTC_InitStructure.RTC_SynchPrediv   =  0xFF;
  RTC_InitStructure.RTC_HourFormat   =  RTC_HourFormat_24;
  RTC_Init(&RTC_InitStructure);
}

在CKS_RTC_Init函数中,用来初始化RTC配置以及日期和时钟,但只在首次设置时间,随后重新上电/复位都不再进行时间设置(前提是备份电池有电)。为了时间更为精准,这里选用了LSE,即外部32.768kHz晶振作为RTC_CLK的时钟源,而RTC时钟核心,要求提供1Hz的时钟,所以接着是设置RTC_CLK的预分频系数,包括异步和同步两个,这里设置异步分频因子为ASYNCHPREDIV为(127),同步分频因子为ASYNCHPREDIV(255),则产生的时钟CK_SPRE=32.768/(127+1)*(255+1)=1HZ,即每秒更新一次。

2)RTC周期性唤醒配置函数

void RTC_Set_WakeUp(uint32_t wksel, uint16_t cnt)
{ 
  NVIC_InitTypeDef   NVIC_InitStructure;
  EXTI_InitTypeDef   EXTI_InitStructure;


  RTC_WakeUpCmd(DISABLE);
  RTC_WakeUpClockConfig(wksel); 
  RTC_SetWakeUpCounter(cnt-1); 


  RTC_ClearITPendingBit(RTC_IT_WUT); 
  EXTI_ClearITPendingBit(EXTI_Line22); 
   
  RTC_ITConfig(RTC_IT_WUT, ENABLE); 
  RTC_WakeUpCmd(ENABLE);


  EXTI_InitStructure.EXTI_Line = EXTI_Line22;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; 
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; 
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure); 


  NVIC_InitStructure.NVIC_IRQChannel = RTC_WKUP_IRQn; 
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
  NVIC_Init(&NVIC_InitStructure); 
}

在RTC_Set_WakeUp函数中,首先通过RTC_WakeUpCmd函数,关闭WakeUp,接着调用RTC_WakeUpClockConfig函数,配置WakeUp时钟分频系数及来源,然后通过调用RTC_SetWakeUpCounter,设置WakeUp自动装载寄存器,随后使能WakeUp,最后开启配置闹钟中断以及NVIC中断优先级。鉴于此处为RTC唤醒待机实验,仅做demo例程使用,因而不用编写中断服务函数。

3)芯片进入STANDBY模式

查阅CKS32F4xx系列标准库及相关手册,我们了解到使能RTC周期性唤醒,在进入STANDBY模式前,需要进行以下操作,代码如下:

void CKS_Set_Standby_Mode(void)
{    
  RTC_ITConfig(RTC_IT_TS|RTC_IT_WUT|RTC_IT_ALRB|RTC_IT_ALRA, DISABLE); 
  RTC_ClearITPendingBit(RTC_IT_TS|RTC_IT_WUT|RTC_IT_ALRB|RTC_IT_ALRA); 
  PWR_ClearFlag(PWR_FLAG_WU); 
    
  RTC_Set_WakeUp(RTC_WakeUpClock_CK_SPRE_16bits, 3);
    
  PWR_EnterSTANDBYMode();         
}

在CKS_Set_Standby_Mode函数中,先禁止RTC中断(ALRAIE、ALRBIE、TSIE、WUTIE和TAMPIE等),接着清零对应中断标志位,以及清除PWR唤醒(WUF)标志,然后调用RTC_Set_WakeUp函数,设置每3s后唤醒STANDBY模式,同时该函数中也重新使能RTC对应中断,最后调用PWR_EnterSTANDBYMode进入STANDBY模式。

4)主函数配置

本例程中主函数主要对上文所述函数调用,程序编译下载至开发板,先进行相关外设初始化后,直接进入STANDBY模式,每隔3s由RTC唤醒,随即又进入STANDBY模式,循环往复,主函数代码如下:

int main(void)
{  
  CKS_RTC_Init();       
  
  while (1)
  {        
    CKS_Set_Standby_Mode();    
  }
}

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 芯片
    +关注

    关注

    453

    文章

    50301

    浏览量

    421414
  • 寄存器
    +关注

    关注

    31

    文章

    5305

    浏览量

    119924
  • sram
    +关注

    关注

    6

    文章

    762

    浏览量

    114607
  • 低功耗
    +关注

    关注

    10

    文章

    2361

    浏览量

    103566
  • RTC
    RTC
    +关注

    关注

    2

    文章

    524

    浏览量

    66271

原文标题:MCU微课堂|CKS32F4xx系列低功耗模式STANDBY模式

文章出处:【微信号:中科芯MCU,微信公众号:中科芯MCU】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    MCU微课堂|CKS32F4xx系列产品时钟配置

    ,并且高时钟频率将导致功耗增加、抗电磁干扰能力变弱,因此,CKS32F4xx系列产品内部具备多个时钟源。本文将对CKS32F4xx系列产品时
    发表于 12-12 10:17 801次阅读

    CKS32F4xx系列MCU的低功耗模式睡眠模式

    本课讲为大家讲解CKS32F4xx系列产品的低功耗模式睡眠(Sleep)模式。MCU为满足某些
    发表于 06-26 10:02 615次阅读
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b>MCU的<b class='flag-5'>低功耗</b><b class='flag-5'>模式</b><b class='flag-5'>之</b>睡眠<b class='flag-5'>模式</b>

    CKS32F4xx系列DSP功能介绍

    CKS32F4xx系列使用高性能的32位内核,支持浮点运算单元(FPU),同时还支持DSP指令以及存储保护(MPU)用来加强应用的安全性。
    的头像 发表于 03-04 13:43 1496次阅读
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b>DSP功能介绍

    CKS32F4xx系列产品串口DMA传输

    在上一讲,我们讲过CKS32F4xx系列的6个串口都支持DMA传输。因此本节我们对CKS32F4xx系列的DMA进行介绍,同时利用DMA对串口数据进行传输。
    的头像 发表于 04-10 11:18 1000次阅读

    CKS32F4xx系列RNG功能设置

      MCU 微课堂 CKS32F4xx 系 列RNG功能 随机数发生器简介     CKS32F4xx系列自带了硬件随机数发生器(RNG),RNG处理器是一个以连续模拟噪声为基础的随机数发生器,在
    的头像 发表于 09-08 10:01 569次阅读
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b>RNG功能设置

    CKS32F4xx系列DAC功能

    CKS32F4xx系列DAC功能
    的头像 发表于 11-06 16:56 812次阅读
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b>DAC功能

    CKS32F4xx系列ADC多通道DMA电压采集

    CKS32F4xx系列ADC多通道DMA电压采集
    的头像 发表于 11-06 16:53 1059次阅读

    CKS32F4xx系列ADC单通道电压采集

    CKS32F4xx系列ADC单通道电压采集
    的头像 发表于 11-06 16:54 944次阅读
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b>ADC单通道电压采集

    CKS32F4xx系列低功耗模式STANDBY模式

    CKS32F4xx系列低功耗模式STANDBY模式
    的头像 发表于 11-06 16:57 446次阅读
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b><b class='flag-5'>低功耗</b><b class='flag-5'>模式</b><b class='flag-5'>STANDBY</b><b class='flag-5'>模式</b>

    CKS32F4xx系列低功耗模式SLEEP模式

    CKS32F4xx系列低功耗模式SLEEP模式
    的头像 发表于 11-06 16:59 646次阅读
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b><b class='flag-5'>低功耗</b><b class='flag-5'>模式</b>SLEEP<b class='flag-5'>模式</b>

    CKS32F4xx系列低功耗模式STOP模式

    CKS32F4xx系列低功耗模式STOP模式
    的头像 发表于 11-06 17:08 584次阅读
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b><b class='flag-5'>低功耗</b><b class='flag-5'>模式</b>STOP<b class='flag-5'>模式</b>

    CKS32F4xx系列产品Timer的基本使用方法-比较输出

    CKS32F4xx系列产品Timer的基本使用方法-比较输出
    的头像 发表于 11-09 17:39 806次阅读
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b>产品Timer的基本使用方法-比较输出

    CKS32F4xx系列产品Timer的基本使用方法-定时操作

    CKS32F4xx系列产品Timer的基本使用方法-定时操作
    的头像 发表于 11-09 17:41 572次阅读
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b>产品Timer的基本使用方法-定时操作

    MCU微课堂 | CKS32F4xx系列产品SPI通信

    MCU微课堂 | CKS32F4xx系列产品SPI通信
    的头像 发表于 10-24 17:12 659次阅读
    MCU微课堂 | <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b>产品SPI通信

    MCU微课堂 | CKS32F4xx系列产品GPIO口配置

    MCU微课堂 | CKS32F4xx系列产品GPIO口配置
    的头像 发表于 10-24 15:14 739次阅读
    MCU微课堂 | <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b>产品GPIO口配置