夹鳄鱼 发表于 2017-3-10 10:04:03

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

本帖最后由 夹鳄鱼 于 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;
}



夹鳄鱼 发表于 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内你根本不响应别的中断,不合适吧?
页: [1]
查看完整版本: 触发外部中断后无法跳出到主函数