当前位置: 首页 > news >正文

【STM32调试】寄存器调试不良问题记录持续版

蜂蜜

STM32寄存器调试不良问题记录

  • 低功耗管理
  • NVIC(内嵌的中断向量控制器)
  • EXTI(外部中断/事件)

记录一些stm32调试过程中:不易被理解、存在使用误区、不清不楚、是坑、使用常识等方面的一些记录。本记录只包含stm32的内核以及外设等寄存器的调试,不包含业务方面。

低功耗管理

  1. 使用低功耗功能前是否需要打开PWR时钟?

是需要先打开PWR时钟的,否则无法唤醒。

  1. 睡眠模式、停机模式和待机模式的区别?引用地址

这两个模式与睡眠模式相比,属于深度睡眠模式。

睡眠模式
在这里插入图片描述

停机模式
在这里插入图片描述

待机模式
在这里插入图片描述

NVIC(内嵌的中断向量控制器)

NVIC是什么东西?是内嵌的中断向量控制器?翻译的被不明不白,无法理解。说简单一点就是,来管理全部的中断的控制器,哪个中断来了,谁先来的,谁后来的,应该先运行哪个?能不能被抢占,还是按照顺序执行等。

  1. 如何理解中断、挂起?

国内单片机学习者一开始都是学习别人翻译过来的中文手册,我也不例外。但是翻译过来的有些就十分的晦涩难懂,更甚者还会有错误出现(例如,EXTI的中断\事件控制框图)。所以建议去看看英文手册,即使借助翻译软件慢慢看也没有关系。
对于理解中断、挂起,十分有帮助的地方是M3权威指南手册的124页,看完如果没有帮助你来找我。

  1. NVIC中的Pending(中断挂起)位会自动清除吗?

当触发了某个中断,并进入了该中断服务函数的话,该位是会被硬件自动清除的。
但是触发这个中断的外设中的中断标志位的话,并不一定会自动清除,需要查看手册,看是否需要自己手动清除。

EXTI(外部中断/事件)

  1. 将PortA0连接到EXTI0,触发外部中断,总是进入两次中断服务函数,并且没有外部干扰存在。
void EXTI0_IRQHandler(void)
{// 中断执行的业务代码...ExtiClearIntStatus(0u); //清除LINE0上的中断标志位 
}

解释:
① 该现象十分有规律,可以考虑是因为没有清除掉EXTI的挂起寄存器,导致该中断一直被挂起,即使退出了中断服务函数,还是会一直进入该中断。
② 但是,每次只进入两次,上述还是解释不通,并且代码中已经将挂起寄存器中的中断标志清除掉了。
③ 最终原因是因为,清除中断标志的函数写在了最后一句,导致中断服务函数返回后,硬件上仍旧没有来得及将挂起寄存器的标志位清零(硬件执行是有延迟的)。所以导致又一次进入了中断服务函数。并且在仿真调试中,我也发现,第一次进入中断服务函数时,EXTI的PR挂起寄存器中的中断标志位为置位状态,第二次进入中断服务函数时,发现该位已经被清除。
④ 所以,最要是一进入中断服务函数,就将挂起的标志位清除掉,再执行业务逻辑代码,给硬件一定的执行事件。

相关文章:

  • etcd安装
  • Idea 开发环境不断切换git代码分支导致冲掉别人代码
  • 运用分布式锁 redisson
  • 第十五章 : Spring Cloud全链路监控(Pinpoint实战)
  • Docker(二)安装指南:主要介绍在 Linux 、Windows 10 和 macOS 上的安装
  • 准备的一些爬虫面试题
  • 《WebKit 技术内幕》学习之七(2): 渲染基础
  • IPv6自动隧道---6to4中继
  • 【隧道篇 / SSL】(7.4) ❀ 01. 只允许国内IP通过SSL VPN访问内网 ❀ FortiGate 防火墙
  • 开发者广告变现对接广告平台,广告瀑布流是什么?
  • GAMES104-现代游戏引擎:从入门到实践 - 物理引擎课程笔记汇总
  • ISA Server 2006部署网站对比nginx
  • k8s和knative的区别与联系
  • 【JavaEE进阶】 Spring Boot⽇志
  • VUE3+elementPlus之 子组件直接修改父组件的值(父子组件props双向绑定)
  • IDEA常用插件整理
  • JavaScript DOM 10 - 滚动
  • java概述
  • October CMS - 快速入门 9 Images And Galleries
  • web标准化(下)
  • 创建一种深思熟虑的文化
  • 搭建gitbook 和 访问权限认证
  • 前端临床手札——文件上传
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 如何用vue打造一个移动端音乐播放器
  • 十年未变!安全,谁之责?(下)
  • 什么软件可以提取视频中的音频制作成手机铃声
  • k8s使用glusterfs实现动态持久化存储
  • 阿里云移动端播放器高级功能介绍
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • 如何用纯 CSS 创作一个货车 loader
  • # centos7下FFmpeg环境部署记录
  • #laravel 通过手动安装依赖PHPExcel#
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (动态规划)5. 最长回文子串 java解决
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (十三)Flask之特殊装饰器详解
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)Oracle存储过程编写经验和优化措施
  • (转载)OpenStack Hacker养成指南
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .NET设计模式(2):单件模式(Singleton Pattern)
  • .net中应用SQL缓存(实例使用)
  • /var/spool/postfix/maildrop 下有大量文件
  • ??myeclipse+tomcat
  • @Bean注解详解
  • @RestController注解的使用
  • @Validated和@Valid校验参数区别
  • []error LNK2001: unresolved external symbol _m
  • [20140403]查询是否产生日志