stm32单片机待机模式的设计

发布者:脑电风暴最新更新时间:2024-03-04 来源: elecfans关键字:stm32  单片机  待机模式 手机看文章 扫描二维码
随时随地手机看文章

一 待机模式简介

在stm32的低功耗模式中,待机模式可以实现系统的最低功耗,在这种模式下,只需要2uA左右的电流。


三 待机唤醒程序分析

实验现象:

将程序下载到开发板上后,LED灯会不断地亮灭,当按下KEY2键超过3s时,LED灯灭,标志着单片机进入待机模式,再按下KEY1键,这时唤醒单片机,LED又开始不断地亮灭亮灭。

程序中用到的一些宏定义


#definemacEXTI_GPIO_CLK(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO)

#definemacEXTI_GPIO_PORTGPIOC

#definemacEXTI_GPIO_PINGPIO_Pin_13

#definemacEXTI_SOURCE_PORTGPIO_PortSourceGPIOC

#definemacEXTI_SOURCE_PINGPIO_PinSource13

#definemacEXTI_LINEEXTI_Line13

#definemacEXTI_IRQEXTI15_10_IRQn

#definemacEXTI_INT_FUNCTIONEXTI15_10_IRQHandler

主函数:

intmain(void)

{

/*configtheled*/

LED_GPIO_Config();

/*extilineconfig*/

EXTI_Pxy_Config();//初始化中断函数

USARTx_Config();

if(PWR_GetFlagStatus(PWR_FLAG_WU)==SET)

{

printf(“rn使能电源管理时钟单元前的检测,待机唤醒复位rn”);

}

else

printf(“rn使能电源管理时钟单元前的检测,上电复位rn”);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);

if(PWR_GetFlagStatus(PWR_FLAG_WU)==SET)

{

printf(“rn使能后检测,待机唤醒复位rn”);

}

else

printf(“rn使能后检测,上电复位rn”);

while(1)

{

LED1(ON);

Delay(0xFFFFF);

LED1(OFF);

LED2(ON);

Delay(0xFFFFF);

LED2(OFF);

LED3(ON);

Delay(0xFFFFF);

LED3(OFF);

}

}

分析:在主函数中,除了用到一些必要的初始化之外,就是while循环,在while循环中点亮LED灯,唯一不太熟悉的是几个printf语句,这里暂时不管,先看EXTI_Pxy_Config()函数。

EXTI_Pxy_Config()函数

voidEXTI_Pxy_Config(void)

{

GPIO_InitTypeDefGPIO_InitStructure;

EXTI_InitTypeDefEXTI_InitStructure;

/*configtheextilineclockandAFIOclock*/

RCC_APB2PeriphClockCmd(macEXTI_GPIO_CLK,ENABLE);//开启GPIO时钟和AFIO时钟

/*configtheNVIC*/

NVIC_Configuration();

/*EXTIlinegpioconfig*/

GPIO_InitStructure.GPIO_Pin=macEXTI_GPIO_PIN;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;//配置为上拉输入

GPIO_Init(macEXTI_GPIO_PORT,&GPIO_InitStructure);

/*EXTIlinemodeconfig*/

GPIO_EXTILineConfig(macEXTI_SOURCE_PORT,macEXTI_SOURCE_PIN);

EXTI_InitStructure.EXTI_Line=macEXTI_LINE;

EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;

EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;//设置为上升沿触发中断!!!,也就是当单片机检测到按键的上升沿时进入中断程序

EXTI_InitStructure.EXTI_LineCmd=ENABLE;

EXTI_Init(&EXTI_InitStructure);

}

分析:在EXTI_Pxy_Config()函数中,先进行了KEY2按键的初始化,注意KEY2按键并不是WKUP按键,一定要注意。然后将KEY2按键的IO口配置为EXTI中断模式,上升沿触发,也就是说当KEY2按键被按下时就会触发中断。然后我们再分析当按键KEY2被按下时,执行的相应中断函数。

macEXTI_INT_FUNCTION()函数

///IO口线中断,中断口为PC13

voidmacEXTI_INT_FUNCTION(void)

{

if(EXTI_GetITStatus(macEXTI_LINE)!=RESET)//确保是否产生了EXTILine中断

{

printf(“rn进入EXTILine中断rn”);

//K2键长按进入待机模式

if(PWR_Check_Standby())//PWR_Check_Standby()函数是用来判断按键时长的,如果按键时间长超过3S就返回1,否则返回0

{

//使能WKUP引脚的唤醒功能

PWR_WakeUpPinCmd(ENABLE);


关键字:stm32  单片机  待机模式 引用地址:stm32单片机待机模式的设计

上一篇:STM32的硬件I2C设计有BUG
下一篇:STM32的ADC的采样周期确定

推荐阅读最新更新时间:2024-11-17 07:54

自己做单片机实时操作系统1前言
操作系统在之前对于我自己还说一直是一个很陌生的东西,不知道该如何的理解和定义。终于当完成某些比较繁琐的项目时,发现多任务的操作系统是一个很好的东西。 之前总是在看着别人怎么去实现一个操作系统,最终有了自己去写一个的想法。按照ucOS的作者说的一样,操作系统最终就是一个保护寄存器和恢复寄存器的动作。 手上只有一个MCU飞思卡尔DG128的开发板,然后就开始写代码吧。当然要先练习一下自己的C 语言啦。 1、理解一下函数指针先。 我们知道每一个函数都有自己的一个指针 void ProcFun1(void) 那么ProcFun1就是一个指针。 如下面一个我测试的程序: typedef void(*VOID_FUN_PTR)(void)
[单片机]
STM32 TFT学习笔记——触摸屏
主机环境:Windows 7 SP1 开发环境:MDK5.14 目标板:ST NUCLEO-F303RE TFT型号:2.4英寸,带触摸,SD卡,240*320分辨率,26万色 驱动IC:ILI9325 ST库版本:STM32Cube_FW_F3_V1.1.0 SD卡:Kingston 16GB Micro SDHC Class 10 触摸IC:XPT2046 关于XPT2016的说明可以从网上下载很多资料,XPT2046使用SPI通信接口,接口说明如下: 多出了一个BUSY脚和一个PENIRQ脚,BUSY信号指示XPT2046工作状态,但是在使用过程中发现其不起作用,所以就没用了,PEN
[单片机]
<font color='red'>STM32</font> TFT学习笔记——触摸屏
AVR单片机IO使用注意事项及结构全攻略
为搞清IO结构,首先看看上拉和下拉电阻的作用。 一、上拉电阻 上拉就是将不确定的信号通过一个电阻钳位在高电平!电阻同时起限流作用!下拉同理! 上拉电阻是用来解决总线驱动能力不足时提供电流的。一般说法是拉电流,下拉电阻是用来吸收电流。 1、在用TTL电路驱动CMOS电路时,若TTL的高电平低于CMOS要求的高电平的门限值(1,TTL电平: 输出高电平 2.4V,输出低电平 0.4V。在室温下,一般输出高电平是3.5V,输出低电平 是0.2V。最小输入高电平和低电平:输入高电平 =2.0V,输入低电平 =0.8V,噪声容限是 0.4V。 2,CMOS电平: 1逻辑电平电压接近于电源电压,0逻辑电平接近于0V。而且具有很宽的噪
[单片机]
AVR<font color='red'>单片机</font>IO使用注意事项及结构全攻略
全新MCX W系列MCU赋能更广阔连接
基于MCX N和MCX A系列微控制器取得的成功,恩智浦发布支持多协议无线连接的MCX W系列。作为MCX广泛产品组合的重要成员,MCX W系列具有与MCX产品其他系列相同的Arm® Cortex®-M33内核,并与MCX产品其他系列共享外设平台。 MCX W系列的亮点在于其支持多种无线标准,包括Matter、Thread、Zigbee和低功耗蓝牙等,从而为整个MCX产品组合带来无线连接的新可能。 MCX W将成为MCX产品组合无线应用的首选解决方案。 目标应用场景广泛,涵盖: 工业和物联网的边缘传感器与控制器 商业楼宇的门禁控制、分布式照明和窗帘等基础设施产品 智能家居设备,如智能锁、灯光控制系统、智能
[嵌入式]
全新MCX W系列<font color='red'>MCU</font>赋能更广阔连接
STM32在程序运行过程中关闭定时器重新打开后定时器不工作的
问题:数码管显示程序放在定时TIM2中断函数里面扫描,想要实现在关闭某一功能的时候数码管不显示。 刚开始的想法是开关关闭,关闭定时器时钟;开关打开,打开定时器时钟;(但实验证明再次打开开关时定时器2却不工作:表现为数码管不显示) 解决办法: 开关关闭,关闭定时器更新中断(即TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE);) 开关再次打开,开启定时器更新中断(即TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);) 关闭中断可以达到不进入定时去中断服务函数,同样达到数码管不显示的目的。
[单片机]
51单片机实现4位数以内的加减法
  中南民族大学,电子信息工程学院,开设了一门课程,叫《嵌入式电路设计》,由舒老师带头,旨在引导低年级的学生入门嵌入式,其内容比较多,包括模电、数电、C语言、单片机、EDA技术等。最近有位师弟找到我,希望我能帮他指导一下,利用AT89C52单片机设计一个最小系统,其中包括矩阵键盘、数码管显示、中断、2位数加减法、定时计数与暂停等功能。我也粗略的设计了一个,在此分享出来,希望能对初学者有所帮助,使更多的人加入到嵌入式的行业来。   开发工具:keil   仿真工具:proteus 代码如下: 头文件:inc_all.h 1 #ifndef INC_ALL_H_ 2 #define INC_ALL_H_ 3 4 volati
[单片机]
STM32启动代码分析问题
能否讲解一下startup_stm32f10x_cl.s启动代码含义,谢谢! 我现在看反汇编如下 0x08000000 0678 LSLS r0,r7,#25(查看Memory窗口0x08000000 : 78 06 00 20 ---STM32小端缘故) 0x08000002 2000 MOVS r0,#0x00 0x08000004 1105 ASRS r5,r0,#408 0x08000006 0800 LSRS r0,r0,#00A 。。。。。。。。。。。。。。。。。。。。。。 上面应该对应 __Vectors DCD __initial_sp ; Top of Stack DCD Reset_Handler
[单片机]
用51单片机控制的充电器电路
用单片机AT89C2051控制的充电器电路
[单片机]
用51<font color='red'>单片机</font>控制的充电器电路
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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