历史上的今天
返回首页

历史上的今天

今天是:2025年02月06日(星期四)

正在发生

2020年02月06日 | STM8S串口中断卡死调试记录

2020-02-06 来源:eefocus

项目使用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(); //打开全局中断

 

 }


测试后,问题依旧。


没办法,只能看看发生异常后,串口寄存器的状态,然后再定位异常。如下图所示。

在这里插入图片描述

OR_LHE置位,数据手册上如是介绍这位:

在这里插入图片描述

所以判断是过载错误没有清除导致中断异常,按照数据手册,每次中断来之前先读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);



}


烧录后,重新测试,发现快速率接收数据也不会出现卡死现象,系统运行正常,至此问题解决。


总结

在日常的开发过程中,我们往往注重的是如何完成特定的需求,没有考虑出现异常情况下的解决办法,如本例中所示,串口通讯时,为了接收实时性而选用中断接收,但是对于接收异常则没有考虑进去。同样的在其他外设的使用中也会犯类似的错误,所以解决途径是只有自己踩坑了,才知道填。将此分享出来是防止其他人踩同样的坑,亦或是正在踩坑的人早点跳出。

推荐阅读

史海拾趣

Alan Industries Inc公司的发展小趣事

随着产品技术的不断提升,Alan Industries Inc.开始积极拓展市场。公司制定了详细的市场营销策略,通过线上线下的多渠道推广,成功将产品打入国内外市场。同时,公司还注重品牌建设,通过优质的产品和服务赢得了消费者的信任和口碑。随着品牌知名度的提升,公司的市场份额不断扩大,成为电子行业中的佼佼者。

ESS [ESS Technology,Inc]公司的发展小趣事

ESS不仅在个人电脑音频领域取得了显著成就,还在HIFI领域实现了突破。ESS的HIFI传承可以追溯到其创始人对音频技术的深刻理解和对市场需求的敏锐把握。通过多年的技术积累和不断创新,ESS成功推出了多款高性能的HIFI音频芯片,如ES9018,这些产品凭借其卓越的性能和音质赢得了广泛好评。

泽耀科技(Ashining)公司的发展小趣事

在国内市场取得一定成绩后,泽耀科技(Ashining)开始积极拓展国际市场。公司参加了多个国际电子展会,与国际知名企业建立了合作关系,成功将产品打入国际市场。同时,泽耀科技还积极寻求与国际先进技术的交流与合作,不断提升自身的技术水平和产品质量。

Directed Energy Inc公司的发展小趣事

在电子行业中,创新是企业持续发展的关键。Directed Energy Inc始终将创新作为企业的核心竞争力之一,不断投入研发资源,推动技术创新和产品升级。公司拥有一支高素质的研发团队,他们紧跟行业发展趋势,不断探索新的技术和应用,为公司的发展注入了源源不断的动力。这种持续的创新精神使得Directed Energy Inc在电子行业中始终保持领先地位。

Giga公司的发展小趣事
用于设置提醒或自动执行某项任务。
AB Connectors Ltd公司的发展小趣事

随着公司实力的不断增强,AB Connectors Ltd开始将目光投向国际市场。公司积极参加国际电子展会和商务洽谈活动,与海外客户建立了广泛的合作关系。同时,公司还通过设立海外办事处和建立分销网络等方式,进一步拓展国际市场。这些举措不仅提高了公司的知名度和影响力,还为公司的快速发展提供了有力支持。

问答坊 | AI 解惑

常用元件选择表

常用元件选择表…

查看全部问答>

学技术从这里抓起

你知道有一个完美无缺的网站吗?不但网站首页点击连接不会弹出广告,而且还有很多精美的电子实验教程一整套,内容讲解十分细秘真实有涵养,有助于讯速提升技术。一切从零开始传授,加上丰富的 实验套件、电子电器。学习起来抻手一得,如鱼得水一样 ...…

查看全部问答>

128M的mini2440烧入u-boot不好用

买了一个128M的FLASH的mini2440,将光盘自带的u-boot.bin烧入后,在超级终端里看不到任何信息。。。。。。。。 急!请大家帮帮忙,谢谢了~…

查看全部问答>

(我是原创)矩阵式管理与设计时间

难得休息两天,回到工作,第一件事情是给媳妇帮忙翻译论文,而手头上的事情虽然充满着挑战,当总体还是应付的过来。由于很长一段的时间都是直接给国外做支持工作,对比国内项目的管理,让我生出了一种感受,同样的方法,同样的流程,到了我们这里一 ...…

查看全部问答>

ads下怎么申请内存空间??

如题:在ADS1.2下(处理器pxa270) 我想用malloc可以吗 如: void main() {     char strTitle[] = \"*************Pxa270Boot*************\";     char *pch = (char *)malloc(strlen(strTile));     memcp ...…

查看全部问答>

ATXmega128A1开发板如何连接到电脑

呃,问老师老师貌似也没用过…

查看全部问答>

msp430数据采集

关于msp430数据采集程序程序中,经过A/D转换后的数据无法经过232传送到PC,求前辈能否告诉我这个发送与接受的程序怎么写?谢谢啦!!!…

查看全部问答>

关于上位机发送数据给单片机改变当前1602的显示时间

大虾们!帮帮忙,我现在在学串口通信,我知道上位机发送一个字节的数据给单片机,然后让数码管显示发送的数据但是现在我想通过上位机发送一些数据给单片机,让1602显示的时间通过上位机发过来的数据进行改变, 该怎么发送呢 哪位大虾有这个程序没 ...…

查看全部问答>

stm32f107VCT6+DP83848调试问题--【已解决】

本帖最后由 yl20084784 于 2016-4-30 21:58 编辑 淘宝上买了块开发板,店家的程序上修改好了自己的程序,然后抄板 布局店家没给,自己估计着弄得,现在上网线后,灯不亮。 调试发现 程序卡死在   /* Reset ETHERNET on AHB Bus */ ...…

查看全部问答>

找资料的时候找到的:STM32F7-Discovery iconview理解与修改

在找资料时找到一个关于iconview自绘的资——网址如下,看得不是很懂。 http://www.dt-tech.net/Dteam/f7/iconviewEx/ …

查看全部问答>