历史上的今天
返回首页

历史上的今天

今天是:2024年09月07日(星期六)

2019年09月07日 | STM32低功耗停止模式 以及简述判断中断的两种方式

2019-09-07 来源:eefocus


#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上的中断标志位

}

 

}

推荐阅读

史海拾趣

EPCOS/TDK公司的发展小趣事

作为全球领先的电子元器件制造商之一,EPCOS在通信领域取得了显著的突破。其电容器、电感器等产品在通信系统中发挥着关键作用,为各种通信设备提供了稳定的电源和信号处理方案。EPCOS不断投入研发资源,致力于开发适应新一代通信技术需求的高性能电子元器件。这些创新产品不仅提高了通信系统的性能和可靠性,也推动了整个通信行业的进步。

以上是关于EPCOS/TDK公司发展起来的5个相关故事。这些故事不仅展示了公司在技术创新、市场拓展等方面的成就,也体现了其在电子行业中的重要地位和影响力。

Dalian Dlicap Corporation公司的发展小趣事

为了满足市场不断增长的需求,达利凯普在大连市金普新区投资建设了高端电子元器件产业化项目。该项目总用地面积4万平方米,总建筑面积5.6万平方米。项目建成后,将实现年产射频微波瓷介电容器30亿只的产能规模,进一步巩固了公司在行业内的领先地位。同时,该项目的实施也为当地经济发展注入了新的活力。

GardTec Inc公司的发展小趣事

背景:GardTec始终致力于产品创新和技术研发,不断推出符合市场需求的新产品。

发展:公司积极与风扇制造商密切合作,联合推出了一系列具有创新性的风扇配件产品。同时,GardTec还投入大量资源用于研发工作,不断提升产品的技术含量和附加值。

影响:通过持续的创新与合作,GardTec不仅巩固了其在风扇配件市场的领先地位,还推动了整个行业的技术进步和产业升级。

Amulet Technologies公司的发展小趣事

背景:在电子产品行业,产品品质和安全合规性至关重要。GardTec深知这一点,始终将产品品质放在首位。

发展:公司建立了严格的质量控制体系,确保每一件产品都符合最高的品质标准。同时,GardTec还积极遵循国际安全标准和法规要求,如REACH/RoHS等,确保产品的合规性。

影响:高品质的产品和严格的合规性要求,使得GardTec在电子行业中赢得了客户的信赖和好评,进一步提升了公司的品牌形象和市场竞争力。

AINFO Inc公司的发展小趣事

AINFO Inc公司在追求经济效益的同时,也积极履行社会责任,关注可持续发展。公司注重环境保护和资源节约,通过采用环保材料和节能技术,降低了生产过程中的能耗和排放。同时,公司也积极参与公益事业,为社会做出了积极贡献。

请注意,以上故事仅为框架性的描述,并非AINFO Inc公司的实际发展历程。如果您需要了解该公司的具体发展情况,建议查阅相关资料或访问其官方网站。

Dantona Industries公司的发展小趣事

随着公司实力的增强,Dantona Industries开始寻求市场扩张的机会。他们首先将目光投向了海外市场,通过参加国际展会、建立海外销售网络等方式,逐步打开了国际市场的大门。然而,市场扩张也带来了新的挑战。不同国家和地区的市场需求、文化差异、法律法规等因素都需要公司去适应和应对。在这个过程中,Dantona Industries展现了出色的市场洞察力和应变能力,成功克服了各种困难,实现了市场的稳步扩张。

问答坊 | AI 解惑

彩电企业抱团应对出口壁垒

本帖最后由 jameswangsynnex 于 2015-3-3 19:59 编辑 备受关注的中国彩电企业应对出口专利壁垒有了新的突破。经过与众多国外专利权利人近两年的接触谈判,彩电出口交纳专利费用问题有了较大程度缓和,彻底扭转了DVD时代在专利问题上的被动局面,困扰 ...…

查看全部问答>

这个程序用在2051要怎么改

芯片:89c51 工作晶振:12Hz 功能: 1、按遥控器上的\"1\"键,对应1号灯就点亮,2和3键对应另外两只灯,\"关\"将关闭所有灯。 由于这批灯泡的功率较大,考虑到器件的发热,设计中同一时间内只能亮一只灯。 2、调光功能。如要对灯进行调光,可 ...…

查看全部问答>

LED与荧光粉知识

 近年来,在照明领域最引人关注的事件是半导体照明的兴起。20世纪90年代中期,日本日亚化学公司的Nakamura等人经过不懈努力,突破了制造蓝光发光二极管(LED)的关键技术,并由此开发出以荧光材料覆盖蓝光LED产生白光光源的技术。半导体照明具有绿色 ...…

查看全部问答>

寻找串口通信高手

   问题如下,我用了cncomm1.51类,我读取数据的时候,数据老是不稳定。有的电子设备读取数据很稳定的,请问下,同过com口读取数据和硬件设备有关吗?是什么关系呢?谢谢。…

查看全部问答>

wince5.0 debug编译出错,release编译正常

如题。。。。。。debug错误提示是 BUILD: [01:0000000169:ERRORE] NMAKE :  U1073: don\'t know how to make \'F:\\wince5project\\test1\\WINCE500\\new2440_ARMV4I\\cesysgen\\sdk\\lib\\ARMV4I\\retail\\Ndis.lib\' BUILD: [01:000 ...…

查看全部问答>

地震了患难见真情,我校都捐款了,钱财身外之物。

一直关注各界捐款的情况,像网易,一般会捐,对这种会捐款的公司比较有好感。请问有没有搞嵌入式的公司捐款。最好在北京,天津。明年我一定争取机会到这种公司面试。…

查看全部问答>

【分享】单c,自己用汇编写出来了,呵呵,进步。

这是c: #include                         //包括一个标准的51头函数 #define uchar unsigned char                    &nb ...…

查看全部问答>

有谁用LTC3555?请帮忙看看芯片上的文字。我都割掉使能线了,表现仍与手册相反

的LTC3555的EN1脚表现与手册相反,手册是高电平有效,我的却是低电平有效。 已经把EN1割断了,飞线试了一下,还是一样的。 我的片子上的文字是: 6C 3555 J9729 我现在怀疑是假货,或者是Linear公司专为某些公司修改的。 有谁用?帮 ...…

查看全部问答>

WINCE下自带的数据库,创建数据库函数问题

请问在使用WINCE下自带的数据库编程的时候,在使用CeCreateDatabaseEx函数的时候,这个函数的两个参数是如何定义的? 我是这样写的 CEDBASEINFO ceDbInfo;                         ...…

查看全部问答>