STM32中断标志:先清理后清理的区别

2023-11-19

先上总结,再闲聊爬坑过程:

进入中断函数后,先清理中断标志,再执行其它动作


爬坑过程:

各种教程中,都只解释中断的机制、使用。但对于中断标志的清理顺序,没多少官方准确的资料。

今天在F429的代码里,又遇到问题:进中断后卡死跳不出来,各种排查没发现问题。

快要出门时,才突然想起来,要把清理中断的语句,从最后一行,移到第一行。重新编译烧录,马上通过。

真是奇怪的问题。

例1:后清理,卡死

测试环境:F429IG + TIM6的中断

void TIM6_DAC_IRQHandler()
{
    LED_BLUE_TOGGLE ;       // 反转LED
    TIM6->SR &= ~(0x01);    // 清理中断标志     
}

上面的两行示例代码,死活没法子看出有啥毛病,但程序卡死。几乎耗了一个上午排查周边代码。

修改成如下顺序,先清理中断标志,马上顺利通过。

void TIM6_DAC_IRQHandler()
{
    TIM6->SR &= ~(0x01);         // 重点,重点,重点,必须先清中断后处理其它事情,否则卡死
    LED_BLUE_TOGGLE ;            // 反转LED
}

为什么呢?百度了半晌,真没找到答案。

测试时发现,在F103中,TIM的中断也都必须是先清理中断标示,不然同样会发生卡死、没按预期中断、计时倍减等问题。

例2:先清理后清理,没事

问题:必须是先清中断标志吗?不是的。发现有很多中断函数不是必须先清理。

测试环境:F429IG + 外部中断线中断(项目中是做按键的)

void EXTI15_10_IRQHandler(void)
{
    // EXTI->PR |= KEY_2_PIN ;      // 位置 1
    LED_BLUE_TOGGLE ;    
    EXTI->PR |= KEY_2_PIN ;         // 位置 2              
}

同是F4的芯片, 在上面的代码中,位置1 的先清理,与位置2 的后清理,没区别,经测试都能正常工作的。


原因解释 (2023-07-13补充)

清除中断标志,如果放在中断服务函数的最后,硬件还没有把标志清除完毕,程序已经跳出了中断服务函数,这时候NVIC又会识别到中断标志,再次进入中断服务函数。


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

STM32中断标志:先清理后清理的区别 的相关文章

  • 如何更改闪存的起始地址?

    我正在使用 STM32F746ZG 和 FreeRTOS Flash的起始地址是0x08000000 但我想把它改成0x08040000 我通过谷歌搜索了这个问题 但没有找到解决方案 我更改了链接器脚本 如下所示 MEMORY RAM xr
  • 如何让printf在STM32F103上工作?

    我是 STM32F103 世界的新手 我有一个STM32F103的演示代码 我正在使用arm none eabi来编译它 我尝试了在谷歌上可以找到的内容 但到目前为止没有任何效果 我已经花了三天时间来解决这个问题 任何人都可以给我一个运行良
  • 当数据大小较小时,内存到内存 DMA 传输是否需要权衡?

    我正在学习 STM32 F4 微控制器 我正在尝试找出使用 DMA 的限制 根据我的理解和研究 我知道如果数据量较小 即设备使用DMA生成或消耗少量数据 则开销会增加 因为DMA传输需要DMA控制器执行操作 从而不必要地增加系统成本 我做了
  • 138-基于stm32单片机汽车多功能仪表盘显示系统Proteus仿真+源程序

    资料编号 138 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 ds1302时钟 LED灯 蜂鸣器 电位器 制作一个基于stm32单片机汽车多功能仪表盘显示系统Proteus仿真 2 通过DHT1
  • rt-thread studio中新建5.02版本报错

    先吐槽一下 rt thread studio出现BUG真多 好多时间都是在找BUG 但里面用好多控件还是挺好用的 真是又爱又恨 所以一般使用功能不多的话还是用keil多一点 创建5 02版本工程之后直接进行编译 直接会报下面这个错误 资源
  • HAL库学习

    CMSIS简介 CMSIS Cortex Microcontroller Software Interface Standard 微控制器软件接口标准 由ARM和其合作的芯片厂商 ST NXP 软件工具厂商 KEIL IAR 共同制定的标准
  • [屏驱相关]【SWM166-SPI-Y1.28C1测评】+ 有点惊艳的开箱

    耳闻华芯微特许久了 看到论坛得评测活动赶紧上了末班车 毕竟对有屏幕得板子也是很喜欢得 京东快递小哥客客气气 微笑着把快递给了我 好评 直接拆了包 在此之前没看过视频号 所以这个圆盘盘得模具还是有点惊喜的 正面照如下 开机有灯光秀 还有动画
  • 解决KEIL编译慢问题

    两种方案 使用v6版本的ARM Compiler 如果v6版本编译不过 必须使用v5版本的 则可以勾选掉Browse Information选项 提升很明显 1分多钟能优化到几秒 看代码量 但是这个有个弊端 在KEIL中会影响函数跳转 建议
  • VS Code 有没有办法导入 Makefile 项目?

    正如标题所说 我可以从现有的 Makefile 自动填充 c cpp properties json 吗 Edit 对于其他尝试导入 makefile 的人 我找到了一组脚本 它们完全可以实现我想要实现的目标 即通过 VS Code 管理
  • 在 Atollic TrueStudio、STM32CubeMX 中导入 C 库

    我目前正在开发 STM32F767ZI Nucleo 板和一个小安全芯片 microchip atecc508a 通过 i2c 连接进行连接 该芯片有一个可用的库加密验证库 https github com MicrochipTech cr
  • 串口通讯第一次发送数据多了一字节

    先初始化IO再初始化串口 导致第一次发送时 多出一个字节数据 优化方案 先初始化串口再初始化IO 即可正常通讯
  • 1.69寸SPI接口240*280TFT液晶显示模块使用中碰到的问题

    1 69寸SPI接口240 280TFT液晶显示模块使用中碰到的问题说明并记录一下 在网上买了1 69寸液晶显示模块 使用spi接口 分辨率240 280 给的参考程序是GPIO模拟的SPI接口 打算先移植到FreeRtos测试 再慢慢使用
  • STM32 暂停调试器时冻结外设

    当到达断点或用户暂停代码执行时 调试器可以停止 Cortex 中代码的执行 但是 当皮质停止在暂停状态下执行代码时 调试器是否会冻结其他外设 例如 DMA UART 和定时器 您只能保留时间 r 取决于外围设备 我在进入主函数时调用以下代码
  • 无法使用 OpenOCD 找到脚本文件

    我正在尝试按照本教程将 OpenOCD 与我的 ST 发现板一起使用 https japaric github io discovery README html https japaric github io discovery READM
  • Freertos低功耗管理

    空闲任务中的低功耗Tickless处理 在整个系统运行得过程中 其中大部分时间都是在执行空闲任务的 空闲任务之所以执行 因为在系统中的其他任务处于阻塞或者被挂起时才会执行 因此可以将空闲任务的执行时间转换成低功耗模式 在其他任务解除阻塞而准
  • 库函数点亮Led

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 例如 随着人工智能的不断发展 机器学习这门
  • Cortex-M3与M4权威指南

    处理器类型 所有的ARM Cortex M 处理器是32位的精简指令集处理器 它们有 32位寄存器 32位内部数据路径 32位总线接口 除了32位数据 Cortex M处理器也可以有效地处理器8位和16位数据以及支持许多涉及64位数据的操作
  • STM32内部时钟

    我对 STM32F7 设备 意法半导体的 Cortex M7 微控制器 上的时钟系统感到困惑 参考手册没有充分阐明这些时钟之间的差异 SYSCLK HCLK FCLK 参考手册中阅读章节 gt RCC 为 Cortex 系统定时器 SysT
  • STM32F0、ST-link v2、OpenOCD 0.9.0:打开失败

    我在用着发射台 http www ti com ww en launchpad about htmlgcc arm none eabi 4 9 2015q2 为 STM32F0 进行编译 现在我想使用该集合中的 arm none eabi
  • HAL_Delay() 陷入无限循环

    我被 HAL Delay 函数困住了 当我调用此函数 HAL Delay 时 控制陷入无限循环 在寻找问题的过程中 我发现了这个 http www openstm32 org forumthread2145 threadId2146 htt

随机推荐

  • JavaWeb —— AJAX

    目录 AJAX 基本介绍 A synchronous JavaScript And XML 多用在 1浏览器搜索联想 2用户注册中离开光标 校验数据的正确性 同步和异步的区别 AJAX快速入门 AJAX 基本介绍 A synchronous
  • Manjaro deepin 睡眠后无法唤醒

    最近尝试换了新的桌面 之前是xfce 使用deepin感觉很棒 也很好看 但是遇到下面一个问题 问题 因为我是双系统 因此经常会来回切win linux 但是发现换了deepin桌面后睡眠无法使用了 经常一睡就凉咯 无法唤醒 经过查找问题
  • Activity的四种启动模式和应用场景

    Activity的四种启动模式和应用场景 简介 通过设置ActivityManifestActivity launchMode可以设置Activity的启动模式 默认情况下 使用启动模式 standard 同时 launchMode可以通过
  • 算法编程6:连续子数组的最大和

    问题描述 输入一个整型数组 数组中的一个或连续多个整数组成一个子数组 求所有子数组的和的最大值 要求时间复杂度为O n 示例 输入 nums 2 1 3 4 1 2 1 5 4 输出 6 解释 连续子数组 4 1 2 1 的和最大 为 6
  • CentOS的Linux系统安装docker

    docker的官方网站教程 https docs docker com engine install centos prerequisites 参照官方教程 安装了 yum install y yum utils 搜索其他教程都安装了 yu
  • 字节流、字节流、转换流、打印流

    字节流 字节流 转换流 打印流 一 字符流 概述 字符流只能操作有文字的文件 纯文本文件 字符流的操作原理 字符输入流 先把字节从文件中读取出来 使用的字节流读的 根据文件的编码集把字节数变为对应的字符 把字符 读到内存中 解码的过程 字符
  • react组件状态同步-状态提升

    假设定义组件TemperatureInputSon import React from react class TemperatureInputSon extends React Component constructor props su
  • Linux安装部署Tomcat服务器

    Tomcat Tomcat 服务器是一个免费的开放源代码的Web 应用服务器 属于轻量级应用服务器 在中小型系统和并发访问用户不是很多的场合下被普遍使用 是开发和调试JSP 程序的首选 对于一个初学者来说 可以这样认为 当在一台机器上配置好
  • 【MATLAB第19期】基于贝叶斯Bayes算法优化CNN-LSTM长短期记忆网络的单列时间序列模型及多输入单输出回归预测模型

    基于贝叶斯Bayes算法优化CNN LSTM长短期记忆网络的单列时间序列模型及多输入单输出回归预测模型 前言 前面在 MATLAB第8期 讲解了基于贝叶斯Bayes算法优化LSTM长短期记忆网络的时间序列预测模型 即单输入数据时间序列预测
  • 从“玩枪”到“玩键盘”,退伍军人到程序员的华丽转型

    前言 我的生活平淡无奇 甚至可以说毫无希望 如果你了解我以前的生活 再看到我现在的境况 一定会惊讶 为什么一个人的变化会如此之大 叛逆 事情要从上学时候说起 我从小就是一个叛逆的孩子 贪玩 不爱学习 喜欢 舞枪弄棒 所以在学校的成绩一直都不
  • win10下安装vivado 2018.3之后ise14.7 的impact 无法使用

    软件版本号 操作系统win10 ise14 7 vivado 2018 3 ise14 7 在win10里面问题总结 1 ise14 7 闪退问题 比较好解决 论坛上比较多的解决方法 2 ise 14 7 windows 10 版本的ise
  • Extjs ToolBar动态更改图标

    使用setIconClass方法 Ext getCmp javaEye setIconClass javaEyeCss 其中 javaEye 是toolbar里的一个图标项 javaEyeCss 是css里定义的一个样式 形如 javaEy
  • PHP实现简易版区块链

  • 通过wireshark抓取telnet登陆密码

    笔者学校有一台设备 ip地址是 192 168 84 10 先打开wireshark捕获无线网卡 使用telnet登陆如图所示 按下回车 笔者这里输入的密码是 A603 现在回到wireshark停止抓包 并且在filter处输入如下的过滤
  • 将uboot,kernel,rootfs下载到开发板上

    1 为什么要下载 所谓下载 也称烧录 部署 1 1 什么是u boot Hi3518EV200 单板的 Bootloader 采用 U boot u boot是一种普遍用于嵌入式系统中的Bootloader Bootloader是在操作系统
  • input type=file 获取选择文件名称、路径方法及input上传按钮美化

    获取文件名 document getElementById upload files 0 name 获取文件路径 document getElementById upload value 页面效果 原生代码
  • Git使用教程总结

    第一篇 SVN VS GIT 转载 https blog csdn net daybreak1209 article details 78216798 svn 集中式 中央版本控制 n个版本 联网 局域网 同步 git 分布式 没有中央的概
  • Spring的多线程事务

    使用编程式事务手动管理多线程事务的生命周期 通过原子类 CountDown去控制多线程事务的全局提交或回滚 public class ThreadTransactionUtil 事务管理 private DataSourceTransact
  • CSS深入理解之line-height

    慕课学习 gt 前端开发 gt HTML CSS gt CSS深入理解之line height line height 一 line height的定义 行高line height 两行文字基线之间的距离 1 什么是基线 字符 x 下边缘
  • STM32中断标志:先清理后清理的区别

    先上总结 再闲聊爬坑过程 进入中断函数后 先清理中断标志 再执行其它动作 爬坑过程 各种教程中 都只解释中断的机制 使用 但对于中断标志的清理顺序 没多少官方准确的资料 今天在F429的代码里 又遇到问题 进中断后卡死跳不出来 各种排查没发