你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

触发外部中断后无法跳出到主函数

[复制链接]
夹鳄鱼 提问时间:2017-3-10 10:04 /
本帖最后由 夹鳄鱼 于 2017-3-13 23:21 编辑

    求助,把AVR的程序移植使用STM8时发现,触发外部中断后,程序跳到中断函数并运行,但运行完中断函数之后并没有回到主函数里面执行while 里面的程序。再次触发外部中断时,又会继续运行中断函数,但执行完中断函数后又不跳转到主函数。
    尝试了STM8S105k4和STM8S207C8都一样的结果,求指点一下。
   
下面是STM8S207C8的程序,把多余的删了,PG0是LED灯,PC7是触发外部中断的引脚。配置PC7为下降沿触发。开机后led开始慢慢闪,触发中断后,转换一下状态,但之后灯就停住不动了,不会慢闪。再次触发中断,又会翻转,但闪完后又不动了。

应该是跟中断里面的延时有关,把延时函数注释掉后,程序正常。但加入延时后,程序就不正常了。不太懂,特地来请教一下。
int main(void)
{
  master_clk();
  time4_delay_init();


  asm("sim");
  PG_DDR=0XFF;
  PG_CR1=0XFF;
  PG_CR2=0XFF;
  PG_ODR_ODR0=1;//

  PC_DDR_DDR7=0;
  PC_CR1_C17=1;
  PC_CR2_C27=1;
  EXTI_CR1 =2<<4;

  asm("rim");

  while(1)
  {
    delay_ms(100);
    PG_ODR_ODR0=!PG_ODR_ODR0;
  }  
}

#pragma vector=0x07
__interrupt void a()
{
    PG_ODR_ODR0=!PG_ODR_ODR0;
    delay_ms(10);
}

----------------------------------------------------------------------------------------
void time4_delay_init()
{
  TIM4_CR1=0x00;
  TIM4_IER=0x00;
  TIM4_EGR=0x01;
  //delay_ms
  TIM4_PSCR=0x07;//128分频,16M/128=0.125M->8us
  TIM4_ARR=0x7D;//8us*125
}

void delay_ms(u16 t)
{
  TIM4_CR1 |=0x01;
  while(t--)
  {
    while (!(TIM4_SR & 0x01));
    TIM4_SR &=0xfe;
  }
  TIM4_CR1 &=0xfe;
}



收藏 1 评论9 发布时间:2017-3-10 10:04

举报

9个回答
夹鳄鱼 回答时间:2017-3-14 20:20:51
自己顶一下········
天地摩登恒 回答时间:2017-3-14 21:43:20
你中断函数都还没有执行完,又重新来中断了啊
夹鳄鱼 回答时间:2017-3-15 15:25:29
天地摩登恒 发表于 2017-3-14 21:43
你中断函数都还没有执行完,又重新来中断了啊

你好,中断函数就只是很简单的语句,本来应该很快就执行完的,就十几个毫秒。
但是程序却一直没有执行完毕,不太懂······

你说的重新来中断,我是等了很久,都等不到才去重新触发中断。
zcl201207 回答时间:2017-3-15 23:43:51
中断完了没清标志位吧
夹鳄鱼 回答时间:2017-3-16 10:29:07
zcl201207 发表于 2017-3-15 23:43
中断完了没清标志位吧

这··········
一开始我也跟你这样想,结果手册上找了半天没找到标志位,网上一搜,STM8S系列根本没有外部中断的标志位,都是自动清的。

搞得现在超郁闷。
wenyangzeng 回答时间:2017-3-20 10:46:05
不该在中断里调用延时函数的。
じ☆ve沫上,蘤開。灬 回答时间:2017-7-17 09:06:20
请问楼主问题解决没有?  遇到类似问题
夹鳄鱼 回答时间:2017-7-17 22:43:42
じ☆ve沫上,蘤開。灬 发表于 2017-7-17 09:06
请问楼主问题解决没有?  遇到类似问题

没解决,当时直接换成按键扫描的方式。如果你解决了的话,烦请分享一下经验。
sssdd 回答时间:2017-7-24 09:57:05
可能啊,只是可能,10ms延时的时候别的啥中断被触发了。比如上下沿,或者是单纯低电平?或者别的定时器中断? 建议开调试模式,看停在哪个中断里。
也可能D口别的什么口不小心开了中断。然后10ms后跳出来后又进去了。你这库写法真的太深奥。。完全看不懂。
话说,每个10ms内你根本不响应别的中断,不合适吧?

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版