你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32低功耗模式测试

[复制链接]
STMCU小助手 发布时间:2022-3-20 20:52
stm32单片机低功耗模式共有3种,下来对3种低功耗进行分析测试。
先看手册上相关低功耗资料介绍:

]MR]{7GU;KZB$}`ARZW68.png

先来分析睡眠模式:

27)OO22X2ZU@{BT)A]UZRRH.png
2IXTQR(EY59[6%2TTGC~YWY.png

进入睡眠模式比较简单,只需一条指令即可。唤醒睡眠模式,我们使用串口中断来唤醒,通过对串口发送数据。利用串口RXD引脚来唤醒睡眠模式,代码如下:

  1. //进入睡眠模式 任意中断唤醒  WKUP不能唤醒
  2. void sleep_mode_wfi(void)
  3. {
  4.     __WFI();                                                                                                        //WFI指令进入睡眠
  5. }
  6. //进入睡眠模式 唤醒事件唤醒  WKUP 不能唤醒
  7. void sleep_mode_wfe(void)
  8. {
  9.     __WFE();
  10. }
复制代码

通过调用这两个函数就可以直接进入睡眠模式,给串口发送数据可以退出睡眠模式。睡眠模式退出后,程序会从进入睡眠模式的下一行代码继续执行。相当于程序被暂停了。
下来看停止模式:

[B29O@APN{WVXH9P)F]M{AM.png

_W~M_L]_7Q}J_DME4SG31_M.png

停止模式通过调用库函数PWR_EnterSTOPMode(),可进入停止模式,停止模式唤醒需要用外部中断,将串口的RXT引脚设置为外部中断,上升沿触发,这样当串口接收到数据时,就会触发RXD引脚的外部中断。这样可通过串口直接唤醒停止模式。相关代码如下:

  1. void EXIT_UART_Init(void)
  2. {
  3.     GPIO_InitTypeDef GPIO_InitStructure;
  4.     NVIC_InitTypeDef NVIC_InitStructure;
  5.     EXTI_InitTypeDef EXTI_InitStructure;

  6.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);

  7.     GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource10);

  8.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  9.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  10.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  11.     GPIO_Init(GPIOA, &GPIO_InitStructure);

  12.     NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
  13.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
  14.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
  15.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  16.     NVIC_Init(&NVIC_InitStructure);

  17.     EXTI_InitStructure.EXTI_Line = EXTI_Line10;
  18.     EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  19.     EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
  20.     EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  21.     EXTI_Init(&EXTI_InitStructure);

  22. }
  23. void EXTI15_10_IRQHandler(void)
  24. {
  25.     if(EXTI_GetITStatus(EXTI_Line10) != RESET)
  26.     {
  27.         EXTI_ClearITPendingBit(EXTI_Line10);
  28.         __set_FAULTMASK(1);         //关闭所有中断
  29.         NVIC_SystemReset();  //系统复位
  30.     }

  31. }

  32. //进入停止模式   任意外部中断唤醒  WKUP不能唤醒
  33. void enter_stop_mode(void)
  34. {
  35.     EXIT_UART_Init();                                                                                        //RX引脚配置为外部中断
  36.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);                 //开电源管理时钟

  37.     PWR_EnterSTOPMode(PWR_Regulator_ON, PWR_STOPEntry_WFI);                //进入停机模式
  38. }
复制代码

进入停止模式后,所有IO口保持为当前状态。当退出停止模式后,HSI RC振荡器会被选为系统时钟,而开发版用的是外部时钟,需要重新设置系统时钟。为了避免重新设置时钟的麻烦,在中断程序中,直接执行系统软件复位命令。直接对系统重新进行复位。如果在实际项目中需要外部IO口状态保持不变,就不能用系统复位命令,需要自己重新配置系统时钟和其他外设的时钟。

下来看待机模式:

]21J[I66TY0{H4_SP0%$E`Y.png

进入待机模式后系统功耗最低,外部IO口都会处于高阻状态。退出待机模式后,系统会重新初始化,相当于按下了复位按键。相关代码如下:

  1. void Sys_Standby(void)
  2. {
  3.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);                 //使能PWR外设时钟
  4.     PWR_WakeUpPinCmd(ENABLE);                                                                          //使能唤醒管脚功能  WKUP
  5.     PWR_EnterSTANDBYMode();                                                                           //进入待机(standby)模式
  6. }

  7. //系统进入待机模式   WKUP引脚上升沿、RTC脑子、NRST复位、IWDG复位 唤醒  中断不能唤醒
  8. void Sys_Enter_Standby(void)
  9. {
  10.     RCC_APB2PeriphResetCmd(0X01FC, DISABLE);                                         //复位所有IO口,屏蔽这条语句也没有看到什么影响
  11.     Sys_Standby();
  12. }
复制代码

为了方便测试,用了WKUP唤醒。进入低功耗模式后,按下WKUP按键,系统会被唤醒,唤醒后系统复位,程序重新开始执行。
主函数测试代码如下:

  1. int main(void)
  2. {
  3.     u8 i = 0, j = 0;
  4.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  5.     delay_init();                                                                                       //延时函数初始化
  6.     LED_Init();                                                                                         //初始化与LED连接的硬件接口
  7.     KEY_Init();
  8.     uart_init(9600);

  9.     LED = 1;
  10.     delay_ms(500);
  11.     printf("low power test! \r\n\r\n");
  12.     while(1)
  13.     {
  14.         i =  KEY_Scan(1);

  15.         switch(i)
  16.         {
  17.         case 0:
  18.             break;
  19.         case 1:
  20.             printf("进入停机模式\r\n\r\n");
  21.             enter_stop_mode();                                                                        //唤醒后从程序开始位置执行
  22.             printf("退出停机模式\r\n\r\n");                              //执行不到这块
  23.             break;
  24.         case 2:
  25.             printf("进入待机模式\r\n\r\n");                                
  26.             Sys_Enter_Standby();                                                                 //唤醒后从程序开始位置执行
  27.             printf("退出待机模式\r\n\r\n");                                                 //执行不到这块
  28.             break;
  29.         case 3:
  30.             printf("进入睡眠模式 中断唤醒 \r\n\r\n");
  31.             sleep_mode_wfi();                                                                        //唤醒后接着下一条语句执行
  32.             printf("退出睡眠模式 中断唤醒 \r\n\r\n");                     //唤醒后执行当前语句
  33.             break;
  34.         case 4:
  35.             printf("进入睡眠模式 事件唤醒 \r\n\r\n");
  36.             sleep_mode_wfe();                                                                        //唤醒后接着下一条语句执行
  37.             printf("退出睡眠模式 事件唤醒 \r\n\r\n");                                //唤醒后执行当前语句
  38.             break;
  39.         }

  40.         j++;
  41.         if(j > 5)
  42.         {
  43.             j = 0;
  44.             LED = !LED;
  45.         }

  46.         delay_ms(10);

  47.     }
  48. }
复制代码

通过LED闪烁指示程序执行状态,进入低功耗模式后,LED灯停止闪烁。退出低功耗模式后,LED灯继续闪烁,用串口输出相关信息,便于观察。



收藏 评论0 发布时间:2022-3-20 20:52

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版