数码之家

 找回密码
 立即注册
搜索
查看: 1720|回复: 28

请教各位老师,STM8中断执行后不能返回

[复制链接]
发表于 2023-2-6 12:35:02 来自手机浏览器 | 显示全部楼层
我没写过STM8点程序,根据一般单片机程序提几点:
1.不知道有没有使能看门狗,好像没看到清看门狗的程序;
2.不知道中断请求标志是否需要手动清除,如果硬件不自动清中断请求标志而又没有手动清,会导致程序频繁反复进入中断服务程序。在中断中调用和主循环一样的delay()函数是有风险的,除非改函数可重入,虽然多数人都不主张在中断中断中调用延时程序,但是,如果你一定要那么做,建议把延时程序复制一份另起一个函数名,如isr_delay(),专供中断服务程序调用(如果有多个不同优先级中断服务程序需要延时,也不要调用相同的函数)。
3.就实际应用而言,简单的延时读按键没有多次确认可靠。
回复 支持 反对

使用道具 举报

发表于 2023-2-6 17:41:05 | 显示全部楼层
本帖最后由 mmxx2015 于 2023-2-6 17:42 编辑
阿甲 发表于 2023-2-6 17:07
今天试过了,即使把中断输出放在其他端口,也是一样的,同时发现一个问题,中断按键短按一下可能成功返回, ...
不是端口的问题,从你描述的现象看,好像是频繁进入中断了。

函数重入问题:非重入函数在主循环和中断中同时调用会导致局部变量冲突。

可以增加一个函数
  1. void isr_delay(u16 Count)
  2. {
  3.   u8 i,j;
  4.   while (Count--)//Count形参控制延时次数
  5.   
  6.     {for(i=0;i<50;i++)
  7.       for(j=0;j<20;j++);}
  8.   
  9.   }
复制代码
中断中用这个函数延时
  1. # pragma vector=0x05
  2. __interrupt void EXTI_PORTA_IRQHandler(void)

  3. {
  4.    OUT=0X00;
  5.    isr_delay(1000);
  6.    
  7. }
复制代码

不在中断中延时也不难:在中断中关闭中断,设置一个标志,主循环判断这个标志为1则多次读取这个引脚状态确认按键,处理完再次打开中断即可。如果你的应用不需要休眠,根本不需要打开中断。

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-20 23:55 , Processed in 0.078000 second(s), 8 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表