中断:有优先级和中断嵌套
中断分配:控制中断的优先级(NVIC)
中断过程:打开RCC相关的外设时钟,配置GPIO,配置中断寄存器AFIO,配置EXTI寄存器配置相关的中断触发方式,配置中断优先级
响应优先级: 优先进行排队处理(上个事件完成后,来进行处理你)
抢占优先级:优先处理,即使正在处理别的事件
抢占优先级和响应优先级进行了分组,数字越低优先级越高
引脚电平变化:触发外部中断
外部中断:所有的引脚都可以
相同pin不能触发指的是PA1和PB1不能同时触发,而PA1和PA2可以同时触发
外部中断:
对射式红外传感器 DO接一个GPIO口就行
根据DO的电平的变化来进入中断然后让计数++,再然后让oled显示屏显示数字
配置中断:AFIO寄存器的主要功能,配置中断
GPIO--> AFIO -->EXTI--> NVIC
使能时钟: GPIO使能 配置引脚,AFIO也要开启时钟 都是APB2总线 上的(打开的是GPIOB)
EXTI 和NVIC 不需要开启时钟
配置GPIO:
配置的模式 可以参考数据手册 中断配置什么模式 可以配置上拉输入,浮空输入,下拉输入;
配置 AFIO:中断线路 和GPIO在同一个库里面
第一个是引脚重映射功能 第二个函数配置AFIO选择中断引脚
配置EXTI:
第一个:初始化 第二个: 初始化结构体 第三个:结构体赋初值
和GPIO结构体一样进行赋值:
配置NVIC:打开misc文件
第一个; 指定分组 第二个: 初始化
分组 整个芯片只有一种
第一个函数:指定分组:
第二个:初始化结构体:
第三个:指定通道IRQ开启中断:得到整个工程中去找
搜索:IRQn_Type -> MD 中等密度 -> EXTI 15_10_IRQn
第四个:使能
第五个:抢占优先级 查找NVIC_Prioity_Table 找到分组的取值范围
第六个:响应优先级 查找NVIC_Prioity_Table 找到分组的取值范围
每个中断函数都有一个固定的名字: 在启动文件中
中断函数: 看是否进入中断函数:判断中断标志位 清除标志位
在中断函数进行 变量的读取
旋转按钮:正转和反转相差90,
当A相位为下降沿,B相位为第电平时正转;当B相位为下降沿,A相位为第电平时反转;
利用两个中断来判断正转还是反转
初始化时钟不用改: GPIO初始化 用或运算初始化两个引脚
EXTI 线路选择,需要两个,因为是两个通道
EXTI初始化中的引脚选择 用或运算初始化两个引脚
抢占优先级的代码需要初始化两个,通道的IRQChannel需要设置,优先级的配置也需要省略
有的是需要两个中断函数 如EXTI0和1
如果是中断的引脚为 9-5,15-10,只需要一个中断函数即可 然后并列判断标志位
旋转按钮是: 一个线路为正常的进行高点电平的跳变,而另一个线路则是根据与第一个线路的相位来进行判断的
外部中断实操总结:
打开GPIO的时钟和相关中断的时钟
定义GPIO口选择要接的硬件,初始化GPIO口
定义GPIO的 模式,引脚,速度 初始化GPIO结构体
打开外部中断的命令, GPIOx 引脚
定义EXTI的结构体,
定义中断的线路, 使能中断线路,配置中断模式,配置中断触发条件 初始化中断结构体
配置NVCI的结构体,
配置中断优先级分组,选择中断通道,使能中断,配置响应优先级和抢占优先及