__问题——进入启动文件_卡死在Default_Handler_死机

ops/2024/10/21 20:49:33/

MCU:STM32F407VET6

       先说结论,调试时跳转到启动文件里的死循环,只要不是硬件错误中断,那么多半是因为中断处理函数没有定义导致的。

【历程】

       今天在测试最小单片机系统时,定义了一个按键处理,依赖的是外部中断线0。配置好外部中断回调后,能正常初始化运行。但只要按下按键就会进入看门狗中断,然后死循环。可问题是我没有设置看门狗,这是怎么一回事?

        全局搜索看门狗中断,进入map文件可以看到,这个看门狗中断和其他中断一样,并没有定义。也就是说调试窗口显示进入看门狗中断可能只是和其他重名了,毕竟指向的都是同一个地址

去搜索HAL外部中断,发现也没定义?!那么我定义的中断回调岂不是无根之萍?

那么只好直接搜索到最底层——中断向量表,可以看到没有定义!

         这时才发觉我工程中并非是由STM32CubeMX直接生成的,那么直接把CubeMX生成的外部中断初始化代码复制到代码里是会出问题的(实际上是复制少了)。 既然如此,那么便定义一个外部中断。这里没有使用外部中断回调,因为它只是一只最小单片机系统,不需要太多功能。如下图所示,按下按键后顺利进入测试的程序了万幸的是,没有该死的按键抖动

【总结】

         进入硬件错误中断,那肯定是发生了硬件错误。但进入Default中断十有八九是没有定义中断处理导致的,因为启动文件里的中断向量表默认指向Default_Handler

        如果你使用的是HAL,那么当发生了这种问题后,可以用CubeMX生成初始化代码,重新配置。或者根据CubeMX生成的代码,来观察哪些宏要取消注释,哪些函数要调用。或者不管什么中断回调,硬上中断向量。

        硬上中断向量时要注意,如果你的工程含有C++,那么定义这个中断向量时,一定要用extern "C"包起来,不然会被C++编译器链接成别的符号导致找不到这个函数。中断回调则不需要

        如果是使用CubeMX生成含中断的初始化代码,那么搬移代码时,需要把stm32f4xx_it.c中定义的中断处理例程也要迁移过来。下图中CubeMX工程名为CubeTest,以ADC中断为例,把这句复制到工程里即可。需要注意的是这个是C函数而非C++函数,否则识别不到

【示例工程】

ichliebedich-DaCapo/STM32F407VET6: stm32f407vet6


http://www.ppmy.cn/ops/127371.html

相关文章

QT QML 练习6-QML语法(QML Syntax)

QML语法(QML Syntax) QML是一种描述用户界面的声明式语言。它将用户界面分解成一些更小的元素,这些元素能够结合成一个组件。QML语言描述了用户界面元素的形状和行为。用户界面能够使用JavaScript来提供修饰,或者增加更加复杂的逻…

git的下载安装完整教程

一、下载 官网下载地址:Git - Downloads (git-scm.com) 二、安装 1.双击 2.按照安装向导next

6.计算机网络_UDP

UDP的主要特点: 无连接,发送数据之前不需要建立连接。不保证可靠交付。面向报文。应用层给UDP报文后,UDP并不会抽象为一个一个的字节,而是整个报文一起发送。没有拥塞控制。网络拥堵时,发送端并不会降低发送速率。可以…

自监督行为识别-时空线索解耦(论文复现)

自监督行为识别-时空线索解耦(论文复现) 本文所涉及所有资源均在传知代码平台可获取 文章目录 自监督行为识别-时空线索解耦(论文复现)引言论文概述核心创新点双向解耦编码器跨域对比损失的构建结构化数据增强项目部署准备工作数据准备生成数据训练&测试训练测试bug修改…

Vue.js 组件化开发:从入门到进阶

Vue.js 组件化开发:从入门到进阶 👋 大家好,今天我们来聊一聊 Vue.js 的 “组件化开发”。目前 Vue 开发已经相对成熟了,相信很多朋友对组件化开发并不陌生。 如果你对组件化开发已经非常熟悉,看到我的文章&#xff…

【VUE】v-show 和 v-if 的区别

v-show 始终会保留对应的 HTML 元素,只是在隐藏时通过 CSS 样式控制元素不可见;而 v-if 会根据表达式的值条件地渲染或销毁对应的 HTML 元素。v-show 是基于 CSS 的切换,切换速度相对较快,但对页面的渲染效率影响较大;…

C++ 基于自主实现的红黑树封装Map和Set (上)

C 红黑树-CSDN博客 目录 1.观察代码 2. 修改代码 使用仿函数解决比较的问题 3.迭代器接口封装 4. 总结 1.观察代码 在实现了红黑树之后&#xff0c;我们将红黑树封装进Map和Set中。Map和Set最大的区别就是&#xff1a;前者使用的是pair<k,v> &#xff0c;后者只有一…

OpenCV高级图形用户界面(12)用于更改指定窗口的大小函数resizeWindow()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::resizeWindow() 函数用于更改指定窗口的大小。这使得你可以根据需要调整窗口的宽度和高度。 注释 指定的窗口大小是指图像区域的大小。工具栏…