发新帖我要提问
12
返回列表
打印
[STM8]

一个关于STM8中断应用异常的话题

[复制链接]
楼主: 米多0036
手机看帖
扫描二维码
随时随地手机跟帖
21
米多0036|  楼主 | 2021-12-31 16:53 | 只看该作者 |只看大图 回帖奖励 |倒序浏览

使用特权

评论回复
22
米多0036|  楼主 | 2021-12-31 16:54 | 只看该作者
当某中断程序正在执行时外部又产生了新的中断请求的处理规则:

如果新的中断请求的软件中断优先级高于正在执行的中断程服务序的中断优先级时,当前中断程序将被打断,保护好当前现场后转而去执行新的高优先级中断程序。即发生中断程序嵌套。因为软件中断优先级最高为3,不难理解当正在执行的中断程序的优先级为L3时是不可能再被RESET,TRAP,TLI以外的中断事件打断的,即呈现软件中断关闭状态。

使用特权

评论回复
23
米多0036|  楼主 | 2021-12-31 16:55 | 只看该作者
另外,如果在中断服务程序里使用HALT,POPCC,RIM,SIM和WFI都可能会改变当前中断服务程序的中断优先级。

当在某ISR执行过程中调整L1、L0的值修改软件中断优先级,同时该中断请求标志没来及清除或新的中断请求已经产生,如果修改L1\L0后的新中断请求之软件中断优先级高于当前中断服务程序的优先级,这时就会发生中断重入,即该中断会被重新响应,重新运行该中断服务程序。上面工程师遇到的异常现象就是这种情形。

使用特权

评论回复
24
米多0036|  楼主 | 2021-12-31 16:57 | 只看该作者
最后,以TIM1溢出更新中断服务程序为例,结合具体的测试代码一起验证下。此处把TIM1的溢出周期设置为2MS,TIM1中断执行时间大概16ms【当然是指不被中断的情况】,这样设计的目的是为了保证在中断服务程序执行过程中有新的TIM1溢出中断请求发生。中断程序要做的事情很简单,就是将某个IO口的电平先高后底各近8MS然后退出。【除了TIM1外,测试程序也没有别的其它中断使能。】

使用特权

评论回复
25
米多0036|  楼主 | 2021-12-31 16:58 | 只看该作者
不妨看看下面两种不同情形,TIM1溢出中断服务程序的运行结果。


一、ISR里面不添加SIM/RIM指令时的情形。

__interrupt void TIM1_UPD_OVF_TRG_BRK_IRQHandler( void )

{

TIM1_ClearFlag(TIM1_FLAG_UPDATE);//清除TIM1更新标志

GPIO_WriteHigh(GPIOC,GPIO_PIN_6 ); // PC6 HIGH

// disableInterrupts();

Delay(21000); //延时约 7.8ms

GPIO_WriteLow(GPIOC,PGPIO_PIN_6 _); // PC6 LOW

// enableInterrupts();

Delay(21000); //延时约 7.8ms

}

使用特权

评论回复
26
米多0036|  楼主 | 2021-12-31 16:59 | 只看该作者
这种情况下,整个中断服务程序运行过程中程序优先级没有变化。运行过程中不存在被中断的情况。Pc6输出波形如下图一。

输出波形图一【PC6 输出信号】

使用特权

评论回复
27
米多0036|  楼主 | 2021-12-31 17:10 | 只看该作者
二、ISR里面添加SIM和RIM或者只放RIM指令时的情形。

__interrupt void TIM1_UPD_OVF_TRG_BRK_IRQHandler( void )

{

TIM1_ClearFlag(TIM1_FLAG_UPDATE);//清除TIM1更新标志

GPIO_WriteHigh(GPIOC,GPIO_PIN_6 ); // PC6 HIGH

// disableInterrupts();

Delay(21000); //延时约 7.8ms

GPIO_WriteLow(GPIOC,GPIO_PIN_6 ); // PC6 LOW

enableInterrupts();

Delay(21000); //延时约 7.8ms

}

使用特权

评论回复
28
米多0036|  楼主 | 2021-12-31 17:10 | 只看该作者
此时pc6波形输出混乱无章,如下图2。TIM1中断程序不停的嵌套重入,导致堆栈溢出,PC跑飞。显然跟上面的图1相差悬殊。另外,通过示波器观察芯片复位脚也可看到绵延不断的复位脉冲如下图3。

输出波形图二【PC6 输出信号】

使用特权

评论回复
29
米多0036|  楼主 | 2021-12-31 17:12 | 只看该作者
从上面图二不难看出是因为中断不断自我重入,而进中断是先将PC6置高,所以大量的高电平呈现。




输出波形图三【复位脚信号】

使用特权

评论回复
30
米多0036|  楼主 | 2021-12-31 17:12 | 只看该作者
最后的最后,估计很多工程师在编写STM8中断程序时,像上面的工程师那样写代码。有时因此而出现些莫名其妙的异常会让人很难找到错误的原因。

使用特权

评论回复
31
香水城| | 2021-12-31 19:40 | 只看该作者
本帖最后由 香水城 于 2021-12-31 19:46 编辑

** 比较长,转载辛苦了!

原文链接:一个关于STM8中断应用异常的话题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则