STM32进入STOP模式并唤醒实验总结

发布者:快乐舞蹈最新更新时间:2019-03-29 来源: eefocus关键字:STM32  STOP模式  唤醒 手机看文章 扫描二维码
随时随地手机看文章

项目需求,需要实现设备低功耗功能,实现过程中遇到几个问题,以此记录总结。(stm32f103ret6)


问题一:执行PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);后,程序继续执行,看到的现象像是没有进入休眠。

 

调试步骤:


1.关闭自己的时钟配置,调用启动函数中默认的SystemInit()


2.关闭相关外设初始化,只开启串口一以追踪程序运行流程和一个IO中断以唤醒


现象:能进入终端并且正常唤醒


3.换为调用自己的时钟,休眠不了,一步步打开相关时钟配置没问题直到开启了


SysTick_Config(SystemCoreClock / 1000 )   //1ms定时器


就休眠失败


源码贴图如下:



原因:开始以为把所有的外设中断关闭就没事了,其实系统时钟开了个1Ms的系统定时中断(功能需要)


 


【解决方式】:


方式一:.注释SysTick_Config(SystemCoreClock / 1000)


方式二:.在进入休眠之前,关闭系统定时器,清空计数值


        SysTick->CTRL = 0x00;//关闭定时器

        SysTick->VAL = 0x00;//清空val,清空定时器


功能需要不能关闭,选择方式二


【补充说明】:


     SysTick系统定时器是属于CM3内核中的一个外设,内嵌在NUIV中。它是一个24bit的向下递减计数器,每计数一次的时间为1/SYSCLK。当重装载数值寄存器地见到0的时候,系统定时器就产生一次中断,一次循环反复。我的累计值是SystemCoreClock / 1000,所以中断就是1ms一次。


     相比定时器中断,产生之后需要清中断标志位,但是系统时钟中断是没有的,开始怀疑是不是中断产生之后标志位是不会复位的,导致停止模式进入被忽略,程序继续执行。后面找资料发现每次systick溢出后会置位计数标志位和中断标志位,计数标志位在计数器重装载后被清除,而中断标志位也会随着中断服务程序的响应被清除,所以这两个标志位是不需要手动清除的。


     具体为什么开启系统定时器之后不能进入停止模式还需要查找原因,在此也请各位网友赐教。


问题二:成功进入休眠并退出后,串口打印失败

原因:



       退出停止模式后,其他时钟还是保持原来的配置(原来我的配置是以外部高速时钟HSE不分频作为PLL时钟源,再经过9倍频得到,即72MHz,然后PLL作为系统时钟源,系统时钟一分频得到AHB总线时钟,AHB再 一分频作为高速总线时钟PCLK2,也就是72MHz,USART1用的就是高速总线时钟),这些配置是不会变的,但是退出停止模式后,内部高速时钟(HSI)默认变成了系统时钟源,造成时钟紊乱。


【其实不仅仅是串口,其他在进入停止模式之前的外设在退出停止模式之后都会工作不正常,重新配置系统时钟即可】


问题三:进入停止模式后整个电流还是很大



1.根据设备原理图查看IO外部引脚连接电路,闲置状态为低电平时,设置为下拉输入;闲置状态为高电平时,设置为上拉输入;闲置状态为悬空时设置为模拟输入;输出引脚根据功能需要设置就行


原因:当IO通过外围电路电阻接地被拉低时,如果设置为上拉输入,则在芯片内部的上拉电阻和外围的下拉电阻构成回路,电流损耗取决于这两个电阻;当IO通过外围电路电阻接电源被拉高时,则在芯片内部的下拉电阻和外围的上拉电阻构成回路,电流损耗也取决于这两个电阻;当悬空时,斯密特触发器是打开的,要判断输入的是高电平还是低电平,需要一点电流损耗,但是设备模拟输入,这个触发器是关闭的


2.排查外围电路,某些驱动、电源转换IC如果是由软件使能,如果进入停止模式之后不需要则关闭,因为本身就有工作电流;如果是由硬件使能,则需要查看芯片手册看静态工作电流是多少,如果比较高,只能修改硬件电路或者用低耗ic代替


3.外围是否有一些闭合回路,比如电压采集,虽然ADC已经关闭,但是这个分压电路还是有损耗的,大小一般取决于电阻和电源电压


4.另外如果在线调试时,进入停止模式后,调试失去作用,看看是不是SWDIO、SWCLK两个引脚也直接设置成了模拟输入,还关闭了调试功能:GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);


RTC唤醒停止模式

外部中断功能已经实现,项目需求中另外还需要定时唤醒,现在选用RTC唤醒


EXTI有20个中断/事件线,每个GPIO都能被设置为输入线,占用EXTI0-EXTI15,有4根用于特定的外设事件触发



所以RTC的闹钟事件就能触发EXTI17中断(这就是为什么进入停止模式设置的是中断唤醒,但还能用RTC闹钟事件唤醒的原因,本质还是被外部中断唤醒)


全功能代码不需要改,在进入停止模式之前配置EXTI17中断,配置闹钟事件


/**************************************1.配置EXTI17中断*********************************/


    EXTI_ClearITPendingBit(EXTI_Line17);                //注意先清掉标志位,要不然可能会出现停止模式被忽略进                                                                                                                //入不了的问题,上面问题一截图有说明

    EXTI_InitStructure.EXTI_Line = EXTI_Line17;

    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;

    EXTI_InitStructure.EXTI_LineCmd = ENABLE;

    EXTI_Init(&EXTI_InitStructure);


 


/**************************************2.配置中断控制器闹钟事件优先级*********************************/


    NVIC_InitStructure.NVIC_IRQChannel = RTCAlarm_IRQn;   //RTC在最开始初始化的时候是秒中断,这里添加闹钟事件


                                                                                                    //中断,此时RTC秒钟秒中断和闹钟事件中断同时开启

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    

    NVIC_Init(&NVIC_InitStructure);


 


/**************************************3.设置闹钟时间,sec即想要唤醒的时间间隔*********************************/


    RTC_SetAlarm(RTC_GetCounter() + sec);     //用RTC_SetAlarm()函数配置闹钟时间,当计数器的值与闹钟寄存器的


                                                                            //值相等时,可产生闹钟事件或中断

    RTC_WaitForLastTask();                                 //等待确保已成功修改RTC寄存器

    RTC_ITConfig(RTC_IT_ALR, ENABLE);        //使能闹钟事件   

    RTC_WaitForLastTask();


以上三步在将要进入停止模式之前执行。


 


/**************************************RTC中断函数*********************************/


void RTC_IRQHandler(void)

{

    if (RTC_GetITStatus(RTC_IT_SEC) != RESET)         //秒钟中断

    {                            

        RTC_GetTime(&SystemTime);                               //更新时间(项目需要)   

        RTC_ClearITPendingBit(RTC_IT_SEC);    

        RTC_WaitForLastTask();

     }

    if(RTC_GetITStatus(RTC_IT_ALR) != RESET)            //闹钟中断    

    {

        RTC_ClearITPendingBit(RTC_IT_ALR);                   //清中断

        RTC_WaitForLastTask();

    }

}


void RTCAlarm_IRQHandler(void)

{

    EXTI_ClearITPendingBit(EXTI_Line17);                      //闹钟事件发生,会产生一个EXTI_17外部中断,此标志位要清除,否                                                                                             //则下次停止模式进入失败,原因见问题一贴图

}


 


【补充】:

1.每次进入停止模式之前,都重新执行最开始的三步配置,否则可能出现前几次闹钟事件会触发,后面触发失败的问题。


2.停止模式唤醒之后,需要重新初始化系统时钟,这时候可以把闹钟中断关闭(因为进入之前会重新开启,避免没有进入停止模式时一直有闹钟事件产生)


关键字:STM32  STOP模式  唤醒 引用地址:STM32进入STOP模式并唤醒实验总结

上一篇:STM32 μC/OS系统进睡眠模式的方法
下一篇:STM32串口IAP实验详解

推荐阅读最新更新时间:2024-03-16 16:26

时钟失效之后,STM32还能运行?
问题: 该问题由某客户提出,发生在 STM32F103VDT6 器件上。据其工程师讲述:在其产品的设计中,STM32 的 HSE 外接 8MHz 的晶体产生振荡,然后通过 STM32 内部的PLL 倍频到 72MHz,作为 STM32 的系统时钟,驱动芯片工作。在 STM32 片外有专用的看门狗芯片,监控 STM32 的运行。STM32 内部的软件会在 STM32 的某个管脚上产生脉冲来复位看门狗。一旦 STM32 没有及时的产生脉冲来复位门狗,则看门狗会认为 STM32 运行不正常,从而复位 STM32。在对该产品做可靠性测试时,进行了对看门狗监控时钟失效能力的测试。测试的方法是:将 HSE 外接的晶体的两个端子接地,使其停止振
[单片机]
时钟失效之后,<font color='red'>STM32</font>还能运行?
STM32 定时器1配置
//通用定时器中断初始化 //这里时钟选择为APB1的2倍,而APB1为36M //arr:自动重装值。 //psc:时钟预分频数 //这里使用的是定时器3! void TIM1_Int_Init(u16 arr,u16 psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //时钟使能 TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的
[单片机]
stm32 rtc 实时时钟
STM32的实时时钟是一个独立的定时器 通常会在后备区域供电端加一个纽扣电池,当主电源没有电的时,RTC不会停止工作 若VDD电源有效,RTC可以触发秒中断、溢出中断和闹钟中断 备份寄存器BKP 备份寄存器是42个16位的寄存器,他们处在备份域里,当VDD电源被切断,他们仍然由VBAT维持供电。当系统在待机模式下被唤醒或系统复位或电源复位时,他们也不会被复位 RTC配置步骤 1.使能电源时钟和后备区域时钟 2.取消后备区域的写保护,DBP 3.复位备份区域 4.外部低速振荡器使能,LSE 5.RTC时钟源选择,LSE 6.RTC时钟使能 7.进入配置模式 8.设置RTC预分频装载值 9.设置R
[单片机]
<font color='red'>stm32</font> rtc 实时时钟
【STM32F103攻城笔记】STM32之MDK(Keil)环境搭建(二)
继续上面的操作,我们打开keil,是空的! 点击project - New uVision Project 选择工程的位置并命名工程名字 保存后,选择你对应的芯片, OK后,一个空的环境搭好了! 下一步建立一个代码文件夹, 先说明我们要用的文件有哪些: 然后将上面的文件分配到建立的文件代码,分配方式为 CORE 文件夹: LIB文件夹: 最后在APP里建个main.c文件! 这样我们基本完成了代码的分配! 下面我们只需要将这代码加载到上面keil搭建的环境里就可以了! 打开刚才的环境,为了方便区分,和代码建立相同的文件结构,如图 下一步,我们通过加载文件,将代码文
[单片机]
【STM32F103攻城笔记】<font color='red'>STM32</font>之MDK(Keil)环境搭建(二)
stm32 boot启动经验
STM32三种启动模式对应的存储介质均是芯片内置的,它们是: 1)用户闪存 = 芯片内置的Flash。 2)SRAM = 芯片内置的RAM区,就是内存啦。 3)系统存储器 = 芯片内部一块特定的区域,芯片出厂时在这个区域预置了一段Bootloader,就是通常说的ISP程序。这个区 域的内容在芯片出厂后没有人能够修改或擦除,即它是一个ROM区。 在每个STM32的芯片上都有两个管脚BOOT0和BOOT1,这两个管脚在芯片复位时的电平状态决定了芯片复位后从哪个区域开始执 行程序 不同的下载方式对应STM32启动方式也不同,如下图是STM32三种启动方式: ● 第一种启动方式是最常用的用户FLASH启动,正常工作
[单片机]
<font color='red'>stm32</font> boot启动经验
关于STM32驱动点阵的问题整理及科研思维小酌
之前用51单片机成功将5块级联的16*16点阵成功驱动,闲来无事,沉积内功,用STM32驱动这几个点阵,本觉易事,没想到点阵豆豆竟三天耍脾气,不配合。一筹莫展之际,和别人聊微信,顺手掐断了豆豆的VCC,GND,惊呼哇塞,预期效果。真是无心插柳柳成荫。正预深入测试下去,停电,兴奋若狂,迫不及待,莫非上帝知道问题要揭晓了,急了,连断电的招都使。停电两小时,由缺VCC可正常显示,加VCC反而不亮,已推断出问题范围。入夏的夜,和豆豆玩到10点半,终把豆豆抱。 硬件配置:MCU :STM32,工作电压3.3V; 驱动芯片74HC595; 16*16点阵:五块 问题一:.点阵上电不亮,掉电正常显示 答:74hc595工作电压
[单片机]
stm32相关位操作
stm32 , ,l=与&=~操作 0x0000 0001 4//右移四位 =0x0000 1000 0x0000 1000 4//左移四位 =0x0000 0001 l=操作 0xxxx xxxx l= 0x0000 0001 =0xxxxx xxx1 //保留数据置1的位 &=~操作 0xxxxx xxxx &=~ 0x000 0001 =0xxxxx xxxx &=01111 1110 //先取反再相与 =0xxxxx xxx0 //使原来置1的位置0,也就是取反
[单片机]
基于STM32单片机的电子称设计
摘要 电子秤是将检测与转换技术、计算机技术、信息处理、数字技术等技术综合一体的现代新型称重仪器。它与我们日常生活紧密结合息息相关。 电子称主要以单片机作为中心控制单元,通过称重传感器进行模数转换单元,在配以键盘、显示电路及强大软件来组成。电子称不但计量准确、快速方便,更重要的自动称重、数字显示,对人们生活的影响越来越大,广受欢迎。 本系统的设计主要从硬件电路设计,软件编程调试,实物焊接调试三部分进行详细阐述。硬件电路主要是基于单片机为核心的控制单元实现数据的处理,采用压力传感器对数据进行采集,电子秤专用24位AD转换芯片HX711对传感器采集到的模拟量进行AD转换,转换后的数据送到单片机进行处理显示,数据显示由LCD160
[单片机]
基于<font color='red'>STM32</font>单片机的电子称设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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