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

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.  
  16. //检测 WKUP 脚的信号

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

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

  19. u8 Check_WKUP(void)

  20. {

  21. u8 t=0;

  22. LED0=0;

  23. while(1)

  24. {

  25. if(WKUP_KD)

  26. {

  27. t++;

  28. delay_ms(30);

  29. if(t>=100)

  30. {

  31. LED0=0;

  32. return 1;

  33. }

  34. }

  35. else

  36. {

  37. LED0=1;

  38. return 0;

  39. }

  40. }

  41. }

  42. void EXTI0_IRQHandler(void)

  43. {

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

  45. if(Check_WKUP())

  46. {

  47. Sys_Enter_Standby();

  48. }

  49. }

  50. void WKUP_Init(void)

  51. {

  52. GPIO_InitTypeDef GPIO_ist;

  53. NVIC_InitTypeDef NVIC_ist;

  54. EXTI_InitTypeDef EXTI_ist;

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

  56. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);

  57. GPIO_ist.GPIO_Pin=GPIO_Pin_0;//PA0

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

  59. GPIO_Init(GPIOA,&GPIO_ist);

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

  61. GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);

  62. EXTI_ist.EXTI_Line=EXTI_Line0;

  63. EXTI_ist.EXTI_Mode= EXTI_Mode_Interrupt;

  64. EXTI_ist.EXTI_Trigger=EXTI_Trigger_Rising;

  65. EXTI_ist.EXTI_LineCmd= ENABLE;

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

  67.  
  68. NVIC_ist.NVIC_IRQChannel=EXTI0_IRQn;

  69. NVIC_ist.NVIC_IRQChannelPreemptionPriority=2;

  70. NVIC_ist.NVIC_IRQChannelSubPriority=2;

  71. NVIC_ist.NVIC_IRQChannelCmd=ENABLE;

  72. NVIC_Init(&NVIC_ist);

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

  74. }




以看到我们设定的是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.  
  8. #define WKUP_KD PAin(0)//PA0 检测是否外部 WK_UP 按键按下

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

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

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

  12. #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. }

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 基于ARM Cortex-M3STM32嵌入式系统是一种高性能、低功耗的嵌入式系统,可广泛应用于各种领域。它的工作原理是基于ARM Cortex-M3内核的芯片,该内核具有较强的计算能力和多重存储器接口。STM32系列芯片结合了低功耗、高性能和丰富的外设功能,能够满足不同的应用需求。 STM32嵌入式系统的应用十分广泛。首先,它可以应用于工业自动化控制领域。通过与各种传感器和执行器的连接,STM32可以实现对温度、湿度、压力等各种参数的实时监测和控制。其低功耗特性也使其适合在长时间运行的智能仪表和机械设备中使用。 其次,STM32嵌入式系统可应用于物联网设备。通过内置的无线通信模块,如Wi-Fi、蓝牙和LoRa等,STM32可以与其他设备进行无线通信,并实现数据的传输和远程控制,适用于智能家居、智能城市等场景。 此外,STM32还可以应用于消费电子产品领域。其丰富的外设接口可以与LCD显示屏、摄像头、音频设备等进行连接,从而实现手机、平板电脑和音频播放器等产品的功能。 总体来说,基于ARM Cortex-M3STM32嵌入式系统具有高性能、低功耗、丰富的外设接口等特点,可以广泛应用于工业自动化、物联网设备和消费电子等众多领域,为各类产品提供强大的计算和控制能力。 ### 回答2: 基于ARM Cortex-M3STM32嵌入式系统是一种高性能、低功耗的解决方案。STM32系列微控制器基于ARM Cortex-M3内核,具有丰富的外设和功能,适用于各种嵌入式应用。 STM32嵌入式系统原理是基于ARM Cortex-M3内核的运行机制。ARM Cortex-M3是一种32位的低功耗处理器,具有较高的性能和灵活性。STM32通过在芯片上集成了丰富的外设模块(例如通用输入输出、串行通信接口、模数转换器等)以及存储器和时钟管理模块,实现了完整的嵌入式系统功能。 嵌入式系统应用方面,STM32可广泛应用于工控、家电、汽车电子、医疗设备等领域。在工控领域,STM32可用于控制和监测生产过程,实现智能化管理。在家电领域,STM32可用于控制空调、洗衣机等家电设备,提高其性能和用户体验。在汽车电子领域,STM32可用于车载娱乐、导航和车身控制等系统。在医疗设备领域,STM32可用于监测和控制医疗设备,提高诊断和治疗效果。 STM32的优点包括低功耗、高性能、丰富的外设、易于开发和灵活的应用性。低功耗使得STM32在电池供电或移动设备应用中非常适用。高性能和丰富的外设让STM32能够处理复杂的任务和连接多种外部设备。易于开发的特性使得开发者能够快速上手并进行系统开发。灵活的应用性使得STM32能够应对不同的应用需求和系统架构。 总之,基于ARM Cortex-M3STM32嵌入式系统以其优异的性能和丰富的外设被广泛应用于各种嵌入式系统领域,为各种应用提供了高效、低功耗的解决方案。 ### 回答3: STM32是意法半导体公司推出的一种基于ARM Cortex-M3内核的嵌入式系统。它采用了先进的芯片设计和先进的嵌入式开发技术,具有高性能、低功耗和丰富的外设接口等特点。 基于ARM Cortex-M3STM32嵌入式系统原理主要包括以下几个方面: 1. ARM Cortex-M3内核:ARM Cortex-M3是一种高性能、低功耗的32位处理器内核。它具有高性能的运算能力和丰富的指令集,能够处理复杂的计算任务。 2. 外设接口:STM32嵌入式系统提供了丰富的外设接口,包括多个GPIO引脚、UART、SPI、I2C、ADC等。这些外设接口可与外部设备进行通信,实现数据的输入和输出。 3. 存储器:STM32嵌入式系统具有不同类型的存储器,包括闪存、RAM和EEPROM。闪存用于存储程序代码和数据,RAM用于临时数据存储,EEPROM用于非易失性数据存储。 4. 中断系统:STM32嵌入式系统具有强大的中断系统,可实现多任务并发执行。通过中断系统,可以及时响应外部事件,并执行相应的任务。 基于ARM Cortex-M3STM32嵌入式系统应用广泛,主要包括以下几个方面: 1. 工业控制:STM32可以广泛应用于工业自动化领域,用于控制和调节各种设备和系统,如PLC、人机界面等。 2. 智能家居:STM32可以用于智能家居控制系统,实现对家居设备的远程控制和管理,如智能灯光、安防系统等。 3. 汽车电子:STM32可以应用于汽车电子领域,用于发动机控制、车载娱乐系统、导航系统等。 4. 医疗设备:STM32可以应用于医疗设备,如医疗监护仪、心电图仪等,实现对患者的监测和治疗。 总之,基于ARM Cortex-M3STM32嵌入式系统具有高性能、低功耗和丰富的外设接口等特点,广泛应用于各个行业的嵌入式系统开发。它为开发者提供了强大的功能和丰富的接口选项,可以满足不同领域的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值