STM8S的外部中断,软件级别相同,也能被相互打断?

2019-07-19 20:58发布

本帖最后由 yuyouliang 于 2016-12-6 11:12 编辑

我用的芯片型号是STM8S207R8,固件库是V2.2.0。编译环境为IAR 2.20.1.现在在进行外部中断实验。有两个按键,分别连接到了PA3和PB1,靠外部中断下降沿的方式触发。
但奇怪的现象来了,我没有对这两个外部中断设置软件优先级,应该默认都是3级。按照数据手册的说法,软件级别相同的外部中断,不应该相互打断,也就是不发生中断嵌套。
但实测是:PA3的中断能打断PB1的中断,但PB1的中断却不能打断PA3的中断,即发生了中断嵌套。
请问各位大神有碰到类似的现象,可否指点迷津?拜谢了。
整套的工程文件见附件。
下述是关键部分代码。
这是key.c文件的代码:
[mw_shl_code=cpp,true]#include "key.h"

void EXTI_KEY_Init(void)        //PB1
{
  EXTI_SetExtIntSensitivity(EXTI_KEY_PORT,EXTI_SENSITIVITY_FALL_ONLY);
  GPIO_Init(KEY_PORT, KEY_PIN, GPIO_MODE_IN_PU_IT);
}

void button_init(void)         //PA3
{
  EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOA,EXTI_SENSITIVITY_FALL_ONLY);
  GPIO_Init(GPIOA, GPIO_PIN_3, GPIO_MODE_IN_PU_IT);
}[/mw_shl_code]

这是main.c文件的代码:
[mw_shl_code=c,true]#include "stm8s.h"
#include "led.h"
#include "key.h"
#include "stm8s_it.h"

void delay(int n)
{
  int i,j;
  for(i=0;i<n;i++)
  {
      for(j=0;j<2000;j++);
  }
}


int main(void)
{
  CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
  
  LED_Init();
  LED_Close();
  EXTI_KEY_Init();
  button_init();
  rim();
  while(1)
  {
  
  }
}[/mw_shl_code]

这是stm8s_it.c文件的部分代码:
[mw_shl_code=applescript,true]INTERRUPT_HANDLER(EXTI_PORTA_IRQHandler, 3)
{
  /* In order to detect unexpected events during development,
     it is recommended to set a breakpoint on the following instruction.
  */
  
   int i;
for(i=0;i<5;i++){
   LED_Open();
   delay(200);
   LED_Close();
   delay(400);
}
  
}

/**
  * @brief External Interrupt PORTB Interrupt routine.
  * @param  None
  * @retval None
  */
INTERRUPT_HANDLER(EXTI_PORTB_IRQHandler, 4)
{
  /* In order to detect unexpected events during development,
     it is recommended to set a breakpoint on the following instruction.
  */
int i;
for(i=0;i<10;i++){
   LED_Open();
   delay(50);
   LED_Close();
   delay(100);
}
}
[/mw_shl_code]

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。