本帖最后由 夹鳄鱼 于 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; } |
你好,中断函数就只是很简单的语句,本来应该很快就执行完的,就十几个毫秒。
但是程序却一直没有执行完毕,不太懂······
你说的重新来中断,我是等了很久,都等不到才去重新触发中断。
这··········
一开始我也跟你这样想,结果手册上找了半天没找到标志位,网上一搜,STM8S系列根本没有外部中断的标志位,都是自动清的。
搞得现在超郁闷。
没解决,当时直接换成按键扫描的方式。如果你解决了的话,烦请分享一下经验。
也可能D口别的什么口不小心开了中断。然后10ms后跳出来后又进去了。你这库写法真的太深奥。。完全看不懂。
话说,每个10ms内你根本不响应别的中断,不合适吧?