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]

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
螃蟹爱虫
1楼-- · 2019-07-20 02:37
应该是不能相互打断吧。
yuyouliang
2楼-- · 2019-07-20 02:48
 精彩回答 2  元偷偷看……
螃蟹爱虫
3楼-- · 2019-07-20 05:41
 精彩回答 2  元偷偷看……
yuyouliang
4楼-- · 2019-07-20 06:14
螃蟹爱虫 发表于 2016-12-7 20:50
你查看优先级是不是同级的?

优先级我没设置,那就是默认3级。实测能被打断。后来加了条语句,两者我都改成了2级,也出现了被打断的现象。非常奇怪。
螃蟹爱虫
5楼-- · 2019-07-20 10:11
 精彩回答 2  元偷偷看……
yuyouliang
6楼-- · 2019-07-20 11:10
螃蟹爱虫 发表于 2016-12-9 08:40
你先改不同级的,看打断的情况。

昨天在STM8L上试了下,中断完全正常。默认级别,都是3级,不会相互打断。如果设置了软件优先级,那么高优先级就会打断低优先级的。
至于STM8S,为什么默认级别也会相互打断,就不得而知了。。。

一周热门 更多>