网站开发总结文档,中国企业网信息查询系统,网站点击快速排名,wdcp创建多个网站一、中断
1.1中断系统
中断系统是管理和执行中断的逻辑结构#xff1b;
1.2中断
系统在执行主程序过程中#xff0c;出现了特定的触发条件#xff08;触发源#xff09;#xff0c;系统停止执行当前程序#xff0c;转而去执行中断程序#xff0c;执行完毕后#xf…一、中断
1.1中断系统
中断系统是管理和执行中断的逻辑结构
1.2中断
系统在执行主程序过程中出现了特定的触发条件触发源系统停止执行当前程序转而去执行中断程序执行完毕后返回至暂停的地方继续执行
中断产生前会对现场进行保护中断结束后会对现场进行恢复
例如串口通信时接收到一个信息产生中断触发DMA将数据转运走
定时器定时中断触发ADC测量等
1.3中断优先级
当多个中断源同时申请中断时CPU根据中断源的轻重缓急优先执行优先级高的
1.4中断嵌套
当一个中断程序正在允许时又有新的更高优先级的中断源申请中断CPU再次暂停执行当前中断程序转而去执行新的中断程序执行完毕后依次返回 二、NVIC
2.1NVIC
在STM32中有很多可屏蔽的中断通道使用NVIC嵌套中断向量控制器统一管理每一个通道有16个编程的优先级通过对其进行分组进一步设置抢占优先级和响应优先级
2.2抢占优先级和响应优先级
在STM32中有16位的优先级寄存器通过配置其中4位设置高N位配置抢占优先级低N-4位配置响应优先级
抢占优先级可以执行中断嵌套
响应优先级可以优先排队
2.3中断向量表
中断函数执行地址是由编码器在随机分配的是不固定的
但是由于硬件的限制中断只能跳转到固定的位置为了使中断可以跳转到随机的位置定义一个地址列表列表的地址是固定的当产生中断时跳转到固定地址再有编码器和跳转到中断函数的代码就可以实现跳转到任何的位置这个地址列表就是中断向量表
中断向量表排行越低优先级越高
产生中断后自动执行中断函数
三、外部中断
EXTI是众多能产生中断的外设之一
EXTI外部中断可以监控指定引脚的电平跳变当引脚出现引脚跳变时立刻向NVIC发送中断申请经过NVIC仲裁后,CPU响应中断
EXTI可以通过上边沿下边沿全边沿软件触发程序中执行一句代码就可以实现
EXTI可以通过全部的GPIO通道外加RTC时钟USB唤醒以太网唤醒RVD触发从低功耗模式唤醒EXTI
EXTI触发响应的方式中断响应配置NVIC优先级CPU响应中断触发中断函数事件响应触发其他外设工作
四、EXTI工作流程图
外部信号通过GPIO输入至AFIOAFIO选择配置外部中断引脚后输出给EXTIEXTI通过边沿选择和控制输出给NVIC或触发其他外设工作NVIC配置优先级经过仲裁后CPU响应中断 五、AFIO
AFIO复用IO口主要用于引脚重映射和外部中断引脚选择
AFIO内部本质是一个数据选择器对输入的GPIO——pin引脚进行选择作为EXTI的外部引脚输入因为AFIO只有16个输出通道到EXTI所以相同pin引脚只能有一个可以触发
AFIO的结构图
六、EXTI结构图
经过AFIO选择后的信号输入至EXTI通过APB总线配置边沿触发选择和软件触发选择器配置触发方式上升沿下降沿全边沿软件 触发后进入或门有1则为1分为两路一路和事件屏蔽信号组成一个与门有0则0组成事件响应另一路置中断标志位并和中断屏蔽信号组成中断触发至NVIC; 使用外部中断模块的特性想要获取的信号是外部驱动的很快的突变信号
七、API实现
7.1对射式红外编码器计次
7.1.1实现的功能当红外编码器被遮挡时触发中断计数加1通过OLED显示
7.1.2思路:
底层配置EXTI中断函数计次计数值读取计次
驱动层初始化EXTIOLED显示
1.RCC开始GPIOAFIOEXTINVIC时钟EXTI和NVIC不需要开启上电后自动开启
2.初始化GPIO配置为上拉输入模式读取外部引脚信号
3.配置AFIO选择外部中断引脚,连接GPIO-AFIO-EXTI;
4.配置EXTI选择边沿触发方式触发方式连接EXTI-NVIC;
5.配置NVIC对优先级进行分组设置抢占优先级和响应优先级连接NVIC-CPU
6.配置中断函数在中断函数中执行当产生中断时候计次
7.使用OLED显示
7.1.3函数分析
void EXTI_DeInit(void);//复位EXTI
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);//结构体初始化EXTI
void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct);//初始化结构体
void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line);//软件触发
FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);//程序读取中断标志位
void EXTI_ClearFlag(uint32_t EXTI_Line);//清除中断标志位
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);//中断函数里读取中断标志位
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);//清除中断标志位
NVIC.H void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);//优先级分组
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);//初始化
void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset);//设置向量表位置和偏移量
param NVIC_VectTab指定向量表是在 RAM 还是闪存中。
void NVIC_SystemLPConfig(uint8_t LowPowerMode, FunctionalState NewState);//指定系统进入低功耗模式
void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource);//指定SysTick 时钟源7.1.4实现
1.RCC开始GPIOAFIOEXTINVIC时钟EXTI和NVIC不需要开启上电后自动开启 2.初始化GPIO配置为上拉输入模式读取外部引脚信号 3.配置AFIO选择外部中断引脚,连接GPIO-AFIO-EXTI; 4.配置EXTI选择边沿触发方式触发方式连接EXTI-NVIC; 5.配置NVIC对优先级进行分组设置抢占优先级和响应优先级连接NVIC-CPU 6.配置中断函数在中断函数中执行当产生中断时候计次
防止信号抖动可以再次判断引脚电平 7.使用OLED显示 7.2机械触点式编码器计次
在红外传感器基础上额外配置一个通道即可