OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4280|回复: 13

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

[复制链接]

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2013-1-14
在线时间
6 小时
发表于 2016-12-6 11:09:38 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 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]

example.zip

3.75 MB, 下载次数: 193

工程文件

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

39

主题

597

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2110
金钱
2110
注册时间
2011-9-3
在线时间
119 小时
发表于 2016-12-6 20:42:46 | 显示全部楼层
应该是不能相互打断吧。
回复

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2013-1-14
在线时间
6 小时
 楼主| 发表于 2016-12-7 18:04:49 | 显示全部楼层
螃蟹爱虫 发表于 2016-12-6 20:42
应该是不能相互打断吧。

实测能打断,这是为什么呢?
回复

使用道具 举报

39

主题

597

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2110
金钱
2110
注册时间
2011-9-3
在线时间
119 小时
发表于 2016-12-7 20:50:00 | 显示全部楼层
yuyouliang 发表于 2016-12-7 18:04
实测能打断,这是为什么呢?

你查看优先级是不是同级的?
回复

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2013-1-14
在线时间
6 小时
 楼主| 发表于 2016-12-9 01:29:55 | 显示全部楼层
螃蟹爱虫 发表于 2016-12-7 20:50
你查看优先级是不是同级的?

优先级我没设置,那就是默认3级。实测能被打断。后来加了条语句,两者我都改成了2级,也出现了被打断的现象。非常奇怪。
回复

使用道具 举报

39

主题

597

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2110
金钱
2110
注册时间
2011-9-3
在线时间
119 小时
发表于 2016-12-9 08:40:59 | 显示全部楼层
你先改不同级的,看打断的情况。
回复

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2013-1-14
在线时间
6 小时
 楼主| 发表于 2016-12-22 16:37:15 | 显示全部楼层
螃蟹爱虫 发表于 2016-12-9 08:40
你先改不同级的,看打断的情况。

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

使用道具 举报

39

主题

597

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2110
金钱
2110
注册时间
2011-9-3
在线时间
119 小时
发表于 2016-12-23 10:48:25 | 显示全部楼层
yuyouliang 发表于 2016-12-22 16:37
昨天在STM8L上试了下,中断完全正常。默认级别,都是3级,不会相互打断。如果设置了软件优先级,那么高优 ...

应该两者一致的,建议仔细查查,是不是哪里设置错误。
回复

使用道具 举报

6

主题

201

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1149
金钱
1149
注册时间
2015-11-13
在线时间
267 小时
发表于 2017-1-3 15:56:56 | 显示全部楼层
端口A外部中断的硬件中断优先级是3,端口B外部中断的硬件中断优先级是4。

如果不设置软件优先级的话,PA相关引脚的外部中断当然能打断PB相关引脚的外部中断。
回复

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2013-1-14
在线时间
6 小时
 楼主| 发表于 2017-1-16 15:42:16 | 显示全部楼层
特朗姆斯 发表于 2017-1-3 15:56
端口A外部中断的硬件中断优先级是3,端口B外部中断的硬件中断优先级是4。

如果不设置软件优先级的话,PA ...

那怎么解释我在STM8L上面实验得到的正常现象:不设置软件优先级就不会相互打断,除非设置了软件优先级?
回复

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2013-1-14
在线时间
6 小时
 楼主| 发表于 2017-1-16 15:47:09 | 显示全部楼层
特朗姆斯 发表于 2017-1-3 15:56
端口A外部中断的硬件中断优先级是3,端口B外部中断的硬件中断优先级是4。

如果不设置软件优先级的话,PA ...

同时发生中断管理模式:在该模式下,所有的中断的中断优先级都是3级,因此它们都是不可以被中断的(除了被TLI,RESET或TRAP中断之外)。
上面是ST官方数据手册的原话。不设置软件优先级,那么所有中断的软件优先级都是3级,是不能被相互打断的。和你说的完全不一样,请问你看过数据手册嘛?
回复

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2013-1-14
在线时间
6 小时
 楼主| 发表于 2017-1-16 15:55:14 | 显示全部楼层
螃蟹爱虫 发表于 2016-12-23 10:48
应该两者一致的,建议仔细查查,是不是哪里设置错误。

前几天,在STM8L151K4T6上面试了下,中断的优先级和打断情况,和数据手册说的一样,没有问题。
但过了几天,我用同样的代码,用在STM8L151G6上面就又有问题了。不设置软件优先级的话,中断确实不会相互打断。但设置了软件优先级,能出现打断的情况,但设置的软件级别无效,也就是不管怎么设置,始终是硬件优先级高的能打断硬件优先级低的,软件优先级没作用。
真的快醉了。。。
回复

使用道具 举报

6

主题

201

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1149
金钱
1149
注册时间
2015-11-13
在线时间
267 小时
发表于 2017-2-17 13:13:46 | 显示全部楼层
yuyouliang 发表于 2017-1-16 15:47
同时发生中断管理模式:在该模式下,所有的中断的中断优先级都是3级,因此它们都是不可以被中断的(除了被 ...

之前理解错了你的意思。

硬件中断影响的是中断的响应优先级,如果软件优先级相同的话是不能互相打断的。
回复

使用道具 举报

6

主题

201

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1149
金钱
1149
注册时间
2015-11-13
在线时间
267 小时
发表于 2017-2-17 13:16:15 | 显示全部楼层
本帖最后由 特朗姆斯 于 2017-2-17 13:17 编辑
yuyouliang 发表于 2017-1-16 15:55
前几天,在STM8L151K4T6上面试了下,中断的优先级和打断情况,和数据手册说的一样,没有问题。
但过了几 ...

我看了一下你的例子,中断服务函数放在了stm8s_it.c里,这是参考哪家的例子?

我在网上看到的普遍的方式包括我自己用下来好用的方式是通过修改stm8_interrupt_vector.c这个文件来实现。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 05:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表