OpenEdv-开源电子网

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

STM8的中断优先级理解(包括软件优先级,硬件优先级,TLI中断等)

[复制链接]

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-6-27 14:56:04 | 显示全部楼层 |阅读模式
STM8S的中断由中断控制器(ITC)控制.
STM8所有IO都支持中断,分为PA~PE 5个组,每组IO对应一个中断服务函数(也就是每组IO只有一个向量).
STM8没有专门的中断状态寄存器,所以只能通过刚进入中断就读取IDR来判断,不过在某些情况下,此种方法就不好用了,所以在设计的时候就要考虑清楚,是不是会冲突.最好把有冲突的中断放到不同的组.
STM8的外部中断采用软件优先级+硬件优先级的控制方法,来控制优先级分组.软件优先级优先于硬件优先级.
硬件优先级由向量号确定,向量号越小,优先级越高.
STM8软件优先级设置可以分为4个等级(0~3),实际上可设置的就三个等级:1~3
优先级顺序:0<1<2<3,3的优先级最高,高优先级的中断可以打断低优先级的中断
多个中断同时发生:在软件优先级相同的情况下,由硬件优先级决定谁先响应.但是硬件优先级不可打断.也就是相同软件优先级的中断,硬件优先级低的中断在执行了...此时来一个硬件优先级高的中断是不可以打断低优先级的中断的.
STM8还有个TLI外部中断,这个优先级可以打断软件优先级为3的中断,TLI的优先级不可设置.(基本就是最高级别了,除了RESET)


我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2016-3-20
在线时间
22 小时
发表于 2018-5-9 17:28:50 | 显示全部楼层
螃蟹爱虫 发表于 2018-4-6 14:30
进入中断后,第一时间执行除能中断,退出前再使能。

我也遇到这个情况,然后进了外部中断就执行disableInterrupts()这个函数,但没有作用。
了解后发现disableInterrupts()是执行了SIM指令,即把I1和I2都设置为1,当前程序的优先级为最高。所以这个函数只是确保其他中断无法打断当前程序的执行。
最后我换成了在中断程序中将IO口重新配置为不触发外部中断,就不会重复进来外部中断了。。。不知道你们有没有更好的办法
回复 支持 1 反对 0

使用道具 举报

4

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2013-8-8
在线时间
2 小时
发表于 2013-8-8 00:42:56 | 显示全部楼层
TLI 是不是最好不要采用呢? 或者原子哥都怎么设置中断优先级的呢? 望赐教
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
 楼主| 发表于 2013-8-8 09:17:23 | 显示全部楼层
回复【2楼】zxc2769:
---------------------------------
STM8S其实优先级真的不多,就3个,加上TLI最多也就4层。
TLI这个我还没用过呢,呵呵。用应该是可以的了,看你自己需要去设计了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2013-8-8
在线时间
2 小时
发表于 2013-8-8 17:11:34 | 显示全部楼层
 同事就是想用TLI ,所以逼着我要改版我设计好的电路板。 你要知道,自己已经精心设计的电路板,是不愿意轻易改版啊!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
 楼主| 发表于 2013-8-8 17:54:45 | 显示全部楼层
回复【4楼】zxc2769:
---------------------------------
呵呵,屌他!!!
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2014-4-25
在线时间
1 小时
发表于 2015-1-10 12:26:59 | 显示全部楼层
EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOC, EXTI_SENSITIVITY_FALL_ONLY);
EXTI_SetTLISensitivity(EXTI_TLISENSITIVITY_FALL_ONLY);

这两个是什么意思?请解释一下吧,刚入门stm8s
回复 支持 反对

使用道具 举报

10

主题

75

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2015-5-22
在线时间
0 小时
发表于 2015-7-10 10:56:53 | 显示全部楼层
注意:每组IO对应一个中断服务函数(也就是每组IO只有一个向量),若想知道具体是哪个引脚引起的,只能通过中断服务函数刚进入中断就读取IDR来判断
————————————————————————————————————————————————————————————————————

EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOC, EXTI_SENSITIVITY_FALL_ONLY); /* 将GPIOC端口设置为下降沿触发中断*/


 EXTI_SetTLISensitivity(EXTI_TLISENSITIVITY_FALL_ONLY);/* 将PD7引脚的TLI中断设置为下降沿中断;(PD7对应TIL引脚) */
一点浅见
我建了一个战舰stm32交流群:320350722 新手请教老手,老手大显身手! stm32交流群:320350722 stm32交流群:320350722
回复 支持 反对

使用道具 举报

10

主题

75

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2015-5-22
在线时间
0 小时
发表于 2015-7-10 11:00:28 | 显示全部楼层
#define enableInterrupts()    __enable_interrupt()   /* enable interrupts */
为什么开启总中断的这个宏 用IAR找__enable_interrupt()的定义 打不开啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊?????求助原子核哥~~~~~~~
我建了一个战舰stm32交流群:320350722 新手请教老手,老手大显身手! stm32交流群:320350722 stm32交流群:320350722
回复 支持 反对

使用道具 举报

10

主题

75

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2015-5-22
在线时间
0 小时
发表于 2015-7-10 11:04:01 | 显示全部楼层
/**************************************************
 *
 * Intrinsic functions.
 *
 * Copyright 2010 IAR Systems AB.
 *
 * $Revision: 2094 $
 *
 **************************************************/

#ifndef __INTRINSICS_H
#define __INTRINSICS_H

#ifndef _SYSTEM_BUILD
  #pragma system_include
#endif

#pragma language=save
#pragma language=extended


/*
 * The return type of "__get_interrupt_state".
 */

typedef unsigned char __istate_t;

#ifdef __cplusplus
extern "C"
{
#endif

  __intrinsic void __enable_interrupt(void);     /* RIM */
  __intrinsic void __disable_interrupt(void);    /* SIM */

  __intrinsic __istate_t __get_interrupt_state(void);
  __intrinsic void       __set_interrupt_state(__istate_t);

  /* Special instruction intrinsics */
  __intrinsic void __no_operation(void);         /* NOP */
  __intrinsic void __halt(void);                 /* HALT */
  __intrinsic void __trap(void);                 /* TRAP */
  __intrinsic void __wait_for_event(void);       /* WFE */
  __intrinsic void __wait_for_interrupt(void);   /* WFI */

#ifdef __cplusplus
}
#endif


#pragma language=restore

#endif /* __INTRINSICS_H */



在intrinsics.h中找到了,但是看不懂啊啊~~~~~~~~~快疯了原子哥::>_<::
我建了一个战舰stm32交流群:320350722 新手请教老手,老手大显身手! stm32交流群:320350722 stm32交流群:320350722
回复 支持 反对

使用道具 举报

10

主题

75

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2015-5-22
在线时间
0 小时
发表于 2015-7-10 11:07:50 | 显示全部楼层


还有啊这个懒人软件里面的库函数好多都在2.10版的库中找不到啊~~~~~~怎么不兼容啊我也是stm8s啊 疯了啊
我建了一个战舰stm32交流群:320350722 新手请教老手,老手大显身手! stm32交流群:320350722 stm32交流群:320350722
回复 支持 反对

使用道具 举报

10

主题

75

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2015-5-22
在线时间
0 小时
发表于 2015-7-10 11:11:00 | 显示全部楼层
#ifdef USE_FULL_ASSERT

/**
  * @brief  Reports the name of the source file and the source line number
  *   where the assert_param error has occurred.
  * @param file: pointer to the source file name
  * @param line: assert_param error line source number
  * @retval: None
  */
void assert_failed(u8* file, u32 line)

  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* Infinite loop */
  while (1)
  {
  }
}
#endif
main函数最后带了个这个是干嘛的啊
我建了一个战舰stm32交流群:320350722 新手请教老手,老手大显身手! stm32交流群:320350722 stm32交流群:320350722
回复 支持 反对

使用道具 举报

10

主题

75

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2015-5-22
在线时间
0 小时
发表于 2015-7-10 11:22:44 | 显示全部楼层
回复【10楼】13128927795:
---------------------------------
这个我知道了 是因为我看的是他自己编写的函数,还不是底层的库函数,底层的库函数没问题
我建了一个战舰stm32交流群:320350722 新手请教老手,老手大显身手! stm32交流群:320350722 stm32交流群:320350722
回复 支持 反对

使用道具 举报

7

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
205
金钱
205
注册时间
2015-11-14
在线时间
98 小时
发表于 2016-1-18 13:42:23 | 显示全部楼层
挖个坟求助一下一下原子哥,现在有个小项目用到了STM8S的外部中断,但是发现它会被自己打断,这是为什么呀。
敢想敢为,敢做敢当。
回复 支持 反对

使用道具 举报

4

主题

15

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2016-1-26
在线时间
4 小时
发表于 2016-1-26 21:16:32 | 显示全部楼层
顶顶顶
回复 支持 反对

使用道具 举报

4

主题

15

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2016-1-26
在线时间
4 小时
发表于 2016-1-26 21:25:38 | 显示全部楼层
好难啊,完全不懂大神们在说什么
回复 支持 反对

使用道具 举报

1

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2017-1-6
在线时间
6 小时
发表于 2017-10-26 20:52:41 | 显示全部楼层
最高级TLI,扛把子级别,想干啥谁都拦不住。
回复 支持 反对

使用道具 举报

39

主题

597

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2109
金钱
2109
注册时间
2011-9-3
在线时间
119 小时
发表于 2018-4-6 14:30:11 | 显示全部楼层
onebank 发表于 2016-1-18 13:42
挖个坟求助一下一下原子哥,现在有个小项目用到了STM8S的外部中断,但是发现它会被自己打断,这是为什么呀 ...

进入中断后,第一时间执行除能中断,退出前再使能。
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2019-6-18
在线时间
10 小时
发表于 2020-2-23 21:44:44 | 显示全部楼层
onebank 发表于 2016-1-18 13:42
挖个坟求助一下一下原子哥,现在有个小项目用到了STM8S的外部中断,但是发现它会被自己打断,这是为什么呀 ...

在中断被响应时如果位 I1  和 I0  被修改,那么设备将作如下处理: 如果一个中断 X 仍然处在悬起状态(新的中断或者中断标志没有被清除)同时该新的优先级又比先前的优先级高的话,那么该中断 X 会被重新响应。否则该中断的软件优先级在下一个中断请求 ( X 中断的 IRET 之后)来之前保持不变。
                                         ——stm8参考手册 ——10.5.2  嵌套中断管理模式

可能是在中断里设置了更高的优先级,所以中断重新响应。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 13:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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