STM32
直播中

王岩

8年用户 897经验值
私信 关注
[问答]

把AVR的程序移植使用STM8时,触发外部中断后无法跳出到主函数是怎么回事?

求助,把AVR的程序移植使用STM8时发现,触发外部中断后,程序跳到中断函数并运行,但运行完中断函数之后并没有回到主函数里面执行while 里面的程序。再次触发外部中断时,又会继续运行中断函数,但执行完中断函数后又不跳转到主函数。
    尝试了STM8S105k4和STM8S207C8都一样的结果,求指点一下。
   
下面是[size=14.3999996185303px]STM8S207C8的程序,[size=14.3999996185303px]把多余的删了,PG0是LED灯,PC7是触发外部中断的引脚。配置[size=14.3999996185303px]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)

1123127317

2024-5-6 17:05:34
在将AVR程序移植到STM8时,可能会遇到一些差异,导致程序行为与预期不符。根据您的描述,问题似乎出在外部中断触发后无法返回主函数。以下是一些建议和可能的解决方案:

1. 确保中断优先级设置正确:在STM8中,中断优先级可能影响中断服务程序(ISR)的执行顺序。请检查您的中断优先级设置,确保外部中断具有适当的优先级。

2. 检查中断标志位:在STM8中,中断标志位需要在ISR中清除。确保在中断服务程序的末尾清除了相应的中断标志位。例如,如果您使用的是EXTI中断,需要在ISR中清除EXTI_FLAG(例如:EXTI_FLAG = 0x00;)。

3. 检查堆栈溢出:如果ISR过长,可能会导致堆栈溢出,从而使程序无法返回主函数。尝试简化ISR,减少局部变量和函数调用,以降低堆栈使用。

4. 使用中断返回指令:在STM8中,可以使用IRET(Interrupt Return)指令从中断服务程序返回。确保在ISR的末尾添加IRET指令,以便返回主函数。

5. 检查主函数中的while循环:确保while循环中的代码不会阻止程序继续执行。例如,避免在while循环中使用长时间的延时或死循环。

6. 确保时钟配置正确:STM8和AVR的时钟配置可能有所不同。检查您的STM8时钟配置,确保它与AVR程序中的时钟配置相匹配。

7. 检查GPIO配置:确保STM8的GPIO配置与AVR程序中的配置相匹配,包括引脚方向、上拉/下拉电阻等。

8. 使用STM8的库函数:STM8提供了一些库函数,可以帮助您更轻松地实现特定功能。尝试使用这些库函数,而不是直接移植AVR代码。

9. 调试和仿真:使用STM8的调试工具和仿真器,逐步执行程序,观察中断服务程序和主函数之间的跳转。

10. 参考STM8官方文档和示例代码:STM8官方文档和示例代码可以帮助您了解STM8的特定行为和实现方式。参考这些资源,确保您的程序遵循STM8的编程规范。

希望这些建议能帮助您解决问题。如果问题仍然存在,请提供更多关于您的程序和硬件配置的详细信息,以便进一步分析和解决。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分