完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
唤醒MCU,比如当MCU在低功耗状态下或者休眠之类的状态下,通过引脚的Wakeup功能可以将MCU唤醒,让MCU进入正常的工作状态。
低功耗模式、休眠模式----->唤醒后----->正常模式 大家翻开STM32的中文参考手册(你们看就行了,我翻,然后截图),里面关于STM32的低功耗模式有详细的标注,突然不想截图。 1、睡眠模式(Cortex™-M3内核停止,所有外设包括Cortex-M3核心的外设,如NVIC、系统时钟(SysTick)等仍在运行) 2、停止模式(所有的时钟都已停止) 3、待机模式(1.8V电源关闭)(我们本博客中具体介绍的一种模式,也是功耗最低的模式) 现附上三者照片,望观众好好欣赏,还有请稍微注意下我的涂鸦,小弟感激不尽: 啊哈,这照片是不是很神奇呀,把三个老家伙的家底进行了较为认真的比较,而且从照片中我们也可以看出,如何进入,如何唤醒他们,而且有什么影响都跟我们透露了,可谓是后生可畏呀,所以我叫大家注意我美丽的涂鸦是有道理的,哈。 在本博客中,我们就利用WKUP引脚的上升沿来唤醒MCU,不好意思哈,老是把上升沿打成上小沈阳,所以我们就具体来介绍待机唤醒的实现方法。 那我们要怎么来进入待机模式?又要怎么唤醒呢? 看到“进入”中的红色数字标号了吧?没错了,我们只要按照此步骤来设置相应的寄存器就行了,那,我打???的是什么呢??好了,请容许我介绍下: 1、 Cotex_M3系统控制寄存器中的SLEEPDEEP位到底在哪呢??大家请翻开《权威指南》第182页可以看到表格、、当然这里不用你翻开、、因为我已截图: 2、电源控制寄存器(PWR_CR)中PDDS位:请看寄存器的位: 3、电源控制/状态寄存器(PWR_CSR)中EWUP位 至此、我们通过这三步、完成了进入待机模式的任务、、那我们怎么通过程序实现呢?啊哈!库神出现吧。系统出现奔溃、请稍后、详情请咨询10086。 额、出现了点意外、不急哈、那我们先来看看怎么退出待机模式:重现一张图片: 看到了吧、、在这里我们就利用其中一种方式来唤醒:WKUP引脚的上升沿、注意哈、注意此上升沿三个字哈、 至于为什么要注意上升沿、在这里提出我也是有目的、先记着哈、你此时想的为什么要注意的原因肯定跟我待会提到的时候不一样、在此先奸笑下、 那我们要怎么来唤醒呢?? 亲、、我们通过外部中断触发来唤醒、、所以请看代码: void Wkup_Init(void){ EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; KEY_Init();//我的IO初始化在按键里已经初始化了 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0); EXTI_InitStructure.EXTI_Line = EXTI_Line0; //PA0 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); if(Check_up() == 0) //系统初始化后由于没有按下按键,所以系统直接进入了待机模式了,所以下载了程序没有任何反应。需要人为的唤醒:死猪,就知道睡,快醒、、 { Sys_Standby(); //进入待机模式 } }//正常模式下会运行中断服务函数,而待机模式下则不会运行中断服务函数,因为待机模式下MCU不工作,所以上升沿的作用也仅仅是唤醒。//在这里提醒:唤醒只需要上升沿,所以从待机模式切换到正常模式下从始至终都不会执行中断服务函数//在这里,知道我为什么要在上面提醒大家要注意上升沿了吧、(下面还有)、//至于为什么不会执行,待会我还会给出解释。 void EXTI0_IRQHandler(void){ EXTI_ClearITPendingBit(EXTI_Line0); if(Check_up()) { Sys_Enter_Standby(); }}看到以上代码会不会熟悉呢??在这里就不解释了哈,所以重点来讲讲步骤 1、使能PWR的时钟:RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); 2 、使能唤醒的功能:PWR_WakeUpPinCmd(ENABLE); 3、进入待机模式 : PWR_EnterSTANDBYMode(); 请看代码: void Sys_Standby(void) //在唤醒初始化中调用{RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);PWR_WakeUpPinCmd(ENABLE);PWR_EnterSTANDBYMode();}void Sys_Enter_Standby(void)//在中断函数里调用,用来复位,然后进入待机模式{RCC_APB2PeriphResetCmd(0X01FC,DISABLE); //在这里只是复位了IO口、、至于0x01fc是怎么来的、、大家请看RCC_APB2RSTR(下图)Sys_Standby();}最后我们给出按键检测的处理程序,在这里,3S只是一个效果,也可以不用,也可以长点,看你个人哈(原子的程序,别告我盗版哈) u8 Check_up(void){u8 t = 0;u8 tx = 0;LED0 = 0;while(1){if(KEY3 == 1) //检测到按键按下{t++;tx = 0;}else{tx++;if(tx > 3){LED0 = 1;return 0; //错误按键或者按键时间不够}}delay_ms(30);if(t > 100) //100*30ms = 3s{LED0 = 0;return 1;// 3s}}}看到这里,可能有人会有些搞不懂在中断服务函数那里的逻辑、、在这里我给出解释哈: /*从正常运行模式切换到待机模式 按住wkup键 外部中断0中断被触发 执行中断服务函数 Check_up()函数开始检测 如果时间没超过3s 返回零 这时工作在正常运行模式 如果按住时间超过了3s 返回值为1 进入待机模式我们的程序在刚开始运行时就是没有按键按下,所以没有上升沿,初始化函数里条件成立,从而进入了待机模式:请看初始化的代码:*/if (Check_up() == 0){ Sys_Standby(); //进入待机模式}/*从待机模式切换到正常运行模式 按住wkup键的那一瞬间会有一个上升沿 而这个上升沿执行了唤醒功能但是没有执行外部中断0的中断服务函数 待机模式下cpu是不工作的 从待机模式唤醒后的代码执行等同于复位后的执行所以程序又会从头开始执行(这句话很重要) 然后又会执行到 Check_up()函数检测 如果按住键盘的时间没有超过3s 还是会处于待机模式 加入超过了3s 返回值为1 条件不成立 就会切换到正常运行模式 所以结论就是外部中断0的中断服务程序在待机模式切换到正常运行模式的时候从始至终是不会运行的记住:唤醒中只是说需要上升沿、、并没有说要进入中断*/所以:
任务目标 配置wakeup唤醒低功耗,上电灯亮5秒后关闭,进入低功耗模式;若未进入低功耗则会灯闪烁;当按下wakeup则唤醒MCU。 CubeMx配置 PA0配置wakeup唤醒 配置LED指示灯 别的无需配置。 代码 int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); /* USER CODE BEGIN 2 */ LED(0); __HAL_RCC_PWR_CLK_ENABLE();//使能PWR时钟 if (__HAL_PWR_GET_FLAG(PWR_FLAG_SB) != RESET)//检查并检查系统是否从待机模式恢复 { /* Clear Standby flag */ __HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB); } HAL_Delay(5000); LED(1); HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1);//禁用所有使用的唤醒源:PWR_WAKEUP_PIN1 connected to PA.00 __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);//清除所有相关的唤醒标志 HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);//启用连接到PA.00的WakeUp Pin HAL_PWR_EnterSTANDBYMode();//进入待机模式 /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ HAL_Delay(500); LED_TURN(); } /* USER CODE END 3 */ } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1618 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1545 浏览 1 评论
979 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
683 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1597 浏览 2 评论
1864浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
645浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
516浏览 3评论
532浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
505浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 18:40 , Processed in 0.650711 second(s), Total 47, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号