完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
问题发现
问题原因 因为串口中断服务函数内为空语句: void USART1_IRQHandler(void) { } 这我就很郁闷了,这里面怎么能是空语句呢?少了串口收发的清除标志位呀! 问题解决 果断拿出以前学习时候的串口收发例程 当然是我火哥的,找到并添加对应Code: void USART1_IRQHandler(void) { /* 加入清除标志位,否则会卡死在串口中断服务函数中 */ uint8_t ucTemp; if(USART_GetITStatus(DEBUG_USARTx,USART_IT_RXNE)!=RESET) { ucTemp = USART_ReceiveData(DEBUG_USARTx); USART_SendData(DEBUG_USARTx,ucTemp); } } 问题暂时解决,在网上搜索了一些串口卡死的相关资料,隐隐感觉冥冥之中还有很大学问。 问题延伸 经过一番搜索之后,发现好像其实是受两个寄存器状态改变的影响: 打开 RXNEIE ,默认会同时打开 RXNE 和 ORE 中断; 必须第一时间清零 RXNE ,如果没有及时清零,下一帧数据过来时就会产生 Overrun error ; 错误就是 ORE 导致的; 解决办法要清除 ORE ; 所以最终的解决方案应该是: void USART1_IRQHandler(void) { /* 加入清除标志位,否则会卡死在串口中断服务函数中 */ uint8_t ucTemp; if(USART_GetITStatus(DEBUG_USARTx,USART_IT_RXNE)!=RESET) //检查 USART 是否发生中断 { USART_ClearITPendingBit(DEBUG_USARTx,USART_IT_RXNE); // 清中断标志 ucTemp=USART_ReceiveData(DEBUG_USARTx); } if(USART_GetFlagStatus(DEBUG_USARTx,USART_FLAG_ORE) == SET) // 检查 ORE 标志 { USART_ClearFlag(DEBUG_USARTx,USART_FLAG_ORE); USART_ReceiveData(DEBUG_USARTx); } } 所以,之前的程序中,中断服务函数里面啥也没有肯定是不行的,其次只检查 RXNE 是不行的,还需要检查 ORE 标志,需要将两者在中断服务函数中清除,才能正常进行 下一次 的数据发送和接收。 这个问题应该还需要延伸,下次遇到再进行补充。 |
|
|
|
只有小组成员才能发言,加入小组>>
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
424 浏览 1 评论
278 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
247 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
611 浏览 2 评论
634 浏览 2 评论
1363浏览 9评论
37浏览 3评论
STM32CUBEMX4.22.1在main函数里面添加一行语句就死机的原因?
47浏览 3评论
41浏览 3评论
KEIL MDK为什么无法debug library中的代码?
80浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-4-27 10:20 , Processed in 0.633103 second(s), Total 74, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号