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

2023-11-10

项目需求,需要实现设备低功耗功能,实现过程中遇到几个问题,以此记录总结。(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内核中的一个外设,内嵌在NVIC中。它是一个24bit的向下递减计数器,每计数一次的时间为1/SYSCLK。当重装载数值寄存器地见到0的时候,系统定时器就产生一次中断,依次循环反复。我的累计值是SystemCoreClock / 1000,所以中断就是1ms一次。

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

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

    【发现应该是系统时钟中断一直是开启的,所以在中断标志位清掉之后,每到1ms就又产生一次中断,标志位重新被置位,导致停止模式进入被忽略,程序继续进行,把这个定时器关掉就好//add 2019.5.9】

 

【回复评论为什么定时中断不是外部中断却能唤醒停止模式的问题//add 20200713】

 

以上信息来自《CM3权威指南》13.2节电源管理

(FCLK是自由运行时钟,因为不来自系统时钟HCLK,所以再系统停止时FCLK也能继续运行)

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

原因:

       退出停止模式后,其他时钟还是保持原来的配置(原来我的配置是以外部高速时钟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);

5.设备运行时开启的外设功能,视情况关闭,可以依次关闭看电流减小情况,并和数据手册做对比(要先关功能,再失能对应外设时钟,否则会关闭不成功,会有电流损耗,试验图1就是以为关闭了ADC,实际没关闭成功的情况,最后为板子总电流为74uA)

 

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进入Standby模式请参考:STM32进入Standby模式

 

以上为个人实验总结,不对之处还希望指正

原创文章,转载请注明出处:https://mp.csdn.net/postedit/85785336

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32进入STOP模式并唤醒实验总结 的相关文章

  • 使用RT-Thread studio(RT-Thread4.0.3)的PWM功能(STM32F103的PA15口)步骤

    打开PWM组件 修改board h的宏 这里注意移植的时候要将HAL TIM Base MspInit函数名改为HAL TIM PWM MspInit 修改board c xff0c 在文件最后增加以下内容 xff08 因为用的是PA15所
  • stm32f103 hal库中timer使用

    stm32f103 hal库中timer使用 使用步骤1 初始化定时器2 HAL TIM Base Init amp htim2 基本参数配置3 重写void HAL TIM Base MspInit TIM HandleTypeDef t
  • stm32f103介绍

    完整学习一遍stm32开发板开发 xff0c 并打算坚持一直写笔记 这是第一课 xff0c stm32的介绍 1 什么是STM32 从字面意义来看 xff1a ST xff1a 意法半导体 xff0c 是一个公司的名字 M xff1a Mi
  • 【stm32f103】认识GPIO

    认识GPIO 什么是GPIOGPIO基本结构保护二极管输出模式推挽输出开漏输出 输出数据寄存器 xff08 参考手册8 2 xff09 GPIOx ODRGPIOx BSRR 输入模式 GPIO工作模式输入模式 xff08 模拟 浮空 上拉
  • stm32f103核心板串口通信入门

    stm32f103核心板串口通信入门 一 基于寄存器与基于固件库编程方式的差异二 stm32串口通信1 前期准备硬件软件连接 2 编写程序并烧录设计程序烧录程序 三 总结 一 基于寄存器与基于固件库编程方式的差异 使用固件库 xff0c 目
  • 花两天时间写的stm32f103串口BootLoader(有keil工程)

    因为在论坛和官网都没搜到完全合适的BootLoader xff0c 所以自己移植完成了一个BootLoader工程 另外附APP文件工程 xff0c 可做实验 用良心保证 xff0c 看完后可以做一个成功的实验 上位机选用SecureCrt
  • STM32F103 KEIL 标准库直接添加DSP库

    前言 近期由于比赛需要 xff0c 想要在STM32上移植DSP库进行FFT变换 xff0c 找了很多资料都是利用CUBEMX进行导入的方法 xff0c 本人使用的是标准库 xff0c 对HAL库并不熟悉 xff0c 所以考虑到移植的方便采
  • STM32F103最小系统图例

    一 STM32F103最小系统 1 最小系统的构成2 连接图3 电源电路4 复位电路5 时钟电路6 程序下载电路7 启动配置电路 1 最小系统的构成 单片机芯片 供电电路 时钟电路 复位电路 程序下载电路 启动配置电路 2 连接图 3 电源
  • STM32f103时钟树详解

    一 概述 stm32有四种时钟信号源 xff0c HSE 高速外部时钟 HSI xff08 高速内部时钟 xff09 LSE xff08 低速外部时钟 xff09 LSI xff08 低速内部时钟 xff09 HSE通常接8M晶振 xff0
  • MPU9250的MPL移植_HAL库(以STM32F103为主控)

    准备材料 xff1a 驱动库 xff1a motion driver 6 12 硬件 xff1a 正点原子MINI STM32f103RCT6硬件IIC PB8 PB9 GY 91模块 看图可知AD0接地 xff0c 地址是0X68 硬件连
  • si4438使用stm32f103配置调试成功!

    刚拿到si4438时候在网上找了一大波资源 xff0c 发现能使用的并没有多少 xff0c 于是自己配置一发 经过不懈努力配置成功 xff0c 现在将一些配置过程分享给大家 xff01 源码已上传 尽情下载 xff01 1 首先打开工程文件
  • STM32F103 GPIO内部电路图

    GPIO结构图 GPIO工作模式 输入模式 输入浮空 输入上拉 输入下拉 模拟输入 输出模式 开漏输出 开漏复用功能 推挽式输出 推挽式复用功能 输入浮空 输入上拉 输入下拉 模拟输入 开漏输出 开漏复用功能 推挽式输出 推挽式复用功能
  • STM32 超声波模块测距

    目录 HC SR04模块 HC SR04超声波测距模块工作原理 HC SR04超声波模块的时序触发图 思路步骤 代码 实验结果 总结 HC SR04模块 HC SR04超声波测距模块工作原理 1 采用IO口TRIG触发测距 给至少10us的
  • STM32F103 UART4串口使用DMA接收不定长数据和DMA中断发送

    一 前言 使用DMA通信的好处是 不占用单片机资源 不像普通串口中断 发送一个字节触发一次中断 发送100个字节触发100次中断 接收一个字节触发一次中断 接收200个字节触发200次中断 数据接收完毕触发一次DMA中断 发送数据完毕触发一
  • 基于STM32F103 实现按键状态机

    文章目录 开发板 开发环境 前言 按键消抖 按键硬件原理图 软件延时实现思路 实验目的 代码 按键状态 按键信息 按键相关定义 按键底层配置及状态获取 总结 开发板 正点原子STM32F103ZET6战舰 开发环境 stm32cubeMX
  • 如何根据芯片手册时序图编写驱动程序

    如何根据芯片手册时序图编写驱动程序 对于电子开发者来说 刚刚拿到一个芯片 常用的芯片可以参考网上的例程来做深入了解 对于一个不常用的芯片来说 Datasheet几乎是使用芯片的唯一的资料 所以根据Datasheet时序图写出对应的驱动程序就
  • STM32配合火焰传感器的火灾报警

    实验材料 STM32F03 我这里用的是正点原子的战舰 火焰传感器 还有个蜂鸣器 我这个开发板自带 也是可外接的 火焰传感器介绍 工作原理 传感器模块在环境火焰光谱或者光源达不到设定阈值时 DO 口输出低电平 当外界环境火焰光谱或者光源超过
  • stm32f103 TIM2定时器4路PWM输出实验

    这里以TIM2为例 pwm c include pwm h uint16 t TIM2 CCR1 Val uint16 t TIM2 CCR2 Val uint16 t TIM2 CCR3 Val uint16 t TIM2 CCR4 Va
  • STM32F103移植FreeRTOS必须搞明白的系列知识---2(FreeRTOS任务优先级)

    STM32F103移植FreeRTOS必须搞明白的系列知识 1 Cortex CM3中断优先级 STM32F103移植FreeRTOS必须搞明白的系列知识 2 FreeRTOS任务优先级 STM32F103移植FreeRTOS必须搞明白的系
  • 解决keil中 点击setting 程序中断问题

    自己写了一个LED常亮的程序 入门嘛 但是程序在下载后 点击 debug setting 在软件识别J link后 程序是成功的 但是LED不亮了 下面是解决方法 记住把2标记处的对勾去掉就可以了 这个功能是 在你连接完成时自动在Reset

随机推荐

  • win10远程桌面连接ubuntu20(RDP)

    此方法是基于RDP Remote Display Protocol 协议 1 安装xrdp sudo apt get install xrdp 2 开启rdp服务 systemctl start xrdp 3 使rdp开机自启 system
  • IDEA 如何自动导入(import)

    如果大家正在使用一个未曾导入 import 过的类 或者它的静态方法或者静态字段 IDEA 会给出对应的建议 只要按下 option 和回车就可以接受建议 但我觉得这样做仍然很麻烦 不够智能化 怎么办呢 打开 IDEA 的首选项 找到 Ed
  • H2数据库-快速指南

    H2数据库 简介 H2是开源的轻量级Java数据库 它可以嵌入Java应用程序中或以客户端 服务器模式运行 H2数据库主要可以配置为作为内存数据库运行 这意味着数据将不会持久存储在磁盘上 由于具有嵌入式数据库 因此它不用于生产开发 而主要用
  • 成为Qt开发大牛,从入门到精通,一步一步走完整个学习路线!

    简介 本文为 C QT 学习路线大纲 资料 文章底部 Qt 可以做什么 Qt 虽然经常被当做一个 GUI 库 用来开发图形界面应用程序 但这并不是 Qt 的全部 Qt 除了可以绘制漂亮的界面 包括控件 布局 交互 还包含很多其它功能 比如多
  • 盘点一下不到100行的给力代码

    作者 景略集智 https jizhi im blog post short and excellent code 只需10行Python代码 我们就能实现计算机视觉中目标检测 from imageai Detection import O
  • qt 创建第二个ui_QT多个ui文件使用

    在使用QT做应用程序的时候几乎都会用到比较多的对话框 下面内容讲解下如何使用多个ui文件进行设计 注 下面使用的是Ubuntu16 04下的QT5 首先先建立一个工程 编译后结果如下 上面只有一个按钮 现在我们新建一个ui 然后点击该按钮来
  • 直方图-绘制子图subplot imshow

    显示好几幅图片在一个窗口内 逗号可以省略 其实imshow这个函数前两篇博客中已经开始使用了 与matlab中的使用很相似 下面介绍一下 若要显示灰度图片 参数为 cam plt cm gray 若要显示彩色图片 opencv 读入的图片默
  • Docker CE 学习笔记2 : Docker 安装后的步骤

    目录 1 以非 root 用户管理 Docker 2 配置Docker 在系统启动时运行 3 使用不同的存储引擎 4 配置Docker守护进程侦听连接的位置 4 1 配置远程访问使用systemd单元文件 参考 https docs doc
  • .net core 连接Mysql

    1 安装依赖包 在这里插入图片描述 https img blog csdnimg cn 16e74e954c414688b26af8b9d92fd793 png x oss process image watermark type d3F5
  • python -range()

    range 函数 range 101 可以用来产生0到100范围的整数 需要注意的是取不到101 range 1 101 可以用来产生1到100范围的整数 相当于前面是闭区间后面是开区间 range 1 101 2 可以用来产生1到100的
  • 时间卷积网络TCN:CNN也可以处理时序数据并且比LSTM更好

    本文回顾了 Shaojie Bai J Zico Kolter 和 Vladlen Koltun 撰写的论文 An Empirical Evaluation of Generic Convolutional and Recurrent Ne
  • top命令详解

    Top命令查看的内容 第一行是任务队列信息 06 29 43 当前时间 up 4 12系统运行时间 2 users当前登录用户数 load average 0 00 0 00 0 00系统负载 即任务队列的平均长度 第二行 为进程信息 Ta
  • linux部署tomcat项目详细教程(安装linux到部署tomcat)

    近来想要研究下linux 所以就搭了个linux系统来配置服务器玩玩 这里分了个目录 如果已经安装好虚拟机或者linux系统的小伙伴可以直接跳过前面的安装介绍 直接看部署 文章目录 一 总步骤说明 二 安装虚拟机 三 创建linux系统 四
  • DQL基础查询

    一 基础查询 1 语法 select 查询列表 from 表名 select后面跟的查询列表 可以有多个部分组成 中间用逗号隔开 例如 select 字段1 字段2 表达式 from 表 2 特点 查询的结果集是一个虚拟表 3 执行顺序 f
  • 循环神经网络RNN论文解读

    版权声明 本文为CSDN博主 了不起的赵队 的原创文章 遵循CC 4 0 by sa版权协议 转载请附上原文出处链接及本声明 原文链接 https blog csdn net zhaojc1995 article details 80572
  • Linux网络和安全:配置、远程访问与防御指南

    文章目录 Linux 网络和安全 引言 网络配置 IP地址配置 配置网络接口 防火墙设置 安全性加强 Linux网络配置及端口管理 网络配置命令 端口管理 防火墙和安全性设置 防火墙管理工具 安全性设置 Linux远程访问技术 SSH和VP
  • leetcode Path Sum

    Definition for a binary tree node struct TreeNode int val TreeNode left TreeNode right TreeNode int x val x left NULL ri
  • 基于B/S的网上零食销售系统的设计与实现(附:源码 论文 Sql文件)

    摘要 本文介绍了网上零食销售系统的整个开发过程 采用国内认准的B2C商城建站系统模式 并按照现有的购物系统的现状而设计开发的网络买卖平台 本文主要阐述的了整个系统的完成过程 模拟了一个具备卖家 买家和管理员的网络交易系统 而本平台对不同的用
  • 若依打包上线前后端配置

    1 后台访问打包设置 vue config js 文件中需要修改代理地址 devServer host 0 0 0 0 host 188 188 188 64 port port open true proxy detail https c
  • STM32进入STOP模式并唤醒实验总结

    项目需求 需要实现设备低功耗功能 实现过程中遇到几个问题 以此记录总结 stm32f103ret6 问题一 执行PWR EnterSTOPMode PWR Regulator LowPower PWR STOPEntry WFI 后 程序继