打印
[MM32软件]

如何使用MM32的三种低功耗模式?

[复制链接]
1294|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
duo点|  楼主 | 2024-3-12 15:00 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
来源 灵动MM32
  电源电子设备的重要性不言而喻,它是保证系统稳定运行的基础,而保证系统稳定运行后,又有低功耗的要求。在很多应用场合中,对电子设备的功耗要求非常苛刻,如某些传感器信息采集设备,仅靠小型的电池提供电源,要求工作长达数年之久,且期间不需要任何维护;由于智慧穿戴设备的小型化要求,电池体积不能太大导致容量也比较小,所以很有必要从控制功耗入手,提高设备的续行时间。

  在系统或电源复位以后,MCU处于运行状态。运行状态下的时钟源为 CPU提供时钟,内核执行程序代码。当 CPU 不需继续运行时,可以利用多个低功耗模式来降低功耗,例如等待某个外部事件时。

MM32L0产品支持三种低功耗模式:睡眠模式、停止模式和待机模式,可以在要求低功耗、短启动时间和多种唤醒事件之间达到最佳的平衡,可以满足用户对低功耗的要求。

l 睡眠模式
   
在睡眠模式,只有 CPU 停止,所有外设处于工作状态并可在发生中断/事件时唤醒 CPU
   有两种方式进入睡眠模式,它的进入方式决定了从睡眠唤醒的方式,分别是 WFI(wait for interrupt) WFE(wait forevent),即等待中断唤醒和事件唤醒。
进入睡眠模式例:
  __WFE();//等待事件,等待事件是一个暂停执行指令暂停至任意事件产生后被唤醒。
  __WFI();//等待中断,等待中断是一个暂停执行指令暂停至任意中断产生后被唤醒。

关于退出睡眠模式:
                              


配置外部事件唤醒函数例:
voidGPIO_Configuration(void)
{
       GPIO_InitTypeDef GPIO_InitStruct;
       EXTI_InitTypeDef EXTI_InitStruct;
       RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);  
       RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);
       GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
       GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
       GPIO_InitStruct.GPIO_Mode =GPIO_Mode_IPD;
       GPIO_Init( GPIOA, &GPIO_InitStruct);
       SYSCFG_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
       EXTI_InitStruct.EXTI_Line = EXTI_Line0;
       EXTI_InitStruct.EXTI_Trigger =EXTI_Trigger_Rising;
       EXTI_InitStruct.EXTI_Mode =EXTI_Mode_Event;
       EXTI_InitStruct.EXTI_LineCmd = ENABLE;
       EXTI_Init(&EXTI_InitStruct);
}
l 停止模式
   
在保持 SRAM 和寄存器内容不丢失的情况下,停机模式可以达到最低的电能消耗。在停机模式下,停止所有内部 1.8V 部分的供电, PLL HSI 的振荡器和 HSE 晶体振荡器被关闭,调压器可以被置于普通模式或低功耗模式。
有两种方式进入停止模式,可以通过设置独立的控制位,选择以下待机模式的功能:

  独立看门狗(IWDG):可通过写入看门狗的键寄存器或硬件选择来启动 IWDG。一旦启动了独立看门狗,除了系统复位,它不能再被停止。

  内部振荡器(LSI 振荡器):通过控制/状态寄存器 (RCC_CSR)的 LSION 位来设置。在停止模式下,如果在进入该模式前 ADC 和 DAC 没有被关闭,那么这些外设仍然消耗电流。

进入停止模式例:
void Sys_Stop(void)
{
       PWR_EnterSTOPMode(0,PWR_STOPEntry_WFI);
}
注:MM32L0xx在进入停止模式前,需将系统时钟切换到HSI
关于退出停止模式:
  当一个中断或唤醒事件使MCU退出停止模式时, HSI 振荡器被选为系统时钟。当电压调节器处于低功耗模式下,当系统从停止模式退出时,将会有一段额外的启动延时。



配置中断唤醒函数例:
voidWKUP_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;                 
        NVIC_InitTypeDefNVIC_InitStructure;
        EXTI_InitTypeDef EXTI_InitStructure;
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);
         RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
         GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0;
         GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPD;
         GPIO_Init(GPIOA,&GPIO_InitStructure);
         SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource0);
         EXTI_InitStructure.EXTI_Line =EXTI_Line0;
         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=EXTI0_1_IRQn;
         NVIC_InitStructure.NVIC_IRQChannelPriority= 2;
         NVIC_InitStructure.NVIC_IRQChannelCmd= ENABLE;
         NVIC_Init(&NVIC_InitStructure);
         PWR_WakeUpPinCmd(ENABLE);
}
l 待机模式
  待机模式可实现系统的最低功耗。该模式是在 CPU 深睡眠模式时关闭电压调节器。整个 1.8V 供电区域被断电。 PLL HSI HSE 振荡器也被断电。 SRAM 和寄存器内容丢失。只有备份的寄存器和待机电路维持供电。在进入待机模式后,除了被用于唤醒 I/O,其余 I/O 都进入高阻态,而从待机模式唤醒后,相当于复位MM32芯片,程序重新从头开始执行。

有两种方式进入待机模式,可以通过设置独立的控制位,选择以下待机模式的功能:
   独立看门狗(IWDG):可通过写入看门狗的键寄存器或硬件选择来启动 IWDG。一旦启动了独立看门狗,除了系统复位,它不能再被停止。
  内部振荡器(LSI 振荡器):通过控制/状态寄存器(RCC_CSR)的 LSION 位来设置。
进入待机模式例:
voidSys_Standby(void)
{  
       RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
       PWR_WakeUpPinCmd(ENABLE);
       PWR_EnterSTANDBYMode();
}
关于退出待机模式:
   当一个外部复位(NRST 引脚)、 IWDG 复位、 WKUP 引脚上的上升沿, 微控制器从待机模式退出。从待机唤醒后,除了电源控制/状态寄存器(PWR_CSR),所有寄存器被复位。

   从待机模式唤醒后的代码执行等同于复位后的执行(采样启动模式引脚、读取复位向量等)。电源控制/状态寄存器(PWR_CSR)将会指示内核由待机状态退出。



配置WKUP引脚上升沿函数例:
u8Check_WKUP(void)
{
       while(1)
       {
              if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0))
              {
          return 1;
              }
       else
              {
            return0;
              }
       }
}  
voidWKUP_Init(void)
{      
    GPIO_InitTypeDef GPIO_InitStructure;                 
    NVIC_InitTypeDef NVIC_InitStructure;
    EXTI_InitTypeDef EXTI_InitStructure;
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
    GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0;      
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    SYSCFG_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
    EXTI_InitStructure.EXTI_Line = EXTI_Line0;      
    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=EXTI0_1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPriority= 2;
    NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    if(Check_WKUP()==0) Sys_Standby();
}
   当系统处于低功耗状态时,使用下载器是无法给芯片下载程序的。有很多用户使用低功耗功能,但是唤醒部分配置有问题,导致MCU无法唤醒,发现无法对芯片进行下载程序。在这里告诉大家一个调试低功耗模式的小秘密,您在测试低功耗模式时可在主函数启动时加一个较长的延时函数,按住板子的复位键,使系统处于复位状态,然后点击电脑端的下载按钮下载程序,这时再释放复位键,这样MCU上电后执行延时函数期间对低功耗程序进行擦除。

   还有一种方法是选择启动方式,通过将BOOT0拉高,重新上电使MCU从SRAM启动,重新选择一个闪灯程序对flash进行擦除,擦除完成后将BOOT0拉低,然后重新上电即可重新下载程序。



使用特权

评论回复
沙发
alxd| | 2024-3-29 10:44 | 只看该作者
一般都是跑官方的例程,来体验低功耗模式

使用特权

评论回复
板凳
B1lanche| | 2024-3-29 11:49 | 只看该作者
其实正常还是使用小华的低功耗吧,功耗是真的低

使用特权

评论回复
地板
Carmen7| | 2024-3-29 12:56 | 只看该作者
现在低功耗好像不是低功耗MCU,在低功耗方面也是不错的了

使用特权

评论回复
5
Belle1257| | 2024-3-29 14:01 | 只看该作者
一般就是按照例程来搞,基本是不会出错的

使用特权

评论回复
6
Allison8859| | 2024-3-29 15:08 | 只看该作者
一些没用到的外设都要关闭,这样能降低功耗

使用特权

评论回复
7
Emily999| | 2024-3-29 16:12 | 只看该作者
其实有些时候,你要是降低主频也是可以降低功耗的

使用特权

评论回复
8
Candic12e| | 2024-3-29 17:27 | 只看该作者
你要用L0来做低功耗啊?那功耗应该很容易降下来吧

使用特权

评论回复
9
Betty1299| | 2024-3-29 18:24 | 只看该作者
一般都是为了用电池供电才会考虑低功耗的

使用特权

评论回复
10
Estelle1999| | 2024-3-30 07:00 | 只看该作者
我觉得可以考虑用待机模式应该就可以吧

使用特权

评论回复
11
Charlotte夏| | 2024-3-30 08:32 | 只看该作者
对的,当系统处于低功耗状态时,使用下载器是无法给芯片下载程序的这是要注意的,需要用串口烧录了

使用特权

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

本版积分规则

434

主题

1628

帖子

1

粉丝