stm32中断

stm32每一个外设都能产生中断,F103内核上搭载了一个异常(中断)响应系统。其中系统异常有10个(包括RESET和HardFault),外部中断有60个。

NVIC
嵌套中断中断向量控制器,控制着整个芯片中断相关的功能。NVIC是内核里面的一个外设,用来配置中断。
在配置中断时,常用的是ISER、ICER、和IP这三个寄存器,ISER用来使能中断,ICER用来清除中断,IP用来设置中断优先级。
优先级
中断优先级寄存器NVIC_IPRX用来配置外部中断优先级,IPR宽度为8bit,F103中只使用了高4位,这4位又被分成了抢占优先级和子优先级。如果有多个中断同时响应,抢占优先级高的优先执行,若抢占优先级相同,则比较子优先级,如果抢占优先级和子优先级都相等的情况下,比较硬件的中断编号,编号越小的优先级越高。
拓展
外部中断优先级由NVIC中的IPx寄存器控制,而系统异常的优先级由核外设SCB的SHPRx(x=1,2,3)寄存器控制。内核外设没有抢占优先级和子优先级的说法。当比较内核外设和片上外设的中断优先级时,NVIC中断优先级分组对片上外设和内核外设都起作用。例如,systick内核外设中断优先级是 15,配置一个外设中断优先级分组为2,其中抢占优先级为1,子优先级为1。如何比较???这样比较:内核外设优先级是15,二进制是1111b,又因为优先级分组是2,则抢占优先级为11 b,即3,子优先级为11b,即3。外设中断的抢占优先级和自由级都比内核外设中断优先级小,故外设中断的优先级高。若软件配置的优先级一样,那就比较他们在中断向量表中的硬件编号,越小中断优先级越高。

中断编程
1、使能外设某个中断,具体由每个外设的相关中断使能位控制。
2、初始化NVIC_InitTypeDef结构体,配置中断优先级分组,设置抢占优先级,使能中断请求。

1 typedef struct {
2 uint8_t NVIC_IRQChannel; // 中断源
3 uint8_t NVIC_IRQChannelPreemptionPriority; // 抢占优先级
4 uint8_t NVIC_IRQChannelSubPriority; // 子优先级
5 FunctionalState NVIC_IRQChannelCmd; // 中断使能或者失能
6 } NVIC_InitTypeDef;

3、编写中断服务函数,在启动文件startup_stm32f10x_hd.s中编写。

EXTI----外部中断
EXTI-----外部中断/事件控制器,管理了控制器的20个中断/事件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿和下降沿检测。EXTI可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或事件,以及触发事件的属性。
EXTI功能框图
EXTI可以分为两大部分功能,一个是用来是产生中断,另一个是产生事件。
来自GPIO或外设的中断信号通过输入线来到边沿检验电路,边沿检测电路会根据上升沿选择触发器(EXTI_RTSR)和下降沿选择触发器(EXTI_FTSR)的对应位来控制中断的触发方式。可以设为上升沿触发、下降沿触发、上、下降沿触发。
边沿检验电路和中断事件寄存器(EXTI_IMR)作为或门的输入,输入兵分两路,下面将要介绍。或门输入,有1为1,全0为0,所以我们可以软件控制中断事件寄存器是1还是0来控制是否要产生中断。或门的输出其中一路会被保存到挂起寄存器(EXTI_PR)内,如果确定或门的输出为1,就会把挂起寄存器对应位置1。然后挂起寄存器中断内容就输出到NVIC内,从而实现系统中断时间的控制。
或门的另一路输出是一个产生事件的线路,最终输出一个脉冲信号。
或门的第二个输出路线:
或门的输入与事件屏蔽寄存器(EXTI_EMR)的输出作为与门的输入,与门输入,有0为0,全1为1,所以可以通过软件控制EXTI_EMR来控制是否产生事件。与门的输出作为脉冲发生器的输入,当与门输出1时,脉冲发生器就会产生一个脉冲,这个脉冲信号可以给其他的外设电路使用,例如TIM、ADC。

中断事件线
EXTI有20跟中断事件线EXTI0~EXTI19,每个GPIO都可以被设置为输入线。例:中断\事件线EXTI0 Px0 x可以为(ABCDEFGHI),EXTI5 Px5 x可以为(ABCDEFGHI)
EXTI初始化结构体
标准库函数为每一个外设都建立了一个初始化结构体,结构体成员用于设置外设的工作参数,并由外设初始化配置函数(XXXX_Init())调用。找到初始化结构体定义在哪一个.c文件中,配合对应的.h文件,即可根据自己的需求配置好结构体。

1 typedef struct {
2 uint32_t EXTI_Line; // 中断/事件线
3 EXTIMode_TypeDef EXTI_Mode; // EXTI 模式
4 EXTITrigger_TypeDef EXTI_Trigger; // 触发类型
5 FunctionalState EXTI_LineCmd; // EXTI 使能
6 } EXTI_InitTypeDef;

1、EXTI_Line:EXTI中断事件线选择,可选择EXTI0—EXTI19。
2、EXTI_Mode:EXTI模式选择,可选择为产生中断(EXTI_Mode_Interrupt)或者产生事件(EXTI_Mode_Event)
3、EXTI_Trigger:EXTI边沿触发事件,可选择上升沿触发,下降沿触发或上升沿下降沿都触发。
4、EXTI_LineCmd:控制是否使能EXTI线,(DISABLE ENABLE)

总结
配置中断的步骤:

一、配置NVIC寄存器
1、配置NVIC的优先级组是第几组(0,1,2,3,4)
2、配置中断源
3、配置抢占优先级
4、配置子优先级(注:抢占优先级和子优先级的设定根据优先组的选择)
5、使能中断通道
6、初始化结构体
二、EXTI中断配置
1、声明外设初始化结构体,中断初始化结构体
2、开启外设对应的GPIO时钟
3、配置NVIC中断
然后按着结构体中的成员配置就行,主要是明白自己为什么这样配置就行

在启动文件中编写中断服务函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值