[应用相关] STM32使用HAL库操作外部中断——理论讲解(转载)

[复制链接]
3423|9
 楼主| guanjiaer 发表于 2018-11-13 12:53 | 显示全部楼层 |阅读模式
1.中断触发过程
对主程序压栈——把中断服务函数的地址写入到程序计数器(PC)——执行中断服务函数

 楼主| guanjiaer 发表于 2018-11-13 12:54 | 显示全部楼层
2.中断向量表
中断服务函数的地址在STM32的手册上的中断向量表中(如下是一部分):
871381-20170808151913792-369036350.jpg

如上表所示,EXTI0中断服务函数的地址是0x00000058。意思就是如果触发了外部中断那么就从0x00000058地址开始执行,这个地址的函数可以在HAL库的启动文件中找到。
871381-20170808152306089-502273494.jpg
很明显,EXTI0的中断服务函数的函数名是:EXTI0_IRQHandler
871381-20170808152413730-664184930.jpg
EXTI0~EXTI4是独立的,9~5共用中断源,15~10共用中断源,9~5和15~10的中断需要在中断函数中判断是哪个中断引脚。
871381-20170808152615605-2015266132.jpg

 楼主| guanjiaer 发表于 2018-11-13 12:54 | 显示全部楼层
3.HAL库中的中断服务函数。
这里我们要用PD10引脚触发外部中断,根据向量表,EXTI10的中断服务函数是:EXTI15_10_IRQHandler。
HAL库中代码是这样执行的:
(1)首先是中断服务函数
PD10外部中断触发之后程序计数器被写入0x000000E0(EXTI15_10_IRQHandler函数的地址)
871381-20170808153145808-38054690.jpg
然后程序开始执行EXTI15_10_IRQHandler函数:
871381-20170808153249370-1675785445.jpg
EXTI15_10_IRQHandler函数只是调用了另一个函数HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_10);
871381-20170808153344074-1148412779.jpg
在这个函数中清楚中断标志位然后又调用了一个HAL_GPIO_EXTI_Callback(GPIO_Pin)函数。

 楼主| guanjiaer 发表于 2018-11-13 12:55 | 显示全部楼层
根据函数名Callback也能看出来这里才是真正执行具体功能的函数,该函数需要用户在mian.c文件中重写:
871381-20170808153557480-951332054.jpg

 楼主| guanjiaer 发表于 2018-11-13 12:55 | 显示全部楼层
4.NVIC中断控制器
步骤1-3说明了一个最基本的中断过程。然而还有一个重要的概念没有讲到,NVIC中断控制器。
STM32支持中断嵌套,为了更好的更强大的实现中断嵌套,ST给出了一个NVIC中断控制器来专门管理中断。我们都知道高优先级的中断能打断低优先级的中断优先执行,等高优先级中断执行完之后在返回去执行被打断的中断,这就是中断嵌套。那么如果同时有两个同样优先级的中断出现呢?
于是STM32所有中断都有两个优先级:抢占优先级副优先级。(英文是 preempition priority和sub priority)
判断中断的优先级,先看抢占优先级,抢占优先级高的中断优先级别高。抢占优先级相同的情况下,先执行副优先高的的。抢占优先级和响应优先级相同的情况下,根据中断向量表确定。
在Cube中配置NVIC如下图
871381-20170808155016042-1256355947.jpg
上图所示,使能EXIT line[15:10]中断,抢占优先级是0,副优先级也是0。

 楼主| guanjiaer 发表于 2018-11-13 12:55 | 显示全部楼层
那么,共有多少个抢占优先级多少个副优先级呢?
这就要涉及到另一个概念优先级分组了:
上图中的“4.优先级分组”中显示的是2bit for preemption priority,什么意思呢?
STM32以4个比特位表示中断的抢占优先级和副优先级
871381-20170808160027136-307456384.jpg
在这里可以为抢占优先级分配几个bit位。

 楼主| guanjiaer 发表于 2018-11-13 12:56 | 显示全部楼层
怎么用呢?举个栗子就很明白了:
假如我设置 3 bit for preemption priority,那么抢占优先级就有2的3次方(8)个优先级,于是副优先级就有2的1(4-3)次方(2)个。如下两个图
871381-20170808160334792-235503776.jpg
871381-20170808160346308-573416297.jpg

xiaoqizi 发表于 2018-11-15 12:55 | 显示全部楼层
平时用 现在再看看理论 觉得能理解不老少呢
 楼主| guanjiaer 发表于 2018-11-15 14:11 | 显示全部楼层
是的 所谓边写边学
mintspring 发表于 2018-11-15 20:15 | 显示全部楼层
回调函数是放在中断函数里的吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

115

主题

4414

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部