STM32-EXTI外部中断
一,中断系统
1,外部中断条件:引脚发生电频跳变,定时时间到了,串口通信接受到数据
二,STM32中断
1,EXTI外部中断、TIM定时器、ADC模数转换器、USART串口、SPI通信、12C(i方c)通信、RTC实时时钟等
三,NVIC基本结构
1,NVIC即嵌套中断向量控制器
2,在STM32中统一分配中断优先级和管理中断的
3,只有一个输出口告诉CPU处理哪个
4,同时占用多个通道,有n条线
四,NVIC优先级分组
1,抢占优先级:上一个在进行中的还没结束,直接进行
2,响应优先级:插队,上一个进行中的结束了,就进行
3,四位优先级寄存器可表示0-15的数,对应16个优先级
4,数越小,优先级越高,0的优先级最高
5,这4位可以切分,分为高n位的抢占优先级和低4-n位的响应优先级
6,抢占优先级高的可以中断嵌套,响应优先级高的可以优先排队,抢占优先级和响应优牛级均相同的按中断号排队(中断号:STM32中断向量表中的数字)
五,EXTI简介
1,上升沿:就是电平从低电平变到高电平的瞬间触发中断
2,下降沿:就是电平从高电平变到低电平的瞬间触发中断
3,双边沿:上升沿,下降沿都能触发
4,软件触发:程序中执行代码,触发中断
5,相同Pin不能同时触发中断:PA0和PB0不能同时用
6,中断响应:就是申请中断,让CPU执行中断函数
7,事件响应:当外部中断检测到引脚电平变化时,正常的流程是选择触发中断。但在STM32中,可以选择触发事件.如果选择触发事件,那外部中断的信号就不会通向CPU,而通向其他外设,触发外设操作(ADC转换,触发DMA等)
六,EXTI基本结构
1,每个GPIO有16个引脚
2,相同Pin不能同时触发中断,最终选出16个
3,四个蹭网的外设
4,接到NVIC,用来触发中断
5,外部中断的9-5和15-10分配到一个通道里,
即外部中断的9~5会触发同一个中断函数,15~10也会触发同一个中断函数
需要再根据标志位来区分到底是哪个中断进来的
6,用来触发其它外设操作,即事件响应
七,AFIO复用IO口
八,EXTI框图
常见逻辑符号:或门与门非门数据选择器(梯形):都是多个输入,一个输出
数据选择器(梯形)在侧面有选择控制端,根据控制端的数据,从输入选择一个接到输出
八,旋转编码器
1,正交波形:相位相差90度,正交波形信号输出的编码器,是可以用来测方向的
2,正向旋转时,B相输出是滞后A相90度
3,反向旋转时,B相输出是提前A相90度
4,非正交输出编码器(也可测方向)一个引脚输出方波信号代表转速,另一个输出高低电平代表旋转方向
5,
九,旋转编码器硬件
.左边为A相输出,右边为B相输出
1,默认没旋转情况下,点1上拉为高电平,通过R3输出到A端口的也是高电平
2,旋转时,2处内部触电导通,点1,被拉到GND,再通过R3输出,A端口就是低电平了
3,R3是输出限流电阻,防止模块引脚电流过大
4,C1是输出滤波电容,防止一些输出信号抖动
5,C接GND,暂时不用
十,对射式红外传感器计次
初始化函数,配置资源流程
1,配置RCC,打开时钟
2,配置GPIO,选择端口为输入模式
3,配置EXTI,
选择边沿触发方式,比如上升沿、下降沿或者双边沿
选择触发响应方式:中断响应(一般)和事件响应
4,配置NVIC,给中断选择一个合适的优先级
5,通过NVIC,外部中断信号进入CPU,CPU收到中断信号,才能跳转中断函数中执行中断程序
配置
1,GPIOA,GPIOB,AFIO都是APB2总线上外设,调用APB2开启时钟
2,EXTI(独立外设(不需配置原因不明))和NVIC(内核外设(不需要开启时钟))这两个外设的时钟一直打开,不需要我们再开启了
3,EXTI模式,参考手册
GPIO_AFIODeInit清除AFIO外设
GPIO_PinLockConfig可以锁定GPIO配置,调用这个函数,参数锁定某个引脚,配置就会锁定,防止意外更改
GPIO_PinRemapConfig可以进行引脚重映射参数(重映射方式,新的状态)
GPIO_EXTILineConfig(GPIO开头,实际操作AFIO)可以配置AFIO数据选择器,选择想要的中断引脚
GPIO_ETH_MediaInterfaceConfig,与以太网有关,该芯片没有,用不到
EXTI_DeInit 调用它,就可以把EXTI的配置都清除,恢复成上电默认的状态
EXTI_Init 调用这个函数,就可以根据这个结构体里的参数配置EXTl外设
EXTI_StructInit 调用这个函数,可以把参数传递的结构体变量赋一个默认值
EXTI_GenerateSWInterrupt 这个函数用来软件触发外部中断,调用这个函数,参数给一个指定的中断线
EXTI_GetFlagStatus 获取指定标志位是否被置1了(主程序)
EXTI_ClearFlag 对置1的标志位进行清除
(主程序)
EXTI_GetITStatus 获取中断标志位是否置1(中断函数)
EXTI_ClearITPendingBit 清除中断挂起标志位(中断函数)
十一,旋转编码器计次
1,保证正转反转都是转到位了,才执行数字加减的操作:
B相下降沿和A相低电平时,才判断为正转
A相下降沿和B相低电平时,才判断为反转
2,正转1,反转0
3,注意:int16_t Encoder_Count; //全局变量,用于计数旋转编码器的增量值
十二,中断编程建议
1,中断函数中,不要执行耗时过长的代码,中断函数要简短快速,因为中断是处理突发事情
2,不要在中断函数和主函数调用相同的函数或者操作同一个硬件
作者:nosaes