[应用相关] STM8 中断服务函数里面调用子函数 会重启

[复制链接]
 楼主| Levenburg 发表于 2017-4-13 20:15 | 显示全部楼层 |阅读模式
中断里面调用子函数,不能正确返回,程序跑飞而一直重启。
代码:
#pragma vector=0x19
__interrupt void interrupt_handler_tim4(void)
{
    asm("SIM");
    TIM4->SR1 =0x00;

    Scan_Key();       //调用子函数,这句话有问题;单片机重启
    GC_Temp++;
    asm("RIM");
    asm("IRET");        
}



char  Scan_Key(void)    //这么简单的也不行
{
    char  a,b;
   return a+b;
}
Thorald 发表于 2017-4-13 20:41 | 显示全部楼层
发生了中断嵌套导致栈溢出从未程序跑飞,看门狗重启
yiyigirl2014 发表于 2017-4-13 20:47 | 显示全部楼层
你怎么确认是那句造成的呢?
yiyigirl2014 发表于 2017-4-13 20:54 | 显示全部楼层
应该跟那句没有关系。
Bjorn 发表于 2017-4-13 20:54 | 显示全部楼层
乱用开关中断指令的问题
首先是因为你进入中断后人为的改变了定时器的中断优先级为最高(比之前的定时器的优先级别更高了),这次如果你的定时时间很短,你的处理函数还没执行完,这次就会出现定时器重新嵌入到中断处理函数中,最终导致栈溢出。
yiyigirl2014 发表于 2017-4-13 20:55 | 显示全部楼层
我网上找了个例子给你看看
  1. /* -------------------------------------------------------------------
  2. 实验内容:
  3. 使用STM8的定时器T1做1S定时,并使用PD口的LED指示灯做简单指示。
  4. ----------------------------------------------------------------------
  5. 硬件连接:
  6. 将PB口的LED指示灯使能开关切换到"ON"状态。
  7. ----------------------------------------------------------------------*/

  8. #include <STM8S207S8.h>
  9. unsigned char i=0;

  10. #define DISP_DDR   DDRD
  11. #define DISP_PORT  PORTD


  12. void Init_Tim4(void)
  13. {
  14.       TIM4_CR1=0x01;
  15.       //TIM4_IER=0x00;
  16.       TIM4_IER=0x01;
  17.       TIM4_EGR=0x01;
  18.       TIM4_CNTR=255;
  19.       TIM4_ARR=255;
  20.       TIM4_PSCR=0x07;
  21. }

  22. void Init_GPIO(void)
  23. {
  24.       PD_DDR=0xff;
  25.       PD_CR1=0xff;
  26.       PD_CR2=0x00;
  27. }

  28. void main(void)
  29. {
  30.       Init_GPIO();
  31.       Init_Tim4();
  32.       _asm("rim");
  33.       while (1);
  34. }

  35. [url=home.php?mod=space&uid=1095855]@far[/url] [url=home.php?mod=space&uid=422518]@interrupt[/url] void TIM4_UPD_OVF_IRQHandler (void)
  36. {
  37.       i++;
  38.       TIM4_SR=0x00;
  39.       if(i==61)
  40.       {
  41.             PD_ODR=PD_ODR^0x08;
  42.             i=0;
  43.       }
  44.       return;
  45. }
Rollo 发表于 2017-4-13 21:20 | 显示全部楼层
asm("SIM"); asm("RIM");
    asm("IRET");  这三句屏蔽掉就没事了,你可以试下
Rangar 发表于 2017-4-13 21:29 | 显示全部楼层
不加扫描函数,会重启吗
Stannis 发表于 2017-4-13 21:44 | 显示全部楼层
scan函数怎么写的  用到哪些io口了
zhuomuniao110 发表于 2017-4-13 21:56 | 显示全部楼层
不加扫描是什么效果。。。是不是这样,你进入中断后要不要先关闭中断,你在按键时候又触发了下次的中断。一般进去后先关中断,清理中断,然后干活,干完活重启中断。
chenci2013 发表于 2017-4-14 22:36 | 显示全部楼层
程序跑飞使用看门狗
chenci2013 发表于 2017-4-14 22:38 | 显示全部楼层
这几个汇编程序有什么问题?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

46

主题

180

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

46

主题

180

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部