完善资料让更多小伙伴认识你,还能领取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 标志,需要将两者在中断服务函数中清除,才能正常进行 下一次 的数据发送和接收。 这个问题应该还需要延伸,下次遇到再进行补充。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1771 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1619 浏览 1 评论
1070 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
724 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1673 浏览 2 评论
1935浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
728浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
568浏览 3评论
593浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
551浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 14:04 , Processed in 0.937548 second(s), Total 44, Slave 38 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号