找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4635|回复: 2
收起左侧

STM32睡眠和停止唤醒源代码

[复制链接]
ID:186617 发表于 2018-8-28 14:42 | 显示全部楼层 |阅读模式
单片机的休眠唤醒和停止唤醒实验代码示例
0.png

单片机源程序如下:
  1. #include "wkup.h"
  2. #include "led.h"
  3. #include "delay.h"
  4. void Sys_Sleepy(void)
  5. {  
  6.   SCB->SCR |=0X00;   

  7.         #if defined ( __CC_ARM   )                          
  8.   __force_stores();
  9.         #endif
  10.   /* Request Wait For Interrupt */
  11.   __WFI();
  12. }
  13. //系统进入待机模式
  14. void Sys_Enter_Sys_Sleepy(void)
  15. {                        
  16. //        RCC_APB2PeriphResetCmd(0X01FC,DISABLE);        //复位所有IO口
  17.         Sys_Sleepy();
  18. }

  19. void EXTI2_IRQHandler(void)
  20. {                                                                                                  
  21.         EXTI_ClearITPendingBit(EXTI_Line2); // 清除LINE10上的中断标志位        
  22.                   SCB->SCR |=SCB_SCR_SEVONPEND;
  23.           //  Sys_Enter_Sys_Sleepy();
  24.         if(E2==0)//关机?
  25.         {               
  26.                         delay_ms(10000);
  27.                         if(E2==0)
  28.                         {
  29.                                 LED0=0;
  30.                                 Sys_Enter_Sys_Sleepy();
  31.                         }
  32.         } else         LED1=0;

  33.                         
  34. }
  35. void EXTI3_IRQHandler(void)
  36. {                                                                                                  
  37.         EXTI_ClearITPendingBit(EXTI_Line3); // 清除LINE10上的中断标志位                  
  38.         SCB->SCR |=SCB_SCR_SEVONPEND;
  39.         LED1=!LED1;
  40. /*        if(E3!=0)//关机?
  41.         {               
  42.                 Sys_Enter_Sys_Sleepy();        
  43.         }  else LED0=1;   */
  44. }

  45. //PA0 WKUP唤醒初始化
  46. void WKUP_Init(void)
  47. {        
  48.     GPIO_InitTypeDef  GPIO_InitStructure;                    
  49.         NVIC_InitTypeDef NVIC_InitStructure;
  50.         EXTI_InitTypeDef EXTI_InitStructure;

  51.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE);//使能GPIOA和复用功能时钟

  52.         GPIO_InitStructure.GPIO_Pin =GPIO_Pin_2;         //PE.2
  53.         GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU;//上拉输入  
  54.         GPIO_Init(GPIOE, &GPIO_InitStructure);        //初始化IO

  55.         GPIO_InitStructure.GPIO_Pin =GPIO_Pin_3;         //PE.3
  56.         GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU;//上拉输入  
  57.         GPIO_Init(GPIOE, &GPIO_InitStructure);        //初始化IO
  58.         //使用外部中断方式
  59.         GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource2);        //中断线2连接GPIOE.2
  60.    GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource3);
  61.   EXTI_InitStructure.EXTI_Line = EXTI_Line3|EXTI_Line2;        //设置按键所有的外部线路
  62.         EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;                        //设外外部中断模式:EXTI线路为中断请求
  63.         EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  //上升沿触发
  64.          EXTI_InitStructure.EXTI_LineCmd =ENABLE;// DISABLE;
  65.         EXTI_Init(&EXTI_InitStructure);        // 初始化外部中断

  66.         NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn; //使能按键所在的外部中断通道
  67.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0;
  68.         NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;  
  69.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
  70.         NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
  71. /*----------------------------------------*/
  72.   NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //使能按键所在的外部中断通道
  73.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  74.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  75.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
  76.         NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

  77. if(E2!=0) Sys_Sleepy();    //不是开机,进入待机模式  
  78. }
复制代码

所有资料51hei提供下载:
睡眠唤醒和停止唤醒实验.rar (649.88 KB, 下载次数: 70)
回复

使用道具 举报

ID:427492 发表于 2019-5-18 17:51 | 显示全部楼层
楼主,我最近也在做停止唤醒实验。我是把串口的接收口RXD配置为外部中断方式,通过给串口发送一个字符来唤醒。现在可以用串口发送字符唤醒,我遇到的问题是“我想把唤醒它的字符显示出来”,结果没能实现,我想问一下楼主有解决我问题的方法或思路没有?
回复

使用道具 举报

ID:496117 发表于 2021-4-26 10:48 | 显示全部楼层
最近搞低功耗的也遇到很多问题,一开始打算用待机模式,毕竟最省电,而且唤醒之后是复位重启,不用重新初始化电源等,省事!但是待机之后唤醒经常需要按很多次才会响应,后面放弃了,改用停止模式!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表