关于 STM32 在使用 C++ 进行编程时无法进行中断(触发中断就死循环)的问题

这篇具有很好参考价值的文章主要介绍了关于 STM32 在使用 C++ 进行编程时无法进行中断(触发中断就死循环)的问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

他妈的!!!就因为这破事导致我浪费了两天的时间!!!

都是基础不扎实的锅,导致我没能第一时间想到问题的关键

好了,平复一下心情,快速的写一篇博客来记录这个叼问题

解决方法

先把结论放在这里:用extern "C" {}把中断函数包起来

// 就像这样
extern "C" {
void EXTI4_IRQHandler() {
    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);
    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_4);
}
}

问题解决,现在来讲述一下过程

开端

本来我是想写一个 RS485 通信模块的,但是写好之后发现发送正常,但是接收的时候没有反应

在主程序加上 LED 闪烁以后,我发现每次发送数据,单片机都是直接卡死

然后我想了个招,使用调试器在程序运行的时候进行暂停,发现它卡在了Default_Handler之中,而这是个死循环

考虑到 .s 文件中,如果找不到同名函数,就直接进入Default_Handler

好了,现在程序卡死的原因找到了,可又是什么导致了这个现象呢?我陷入了迷惘

折磨

找不到同名函数就卡死?我看了看我写在 main 文件里面的函数,确定了不是名字打错了

也不是函数名的问题,事情逐渐变得棘手

我抱着侥幸心态在 .h 文件加上了中断函数的定义,毫无疑问没有任何用

由于我用的 platformio + Clion 来编写的程序,我想着或许是编译器的问题。因为这在我用 Keil 的时候是没有发生过的

或许是 sdcc 的bug?但是不管怎么搜都搜不到相关的资料

事情到此进入了僵局

解决

我不死心,去运行了正点原子的示例,不出我所料,它非常正常的运行了

于是我灵光一现,将所有相关文件扔到了 CLion 里面,改好了 include 的路径,一运行,嗨,成了!

直接给我震惊到了,这说明肯定是我的代码哪里有问题!

但是我对自己的代码质量还是有点信心的,我左看看,右看看,一眼瞧到了复制来文件上面大大的 .c 后缀名!

我感觉自己把握到了关键点,直接就把所有的 .c 全改成了 .cpp

再一试,坏了,好了!问题找到了!

我直接打开我的项目工程,啪啪啪把extern "C"敲了上去,果然好了!

我直接仰天长啸:我!好!菜!啊!

原因分析

其实这个问题说透了也很简单,就是因为 C++ 和 C 语言编译结果不同导致的

因为 C++ 是允许同名函数的,也就是通过不同的参数进行重载,这就会导致函数名称和编译后的不相同

比如EXTI4_IRQHandler()这个函数,放在 C++ 里面编译后指不定就变成了EXTI4_IRQHandler_void

这跟 .s 文件里面预先声明的函数不能说一点不相干,只能说完全不一样

加上extern "C"以后,编译器就会按照 C 语言的标准编译,就可以正确的被中断调用到了文章来源地址https://www.toymoban.com/news/detail-656090.html

到了这里,关于关于 STM32 在使用 C++ 进行编程时无法进行中断(触发中断就死循环)的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用 Simulink 进行 STM32 编程

    介绍 所需材料 步骤 1:在MATLAB中设置STM32-MAT软件路径 步骤 2:在STM32CubeMX中创建一个项目 步骤 3:配置时钟和 GPIO 引脚 步骤 4:项目经理并生成代码 步骤 5:在 Simulink 中创建模型 步骤 6:在模型中插入 STM32_Config 模块 步骤 7:创建模型 步骤 8:编译并生成代码 步骤 9:将代码

    2024年02月14日
    浏览(23)
  • STM32 TIMER_TRGO触发+ADC采集 + DMA传输 + 中断均方根处理 实现三相电压显示

    STM32 TIMER_TRGO触发+ADC采集 + DMA传输 实现三相电压采集 首先,是实际采集的三相电压值,用excel处理了下: 采集个电压,为什么这么复杂。 开始我也是直接用ADC采集,然后delay,再采集,然后delay,再采集……最后数据处理…… 问题是如果我们用单片机裸跑,每次delay都会卡死

    2024年02月16日
    浏览(31)
  • STM32无法正常进入外部中断的问题

           本人在使用外部中断读取键值的时候遇见了无法进入外部中断的问题,我的问题是这样的:一开始想用STM32F103C8T6的PB12和PB14读取两个按键的状态,并且是使用外部中断读取,但是总是遇到一个按键的状态可以读取(即按键按下,GPIO口的电平发生跳变,然后进入对应

    2024年02月11日
    浏览(28)
  • 关于STM32使用HAL_UART_Receive()无法接收数据的问题

    一、问题发现         在项目中我想通过阻塞的方式接收一段来自串口的数据,于是使用了HAL_UART_Receive函数,但跑起来发现一直超时接收不到。网上使劲搜但没搜到啥有用的结果,那只能自己捣鼓了。一开始怀疑是硬件的问题,于是用示波器直接连到对应的rx脚上,发现数据

    2024年02月11日
    浏览(39)
  • stm32_断点调试无法进入串口接收中断

    先说结果,可能是stm32调试功能/keil软件/调试器(试过STLINK和JLINK两种)的问题,不是代码; 配置完串口后,可以发送数据到串口助手,但不能接收数据并做处理,所以第一步,想确定有没有接收到单个字节进入中断。 开始打断点调试,发现串口数据寄存器DR能收到数据,串

    2024年02月08日
    浏览(34)
  • 解决STM32在延时时无法进入中断的问题

    问题: 在使用zigbee模块时,使用串口作为无线收发的载体,与stm32通信,使用DHT11作为简单的受控源,出现了bug: 当在while(1)里使用delay函数,或者使用DHT11_Read_Data函数时,程序无法进入串口接收中断,无法使用远程控制 其中的while函数为: 解决思路: 检查接线之后,我首

    2024年02月12日
    浏览(28)
  • GD32(STM32)因为中断问题,导致不能进行程序 正常运行

    项目中,之前定时器中断就用了个TIM2,但后来程序优化需要再加一个计数定时器TIM6,     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;                      // 开启定时器时钟,即内部时钟CK_INT=72M     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);             // 自动重装载寄存器

    2024年02月07日
    浏览(27)
  • 【STM32 CubeMX】串口编程DMA+IDLE中断

    在嵌入式系统中,串口通信是一项关键的任务,而使用DMA(直接内存访问)结合IDLE中断进行串口编程,尤其是在STM32 CubeMX环境中,能够提高系统的效率和性能。STM32 CubeMX为STM32微控制器提供了图形化的配置工具,可以简化初始化代码的生成过程,使得串口编程变得更加容易。

    2024年02月20日
    浏览(46)
  • STM32 HAL库 CAN双机通信接收无法进入中断、中断没有反应的解决方法

    在调试HAL库下的CAN双机(双F103ZET6)通信时,阻塞轮询接收完全正常,但是中断接收没有反应。翻看了GL的烧脑之路总结(一):Cubemx创建CAN通信工程,无法进入CAN中断的原因这篇文章以后,核实自己的硬件电路没有问题,于是对自己的工程文件进行整理,把 ①HAL_CAN_ConfigFi

    2024年02月04日
    浏览(47)
  • STM32 hal库编程定时器清除中断标志位,开启定时器中断会立即进入中断的问题

    1、如果不清除中断标志位,开启定时器中断的话,不能完成相应的计时,会立即进入中断。 2、如果在开启定时器中断前清除了中断标志位,就会等待计时完成再出发中断。 3、主要是针对单次计时使用,尤其是对第一次计时有要求的程序。

    2024年02月01日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包