STM32低功耗停止模式 以及简述判断中断的两种方式

发布者:导航灯最新更新时间:2019-09-07 来源: eefocus关键字:STM32  低功耗  停止模式  判断中断 手机看文章 扫描二维码
随时随地手机看文章


#include "wkup.h"

#include "led.h"

#include "delay.h"

//////////////////////////////////////////////////////////////////////////////////  

//本程序只供学习使用,未经作者许可,不得用于其它任何用途

//ALIENTEK战舰STM32开发板

//待机唤醒 代码    

//正点原子@ALIENTEK

//技术论坛:www.openedv.com

//修改日期:2012/9/7

//版本:V1.0

//版权所有,盗版必究。

//Copyright(C) 广州市星翼电子科技有限公司 2009-2019

//All rights reserved   

//////////////////////////////////////////////////////////////////////////////////

 

#if 0

void PWR_EnterSleepMode(uint8_t PWR_SLEEPEntry); //睡眠模式

void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry);  //停机模式

void PWR_EnterSTANDBYMode(void);    //待机模式

#define PWR_Regulator_ON               //电源不进低功耗 唤醒基本没延迟

#define PWR_Regulator_LowPower         //电源进去低功耗 不过唤醒启动有一点延迟    

 

#define PWR_STOPEntry_WFI              //中断唤醒

#define PWR_STOPEntry_WFE              //事件唤醒

 

#endif

 

int exitflag;

void Sys_Standby(void)

{  

// NVIC_SystemLPConfig(NVIC_LP_SLEEPDEEP,ENABLE);

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

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

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

//                                     任意中断             事件

//PWR_EnterSTOPMode(PWR_Regulator_ON, PWR_STOPEntry_WFI|PWR_STOPEntry_WFE);//停机模式模式 

PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);

 

}

//系统进入待机模式

void Sys_Enter_Standby(void)

{  

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

Sys_Standby();

//SystemInit();//重要,由于停机下对所有时钟关闭,所以唤醒需要重新配置时钟!

}

//检测WKUP脚的信号

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

//      0:错误的触发

u8 Check_WKUP(void) 

{

u8 t=0; //记录按下的时间

LED0=0; //亮灯DS0 

while(1)

{

if(WKUP_KD)

{

t++; //已经按下了 

delay_ms(30);//N190729164522608323

if(t>=100) //按下超过3秒钟

{

LED0=0; //点亮DS0 

return 1; //按下3s以上了

}

}else 

LED0=1;

return 0; //按下不足3秒

}

}

//中断,检测到PA0脚的一个上升沿.   

//中断线0线上的中断检测

 

 

//PA0 WKUP唤醒初始化

void STOP_Init(void)

{

  GPIO_InitTypeDef  GPIO_InitStructure;   

EXTI_InitTypeDef EXTI_InitStructure;

NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);//使能GPIOA

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

//另外, STM32 的所有 GPIO 都引入到 EXTI 外部中断线上,使得所有的 GPIO 都能作为外部中断的输入

//源。所以如果把 GPIO 用作 EXTI 外部中断时,还需要开启 AFIO 时钟。

 

 

 

 

GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0|GPIO_Pin_1; //PA.0 PA.1

GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPD;//上拉输入

GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化IO

 

    //使用外部中断方式

GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource0); //中断线0连接GPIOA.0

EXTI_InitStructure.EXTI_Line = EXTI_Line0; //设置按键所有的外部线路

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //设外外部中断模式:EXTI线路为中断请求

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;  //上升沿触发

  EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能外部中断通道

EXTI_Init(&EXTI_InitStructure); // 初始化外部中断

    //使用外部中断方式

GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource1); //中断线0连接GPIOA.1

EXTI_InitStructure.EXTI_Line = EXTI_Line1; //设置按键所有的外部线路

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //设外外部中断模式:EXTI线路为中断请求

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising ;  //    下降沿触发EXTI_Trigger_Falling 上升沿触发EXTI_Trigger_Rising

  EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能外部中断通道

EXTI_Init(&EXTI_InitStructure); // 初始化外部中断

 

NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //使能按键所在的外部中断通道

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //先占优先级2级

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //从优先级2级

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道

NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; //使能按键所在的外部中断通道

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //先占优先级2级

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //从优先级2级

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道

NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

}

 

 

void EXTI0_IRQHandler(void)

{                   

if(EXTI_GetITStatus(EXTI_Line0)!=RESET)    //按压检测口中断信号出现 判断中断是否发生

{

 

exitflag++;

Sys_Standby(); //执行中断事件?

//LED0=0;

//SystemInit();

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

EXTI_ClearFlag(EXTI_Line0); // 清除LINE10上的中断标志位

}

// EXTI_ClearFlag// 清除LINE10上的中断标志位

//EXTI_GetFlagStatus  If(EXTI_GetFlagStatus(EXTI_Line3)!-=RESET)//判断是否置位

//EXTI_GetITStatus()会先判断该中断是否使能,若使能了再判断中断标志位,

//而EXTI_GetFlagStatus()直接判断中断标志位是否置位。

//所以说方式的EXTI_GetITStatus()会好点,一般配合EXTI_ClearITPendingBit()使用

 

 

 

 

 void NVIC_CoreReset(void)

{

  __DSB();                                                          /* Ensure all outstanding memory accesses included

                                                                       buffered write are completed before reset */

  SCB->AIRCR  = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos)    |

                           (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |

                            SCB_AIRCR_VECTRESET_Msk    );         /* Keep priority group unchanged */

  __DSB();                                                          /* Ensure completion of memory access */

 

  for(;;)                                                           /* wait until reset */

  {

    __NOP();

  }

}

void EXTI1_IRQHandler(void)

{   

if(EXTI_GetITStatus(EXTI_Line1)!=RESET)    //按压检测口中断信号出现

{           

SystemInit();

__set_FAULTMASK(1); //关闭所有中断

NVIC_SystemReset(); //复位

NVIC_CoreReset();

RTC_WaitForLastTask();

 

LED0=1;

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

EXTI_ClearITPendingBit(EXTI_Line1); // 清除LINE11上的中断标志位

EXTI_ClearITPendingBit(EXTI_Line1); // 清除LINE11上的中断标志位

EXTI_ClearFlag(EXTI_Line1); // 清除LINE11上的中断标志位

}

 

}

关键字:STM32  低功耗  停止模式  判断中断 引用地址:STM32低功耗停止模式 以及简述判断中断的两种方式

上一篇:​​​​​​​简述STM32 CAN总线的设置
下一篇:STM32 IIC OLED中英文显示

推荐阅读最新更新时间:2024-11-20 00:01

STM32的IWDG使用
关于独立看门狗,很简单,打开喂狗,就这么简单,很多书上讲了很多什么寄存器什么的,对于初学者而言,这些还不是很重要,重要的是先学会用,用了之后慢慢去消化,为什么这东西要这么设置。好了下面来看看我的程序,很简单: void Iwdg_Init(void) { IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); IWDG_SetPrescaler(IWDG_Prescaler_256); IWDG_SetReload(0xfff);//设置这个就可以调整IWDG的喂狗时间 //如果在这段时间内没有喂狗,那么就会重启 IWDG_ReloadCounter(); IWDG_Enable(); IWDG
[单片机]
未使用的I/O口与低功耗,抗干扰处理的关系
针对 MSP430 单片机设置 导致耗流量高于预期值的一个问题是打开输入。为了防止打开输入,请对未使用的 I/O 引脚使用以下解决方案之一: 将未使用的 I/O 切换到输出模式 将未使用的输入连接到 VCC 或 VSS 通过电阻器将未使用的输入连接到 VCC 或 VSS 提示: 将未使用的引脚 Test/Vpp 连接到 VSS (GND) 是一种很好的设计实践。如果将引脚 Test/Vpp 路由到 JTAG 连接器以进行调试,则外部下拉电阻器将提高 EMI/EMC 性能。 ==========================================================================
[单片机]
STM32 中断函数SysTick_Handler理解
目的 滴答定时器整理(STM32F103)。用了一段时间的滴答定时器,突然忘记其中配置方法,重新翻阅手册及博文,在此记录备忘。 SysTick的重装寄存器决定了定时器频率,若SysTick的时钟源是72M, SystemFrequency = 72000000Hz //1ms时基 //HCLK_Frequency = 72000000Hz; //#define OS_TICKS_PER_SEC 1000 SysTick_SetReload((u32)RCC_Clocks.HCLK_Frequency / OS_TICKS_PER_SEC); 时钟树 寄存器 寄存器名称和地址 STK_CSR, 0x
[单片机]
<font color='red'>STM32</font> <font color='red'>中断</font>函数SysTick_Handler理解
STM32串口中断 RXNE TXE
RXNE中断 (使能位为RXNEIE) 串口接收寄存器非空中断, 通过读取接收寄存器清除中断标志位 TXE中断(使能位为TXEIE) 串口发送寄存器空中断, 当不需要发送数据时,需要失能此中断,否则由于满足发送寄存器为空的条件,会一直进入中断 通过写接收寄存器清除中断标志位,当发送完成时寄存器为空,此位又会被被硬件置1 进入中断时,需要判断中断标志位和中断使能位,当两个标志位同时为1时才满足中断的条件,否则由于不同中断源共用中断入口而导致错误。(如RXNE触发了中断,此时TXE标志位也可能为1,若没有对TXEIE位进行判断可能会误认为产生了TXE中断,造成错误)
[单片机]
STM32开发笔记97: C++语言命名规范
单片机型号:STM32F091RCT6 在此文章中记录C++语言的命名规范。 1、文件名均采用小写英文字母方式实现,多个英文单词之间用“_ 予以分割; 2、宏定义均采用大写英文字母方式实现,多个英文单词之间用“_ 予以分割; 3、自定义数据类型均小写英文字母方式实现,多个英文单词之间用“_ 予以分割; 4、类名首字母用C表示,后续采用匈牙利命名法,首字母大写,如遇英文缩写单词,则按照英文命名规范进行拼写,例如LED为缩写单词,但是英文规范可以写作led或Led,则类名用CLed表示,而HAL是硬件映射层的缩写,英文用全大写表示,使用时,则使用CHAL命名; 5、用类声明的类对象,去除首字母C即可,例如CLe
[单片机]
STM32之串口通信
串口通信原理 串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如IEEE488定义并行通行状态时,规定设备线总长不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。典型地,串口用于ASCII码字符的传输。通信使用3根线完成:(1)地线,(2)发送,(3)接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但是不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通信的端口,这些参数必须匹
[单片机]
<font color='red'>STM32</font>之串口通信
MAX9526低功耗视频解码器
MAX9526低功耗视频解码器将NTSC或PAL复合视频信号转换成8位或10位YCbCr分量视频,符合ITU-R BT.656标准。该器件上电时进入完全工作模式并自动配置,对检测到的输入标准信号进行解码。MAX9526在常规工作模式下典型功耗为200mW,关断模式下典型功耗小于100µW。   内部10位、54MHz模/数转换器(ADC)对输入信号进行4倍过采样。MAX9526具有带失调校准的直流恢复电路和自动增益控制功能,可精确优化ADC的满量程范围。   集成模拟抗混叠滤波器省去了外部滤波元件。MAX9526包括2:1输入复用器,根据输入端的有效信号自动选择信号。   内部行锁定锁相环(PLL)产生采样时钟和行锁定时钟(LL
[模拟电子]
MAX9526<font color='red'>低功耗</font>视频解码器
爱特梅尔针对低功耗设计推出1.8V 8Mb Flash
爱特梅尔公司 (Atmel® Corporation) 宣布业界首款能够在1.8V电压下运作的8Mb Serial Flash 器件 AT25DF081,经已准备投产。全新的AT25DF081具有1.65V到1.95V的低工作电压范围,与许多现有和即将面市的采用亚90nm工艺的ASIC和处理器/控制器相同的工作电压,允许系统设计人员最终创建出使用单一电源电压为系统中所有元件供电的应用,并可显著降低成本。不同于那些经筛选在较低电压下工作而使到性能降低的器件,AT25DF081专门针对1.8V电压而设计,能够让器件保持与3V电压同级产品一样的性能水平。 爱特梅尔根据客户的直接及特定需求开发出AT25DF08
[电源管理]
爱特梅尔针对<font color='red'>低功耗</font>设计推出1.8V 8Mb Flash
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved