江科大 STM32入门教程

1.EXTI中断简介
-
原理:EXTI检测指定GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI立即向NVIC发出终端申请,经过NVIC裁决后即可中断CPU主程序,时CPU发出中断申请,是CPU执行EXTI对应的中断程序。(一共含有20个通道数)
-
支持的触发方式:上升沿/下降沿/双边沿/软件触发
-
支持的GPIO口:所有的GPIO口,但是相同的Pin不能同时触发。
-
问题为什么相同的pin不能同时触发:在GPIO口的电平信号将要传给EXTI中断器之前,首先要经 过AFIO(数据选择器)的中断引脚选择,AFIO在接入的GPIO口中选择一个GPIO口接入到EXTI边沿检测及控制口,在加上PVD、RTC、USB、ETH几个,一共就构成了EXTI的20的通道。
-
触发响应方式:中断响应/事件响应。
2.AFIO简介
- 定义:掌管复用输入输出功能的一个微控制器,它允许将 GPIO 引脚的功能从常规的输入 / 输出模式切换到各种复用功能模式,以满足不同外设对引脚的需求,从而实现更丰富多样的功能应用。
- 作用:通过 GPIO_EXTILineConfig 函数将外部中断线与 GPIO 引脚建立映射关系、某些内部事件(如定时器的定时事件、比较器的比较事件等)通过 GPIO 引脚以特定的方式输出出去从而实现内部事件的外部可视化或与其他外部设备的交互、重映射功能可以将其他外设的功能通过AFIO转移到stm32的其他GPIO的引脚上。
3.NVIC简介
- 定义:嵌套向量中断微控制器。
- 作用:管理中断优先级,如中断优先级的分组,中断的嵌套,中断通道的使能和禁用。
4.与EXTI中断的使用有关的函数的简介
a.EXTI配置函数
1. EXTI_Init 函数
- 作用:用于初始化外部中断。它可以设置外部中断的触发方式(如上升沿触发、下降沿触发、双边沿触发等),指定产生中断的外部引脚(通过中断线来对应具体的 GPIO 引脚)等功能
2. EXTI_GetITStatus 函数
- 作用:用于获取指定外部中断线的中断状态。如果返回值为真(SET),表示指定的外部中断线当前处于中断状态,即已经产生了相应的中断;反之(RESET)也可推
3.GPIO_EXTILineConfig
- 函数能够明确指定哪条外部中断线与哪个 GPIO 引脚相连接。
5. EXTI_ClearITPendingBit 函数
- 作用:用于清除相应的中断标志位,以便下次外部中断能够正常触发,可以确保系统不会因为未清除的中断标志位而错过下一次的外部中断触发。
6. EXTI_SetITPendingBit 函数
- 作用:与 EXTI_ClearITPendingBit 函数对应,它是用于设置指定外部中断线的中断标志位的。但一般是通过外部事件触发来自动设置中断标志位,很少会直接使用这个函数来设置中断标志位
7. EXTI_GenerateSWInterrupt 函数
- 作用:用于生成软件触发的外部中断。
8. EXTI_GetPendingBit 函数
- 作用:用于获取指定外部中断线的当前未处理的中断标志位状态。类似于 EXTI_GetITStatus 函数,但它主要关注的是未处理的中断标志位状态,而不是已经发生的中断状态。
9. EXGI_SetTriggerMode 函数
- 作用:用于设置指定外部中断线的触发模式。用于重新设置。
10.EXTI_DeInit(void)
- 用于初始化与exti相关的寄存器并清除状态位
b.NVIC配置相关函数
1. NVIC_Init 函数
- 作用:用于初始化 NVIC 的相关寄存器
2. NVIC_SetPriority 函数:
- 作用:用于设置指定中断源(由IRQn_Type枚举类型确定具体中断)的优先级。在程序运行过程中,可根据实际需求动态(即随时可以对某一中断的优先级)调整某个中断的优先级。
3. NVIC_GetPriority 函数
- 作用:用于获取指定中断源的当前优先级设置。在调试或者需要依据当前中断优先级情况做出进一步决策的场景中较为有用。
4. NVIC_EnableIRQ 函数
- 作用:用于使能指定的中断源。作用与NVIC_DisableIRQ 函数相反
5. NVIC_DisableIRQ 函数
- 作用:用于禁用指定的中断源。在某些情况下,可能不需要处理某个中断或者需要暂时屏蔽某个中断的响应,就可以调用该函数禁止该中断请求进入 NVIC。
6. NVIC_ClearPendingIRQ 函数
- 作用:用于清除指定中断源的挂起状态。避免因之前的挂起状态导致异常的中断处理行为。
7. NVIC_PriorityGroupConfig 函数
- 作用:用于配置中断优先级分组。STM32 的中断优先级由抢占优先级和响应优先级两部分组成。该函数通过指定不同的NVIC_PriorityGroup值,确定抢占优先级和响应优先级所占用的位数,从而影响可设置的优先级级别数量以及中断的嵌套和响应顺序。
抢占优先级和响应优先级
1.抢占优先级:
- 用于实现中断嵌套。用于确保重要的中断可被优先处理。在低优先级的中断进行时,高优先级的中断进行时,可以暂停低优先级的中断,在高优先级的中断进行完成的之后,再进行第优先级的中断。
2.响应优先级:
- 用于对相同抢占优先级的中断程序进行排序
5.代码实现
- 开启GPIO和AFIO外设时钟,由于NVIC处于内核因此不需要开启NVIC的时钟
- 初始化GPIO
- 使用GPIO_EXTLineConfig函数来吧AFIO的通道指向对应的GPIO口
- 初始化AFIO(AFIO的相关函数在GPIO.h的文件夹中)
- 使用NVIC_PriorityGroupConfig函数来选择抢占优先级和响应优先级的模式(stm32在同一时刻只会有以一种分组方式)
- 初始化NVIC,并使用NVIC初始化结构体来连接AFIO
- 初始化通道后,要根据对应的EXTI中断情况来编写对应的中断函数。
- 在图片中的通道由于使用的是GPIO的PB12
部分对于初始化AFIO和和初始化NVIC的有关结构体的参数的解释
- EXTI_Line 选择接入的GPIO口
- EXTI_LineCmd设置所选的开关模式
- EXTI_Mode选择是事件模式还是终端模式
- EXTI_Trigger设置中断的触发模式
- NVIC_IRQChannel 选择由AFIO接通到NVIC的通道
- 上函数+cmd设置所选通道的开关模式
- 最后两个:选择抢占和响应优先级的数量
516

被折叠的 条评论
为什么被折叠?



