平台介绍: 芯片是使用的STM32G030F6,系统是rt-thread nano-v3.1.5, 使用rtthread studio + cubemx生成工程项目
问题描述:想使用串口中断方式去读取串口数据,用的是HAL库函数HAL_UART_Receive_IT去实现,现在发现只要向串口这边一发数据就出现死机,串口调用HAL_UART_Transmit往往另外的设备发送数据是正常的,但是如果调用HAL_UART_Transmit_IT往外发也回导致死机。在网上看了很多的串口案例,都是这么实现的,不清楚为啥我的平台会一触发串口中断就死机,希望有大侠可以帮忙解答!!
下面是用rtthread+cubemx创建的一个新项目,已经打开了UART1的全局中断,下面是main.c文件的代码,只做最简单的串口收发数据的动作,其中USART1_IRQHandler函数cubemx生成的代码文件已经添加,中断的使能也在生成的代码中进行了初始化。
竟然没有人回复,算了自己回复下😅。
用GDB调试,在死机的时候,点了暂停,发现系统原来不是死机,而是进入了无限循环。
在gdb的调试窗口可以看到b Infinite_loop信息,原来是因为没有写中断函数,导致触发中断后一直循环进入default_handler了。
具体原因和分析可以参考:https://blog.csdn.net/qq_51967985/article/details/134732951
感谢分享原因👍,
是哪个中断没写呢🙂
@xiaorui
是USART1_IRQHandler这个中断,这个其实是cubeMx工具自动生成的函数,在stm32g0xx_it.c里面,但是比较坑的是这个文件竟然没有添加进编译系统,所以导致中断触发后找不到处理函数,一直死循环调用默认的handler。解决方法就是自己把USART1_IRQHandler()这个中断函数从stm32g0xx_it.c文件里拷贝到其他文件里面去,保证有编译进系统。