cortex_m3_stm32嵌入式学习笔记(十五):待机唤醒实验(WK_UP外部中断)

https://blog.csdn.net/qq_16255321/article/details/43086403

很多单片机都有低功耗模式, STM32 也不例外。在系统或电源复位以后,微控制器处于运行状态。运行状态下的 HCLK 为 CPU 提供时钟,内核执行程序代码。当 CPU 不需继续运行时,可以利用多个低功耗模式来节省功耗,例如等待某个外部事件时。用户需要根据最低电源消耗,最快速启动时间和可用的唤醒源等条件,选定一个最佳的低功耗模式。

STM32 的低功耗模式有 3 种:
1)睡眠模式( CM3 内核停止,外设仍然运行)
2)停止模式(所有时钟都停止)
3)待机模式( 1.8V 内核电源关闭)

在这三种低功耗模式中,最低功耗的是待机模式,在此模式下,最低只需要 2uA 左右的电流。停机模式是次低功耗的,其典型的电流消耗在 20uA 左右。最后就是睡眠模式了。用户可以根据自己的需求来决定使用哪种低功耗模式。
本节实验是待机模式的实验,根据上表可以看到有4种方式进入待机模式,我们选择第一种,即通过WK_UP的外部中断来触发进入待机模式的方式

配置步骤:

1)使能电源时钟。
2) 设置 WK_UP 引脚作为唤醒源。

3)设置 SLEEPDEEP 位,设置 PDDS 位,执行 WFI 指令,进入待机模式。

4)最后编写 WK_UP 中断函数。

wkup.c

  1. #include "wkup.h"

  2. //待命模式

  3. void Sys_Standby(void)

  4. {

  5. RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //使能 PWR外设时钟

  6. PWR_WakeUpPinCmd(ENABLE); //使能唤醒管脚功能

  7. PWR_EnterSTANDBYMode(); //进入待命( STANDBY)模式

  8. }

  9. //系统进入待机模式

  10. void Sys_Enter_Standby(void)

  11. {

  12. RCC_APB2PeriphResetCmd(0X01FC,DISABLE); //复位所有 IO 口

  13. Sys_Standby();

  14. }

  15. //检测 WKUP 脚的信号

  16. //返回值 1:连续按下 3s 以上

  17. // 返回值 0:错误的触发

  18. u8 Check_WKUP(void)

  19. {

  20. u8 t=0;

  21. LED0=0;

  22. while(1)

  23. {

  24. if(WKUP_KD)

  25. {

  26. t++;

  27. delay_ms(30);

  28. if(t>=100)

  29. {

  30. LED0=0;

  31. return 1;

  32. }

  33. }

  34. else

  35. {

  36. LED0=1;

  37. return 0;

  38. }

  39. }

  40. }

  41. void EXTI0_IRQHandler(void)

  42. {

  43. EXTI_ClearITPendingBit(EXTI_Line0);// 清除 LINE10 上的中断标志位

  44. if(Check_WKUP())

  45. {

  46. Sys_Enter_Standby();

  47. }

  48. }

  49. void WKUP_Init(void)

  50. {

  51. GPIO_InitTypeDef GPIO_ist;

  52. NVIC_InitTypeDef NVIC_ist;

  53. EXTI_InitTypeDef EXTI_ist;

  54. //使能GPIOA和复用功能时钟

  55. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);

  56. GPIO_ist.GPIO_Pin=GPIO_Pin_0;//PA0

  57. GPIO_ist.GPIO_Mode =GPIO_Mode_IPD;//下拉输入

  58. GPIO_Init(GPIOA,&GPIO_ist);

  59. //中断线 0 连接 GPIOA.0

  60. GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);

  61. EXTI_ist.EXTI_Line=EXTI_Line0;

  62. EXTI_ist.EXTI_Mode= EXTI_Mode_Interrupt;

  63. EXTI_ist.EXTI_Trigger=EXTI_Trigger_Rising;

  64. EXTI_ist.EXTI_LineCmd= ENABLE;

  65. EXTI_Init(&EXTI_ist);//初始化外部中断

  66. NVIC_ist.NVIC_IRQChannel=EXTI0_IRQn;

  67. NVIC_ist.NVIC_IRQChannelPreemptionPriority=2;

  68. NVIC_ist.NVIC_IRQChannelSubPriority=2;

  69. NVIC_ist.NVIC_IRQChannelCmd=ENABLE;

  70. NVIC_Init(&NVIC_ist);

  71. if(!Check_WKUP())Sys_Standby();

  72. }

以看到我们设定的是3秒有效,即按下WK_UP键3秒以上才会进入待机模式(关机)然后再按3秒以上便会开机。

可能对开机有点不大理解 我们找到关机函数中复位IO口那个函数源码

  1. void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)

  2. {

  3. /* Check the parameters */

  4. assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph));

  5. assert_param(IS_FUNCTIONAL_STATE(NewState));

  6. if (NewState != DISABLE)

  7. {

  8. RCC->APB2RSTR |= RCC_APB2Periph;

  9. }

  10. else

  11. {

  12. RCC->APB2RSTR &= ~RCC_APB2Periph;

  13. }

  14. }

因为我们传进去的第二个参数是DISABLE 所以它会执行 RCC->APB2RSTR &= ~RCC_APB2Periph;

可以看到每次都对 APB2Periph取反后按位与, 达到开关机的效果。。

wkup.h

  1. #ifndef _WKUP_H

  2. #define _WKUP_H

  3. #include "led.h"

  4. #include "delay.h"

  5. #include "sys.h"

  6. #include "usart.h"

  7. #define WKUP_KD PAin(0)//PA0 检测是否外部 WK_UP 按键按下

  8. u8 Check_WKUP(void);//检测 WKUP 脚的信号

  9. void WKUP_Init(void);//PA0 WKUP 唤醒初始化

  10. void Sys_Enter_Standby(void);//系统进入待机模式

  11. #endif

主函数直接保留上一节时钟的代码(加了WKUP的初始化)。。在LCD上显示时间,按WP_UP3秒关机

  1. #include "led.h"

  2. #include "delay.h"

  3. #include "sys.h"

  4. #include "usart.h"

  5. #include "lcd.h"

  6. #include "usmart.h"

  7. #include "rtc.h"

  8. #include "wkup.h"

  9. void init(void)

  10. {

  11. NVIC_Configuration();

  12. delay_init();

  13. uart_init(9600);

  14. LED_Init();

  15. LCD_Init();

  16. WKUP_Init();

  17. usmart_dev.init(72);//初始化SMART组件

  18. }

  19. int main(void)

  20. {

  21. u8 t;

  22. init();

  23. POINT_COLOR=RED;

  24. while(RTC_Init()) //RTC初始化 ,一定要初始化成功

  25. {

  26. LCD_ShowString(60,130,200,16,16,"RTC ERROR! ");

  27. delay_ms(800);

  28. LCD_ShowString(60,130,200,16,16,"RTC Trying...");

  29. }

  30. //显示时间

  31. POINT_COLOR=BLUE;//设置字体为蓝色

  32. LCD_ShowString(60,130,200,16,16," - - ");

  33. LCD_ShowString(60,162,200,16,16," : : ");

  34. while(1)

  35. {

  36. if(t!=calendar.sec)

  37. {

  38. t=calendar.sec;

  39. LCD_ShowNum(60,130,calendar.w_year,4,16);

  40. LCD_ShowNum(100,130,calendar.w_month,1,16);

  41. LCD_ShowNum(124,130,calendar.w_date,2,16);

  42. switch(calendar.week)

  43. {

  44. case 0:

  45. LCD_ShowString(60,148,200,16,16,"Sunday ");

  46. break;

  47. case 1:

  48. LCD_ShowString(60,148,200,16,16,"Monday ");

  49. break;

  50. case 2:

  51. LCD_ShowString(60,148,200,16,16,"Tuesday ");

  52. break;

  53. case 3:

  54. LCD_ShowString(60,148,200,16,16,"Wednesday");

  55. break;

  56. case 4:

  57. LCD_ShowString(60,148,200,16,16,"Thursday ");

  58. break;

  59. case 5:

  60. LCD_ShowString(60,148,200,16,16,"Friday ");

  61. break;

  62. case 6:

  63. LCD_ShowString(60,148,200,16,16,"Saturday ");

  64. break;

  65. }

  66. LCD_ShowNum(60,162,calendar.hour,2,16);

  67. LCD_ShowNum(84,162,calendar.min,2,16);

  68. LCD_ShowNum(108,162,calendar.sec,2,16);

  69. LED0=!LED0;

  70. }

  71. delay_ms(10);

  72. }

  73. }

cortex_m3_stm32嵌入式学习笔记(十五):待机唤醒实验(WK_UP外部中断)相关推荐

  1. python复制指定字符串_python3.4学习笔记(十五) 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)...

    python3.4学习笔记(十五) 字符串操作(string替换.删除.截取.复制.连接.比较.查找.包含.大小写转换.分割等) python print 不换行(在后面加上,end=''),prin ...

  2. windows内核开发学习笔记十五:IRP结构

    windows内核开发学习笔记十五:IRP结构   IRP(I/O Request Package)在windows内核中,有一种系统组件--IRP,即输入输出请求包.当上层应用程序需要访问底层输入输 ...

  3. Polyworks脚本开发学习笔记(十五)-用Python连接Polyworks的COM组件

    Polyworks脚本开发学习笔记(十五)-用Python连接Polyworks的COM组件 用Polyworks脚本开发,没有高级语言的支持,功能难免单一,一些比较复杂的交互实现不了,界面和报告也很 ...

  4. IOS之学习笔记十五(协议和委托的使用)

    1.协议和委托的使用 1).协议可以看下我的这篇博客 IOS之学习笔记十四(协议的定义和实现) https://blog.csdn.net/u011068702/article/details/809 ...

  5. Mr.J-- jQuery学习笔记(十五)--实现页面的对联广告

    请看之前的:Mr.J-- jQuery学习笔记(十四)--动画显示隐藏 话不多说,直接上demo <!DOCTYPE html> <html lang="en"& ...

  6. 世界是有生命的(通向财富自由之路学习笔记十五)

    最近因为工作调度的事情,有了一段空闲的日子,有比较多的时间来回望自己走过的路以及如何走好以后的路.之前忙得很少时间来写博文,很少时间来写读书笔记,逐渐将自己一些很好的习惯丢弃了.从今天起将重拾写博文的 ...

  7. 前端学习笔记(十五)

    第十五章 HTML5新增标签 一.HTML5概述 1.简介         HTML5万维网的核心语言.标准通用标记语言下的一个应用超文本标记语言的第五次大修改.HTML5将成为 HTML.XHTML ...

  8. Java学习笔记十五

    26. 下面介绍synchronized代码块,个人以为,重要度远远高于单纯的修饰synchronized方法: 一方面:高效率! 另一方面:后面涉及到的wait和notify方法,都要涉及 Sync ...

  9. 【theano-windows】学习笔记十五——受限玻尔兹曼机

    前言 终于到了最喜欢的模型: 受限玻尔兹曼机(RBM)了, 发现关于RBM是如何从能量模型发展过来的介绍非常不错, 而关于详细理论证明, 可以去看我前面的受限玻尔兹曼机的一系列博客. 国际惯例, 参考 ...

最新文章

  1. 微软发布预览版SQL Server跨平台开发工具
  2. ubuntu相关命令
  3. WSGI,uWSGI,uwsgi,Nginx
  4. flask 配置文件和学习资料
  5. ClickHouse【资源分享 01】Linux环境 clickhouse-19.7.3.9 离线安装文件分享(百度云盘)
  6. 打印最少硬币的组合-dp+记录路径
  7. ubuntu18.04升级python_Ubuntu18.04一次性升级Python所有库的方法步骤
  8. CAN笔记(5) 协议标准规格
  9. 学了python能干啥举例-Python主要用来做什么?
  10. android 把数据导入到excel文件中的三种方法
  11. 分析与设计:员工管理系统
  12. ios 手势返回监听方法
  13. 芯片春秋: ARM前世今生
  14. ESP8266/ESP32 +1.3“ or 0.96“ IIC OLED指针式时钟
  15. Swift 网络请求——Moya的使用
  16. 用Hive、Impala查询Hbase数据
  17. 横版过关游戏开发-游戏流程
  18. 贝萨尔曲线实现Periscope心形点赞动画效果
  19. RHCA回忆录---CL210介绍
  20. TcaplusDBX光与夜之恋|春暖花开之际与你相遇

热门文章

  1. 批处理删除重复的文件
  2. nmap+nagios
  3. 三角形形状判断(等边、等腰、直角、等腰直角、非等边)
  4. android pad office,安卓平板电脑也可以使用Office应用了
  5. 算法 — 十六进制转八进制
  6. 计算机应用基础操作题文档,《计算机应用基础》操作题
  7. c语言中3次方函数图像,三次函数的性质
  8. linux重装出现cannot load file 5555h,在安装系统出现error cannot load file code 5555h 的解决办法...
  9. 关于数据库having的用法的详细介绍
  10. 评职称自费出书需要多长时间