stm32 中断处理

 stm32 中断处理_第1张图片

中断:有优先级和中断嵌套

stm32 中断处理_第2张图片

中断分配:控制中断的优先级(NVIC)

 中断过程:打开RCC相关的外设时钟,配置GPIO,配置中断寄存器AFIO,配置EXTI寄存器配置相关的中断触发方式,配置中断优先级stm32 中断处理_第3张图片stm32 中断处理_第4张图片

响应优先级: 优先进行排队处理(上个事件完成后,来进行处理你)

抢占优先级:优先处理,即使正在处理别的事件

抢占优先级和响应优先级进行了分组,数字越低优先级越高

stm32 中断处理_第5张图片

引脚电平变化:触发外部中断 

外部中断:所有的引脚都可以

相同pin不能触发指的是PA1和PB1不能同时触发,而PA1和PA2可以同时触发

外部中断:

对射式红外传感器  DO接一个GPIO口就行

根据DO的电平的变化来进入中断然后让计数++,再然后让oled显示屏显示数字

配置中断:AFIO寄存器的主要功能,配置中断

GPIO--> AFIO -->EXTI--> NVIC

使能时钟: GPIO使能 配置引脚,AFIO也要开启时钟 都是APB2总线 上的(打开的是GPIOB)

EXTI 和NVIC 不需要开启时钟

配置GPIO:

stm32 中断处理_第6张图片

 配置的模式 可以参考数据手册 中断配置什么模式 可以配置上拉输入,浮空输入,下拉输入;

配置 AFIO:中断线路 和GPIO在同一个库里面

 第一个是引脚重映射功能   第二个函数配置AFIO选择中断引脚

stm32 中断处理_第7张图片

配置EXTI:

 stm32 中断处理_第8张图片

第一个:初始化  第二个: 初始化结构体        第三个:结构体赋初值

和GPIO结构体一样进行赋值:

 stm32 中断处理_第9张图片

配置NVIC:打开misc文件

 第一个; 指定分组     第二个: 初始化

分组 整个芯片只有一种

 stm32 中断处理_第10张图片

第一个函数:指定分组:

第二个:初始化结构体:

第三个:指定通道IRQ开启中断:得到整个工程中去找 

搜索:IRQn_Type   ->  MD 中等密度   -> EXTI 15_10_IRQn 

第四个:使能

第五个:抢占优先级  查找NVIC_Prioity_Table   找到分组的取值范围

第六个:响应优先级  查找NVIC_Prioity_Table   找到分组的取值范围

 每个中断函数都有一个固定的名字: 在启动文件中

stm32 中断处理_第11张图片

 中断函数:  看是否进入中断函数:判断中断标志位  清除标志位

在中断函数进行 变量的读取

旋转按钮:正转和反转相差90,

当A相位为下降沿,B相位为第电平时正转;当B相位为下降沿,A相位为第电平时反转;

利用两个中断来判断正转还是反转

初始化时钟不用改: GPIO初始化 用或运算初始化两个引脚

EXTI 线路选择,需要两个,因为是两个通道

EXTI初始化中的引脚选择 用或运算初始化两个引脚

抢占优先级的代码需要初始化两个,通道的IRQChannel需要设置,优先级的配置也需要省略

有的是需要两个中断函数 如EXTI0和1 

如果是中断的引脚为 9-5,15-10,只需要一个中断函数即可 然后并列判断标志位

旋转按钮是: 一个线路为正常的进行高点电平的跳变,而另一个线路则是根据与第一个线路的相位来进行判断的

外部中断实操总结:

打开GPIO的时钟和相关中断的时钟

定义GPIO口选择要接的硬件,初始化GPIO口

定义GPIO的 模式,引脚,速度 初始化GPIO结构体

打开外部中断的命令, GPIOx 引脚

定义EXTI的结构体, 

定义中断的线路, 使能中断线路,配置中断模式,配置中断触发条件 初始化中断结构体

配置NVCI的结构体,

配置中断优先级分组,选择中断通道,使能中断,配置响应优先级和抢占优先及

你可能感兴趣的:(stm32,单片机,arm)