完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
项目使用STM8S003单片机,数据发送速率比较慢时,一切正常。当速率快的时候,系统卡死,具体表现为一直运行中断服务程序,无法执行while(1)里面的内容了。
调试记录 开始怀疑是一直在响应某个中断,断点调试后发现是一直在响应UART1接收中断。调试步骤如下: 怀疑是串口中断里做了数据解析工作,导致在解析途中又收到了第二个串口接收中断,然后发生异常。解决办法是在串口接收中断中关闭串口接收中断,数据解析完成后再打开串口接收中断,防止在本次数据解析时发生下一次接收中断。具体代码表现如下: /** * @brief UART1 RX Interrupt routine * @param None * @retval None */ INTERRUPT_HANDLER(UART1_RX_IRQHandler, 18) { /* In order to detect unexpected events during development, it is recommended to set a breakpoint on the following instruction. */ uint8_t temp; temp = UART1_ReceiveData8(); UART1_ITConfig(UART1_IT_RXNE_OR, ENABLE); //关闭串口中断 gh_protocol_parse(temp, &gh_parse); //解析数据 UART1_ClearITPendingBit(UART1_IT_RXNE); UART1_ITConfig(UART1_IT_RXNE_OR, DISABLE); //打开串口中断 } 测试后发现问题依旧,所以又考虑是不是还有其他中断干扰(工程中还开启了两个定时器中断,中断频率比较高),索性关闭全局中断试试,如下: /** * @brief UART1 RX Interrupt routine * @param None * @retval None */ INTERRUPT_HANDLER(UART1_RX_IRQHandler, 18) { /* In order to detect unexpected events during development, it is recommended to set a breakpoint on the following instruction. */ uint8_t temp; temp = UART1_ReceiveData8(); disableInterrupts(); //关闭全局中断 gh_protocol_parse(temp, &gh_parse); //解析数据 UART1_ClearITPendingBit(UART1_IT_RXNE); enableInterrupts(); //打开全局中断 } 测试后,问题依旧。 没办法,只能看看发生异常后,串口寄存器的状态,然后再定位异常。如下图所示。 手册} 问题依旧。 该判断错误之前出现改改异常,按照数据手册,没有先读SR,然后再读DR,不管有没有来清错误,都给改掉, /** * @brief UART1 RX Interrupt routine * @param None * @retval None */ INTERRUPT_HANDLER(UART1_RX_IRQHandler, 18) { /* In order to detect unexpected events during development, it is recommended to set a breakpoint on the following instruction. */ uint8_t temp; temp = UART1->SR; temp = UART1_ReceiveData8(); gh_protocol_parse(temp, &gh_parse); UART1_ClearITPendingBit(UART1_IT_RXNE); } UART1_ClearITPendingBit (UART1_IT_RXNE);} 烧不会出现后,重新测试,发现快速接收数据的卡死现象,系统运行正常,至此问题解决。总结一下 日常的开发过程中,我们就是如何完成特定的开发过程的需求,则没有考虑出现异常情况下的解决方案,如本例中显示的异常情况,如通信方式,为了接收实时而中断接收,接收异常时考虑考虑。中也犯了类似的错误,解决的办法是自己坑了,才填完只知道自己的分享出来,是为了阻止其他人同样踩到的坑,亦有点正在阻止其他人早早跳出来。 |
|
|
|
只有小组成员才能发言,加入小组>>
3262 浏览 9 评论
2942 浏览 16 评论
3442 浏览 1 评论
8949 浏览 16 评论
4035 浏览 18 评论
1078浏览 3评论
558浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
551浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2286浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1846浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-8 00:31 , Processed in 0.953012 second(s), Total 49, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号