EXTI外部中断

OLED Organic Light Emitting Diode ):有机发光二极管
OLED 显示屏:性能优异的新型显示屏,具有功耗低、相应速度快、宽视角、轻薄柔韧等特点
0.96 OLED 模块:小巧玲珑、占用接口少、简单易用,是电子设计中非常常见的显示屏模块
供电: 3~5.5V ,通信协议: I2C/SPI ,分辨率: 128*64
中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得 CPU 暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行
中断优先级:当有多个中断源同时申请中断时, CPU 会根据中断源的轻重缓急进行裁决,优先响应更加紧急的中断源
中断嵌套:当一个中断程序正在运行时,又有新的更高优先级的中断源申请中断, CPU 再次暂停当前中断程序,转而去处理新的中断程序,处理完成后依次进行返回
NVIC是STM32中用来管理中断、分配优先级的
程序中的中断函数,它的地址是由编译器来分配的,是不固定的。
但是我们的中断跳转,由于硬件的限制,只能跳到固定的地址执行程序
所以为了能让硬件跳转到一个不固定的中断函数里,就需要在内存中定义一个地址的列表,这个列表地址是固定的,中断发生后,就跳到这个固定位置,然后这个固定位置,由编译器,再加上一条跳转到中断函数的代码,这个中断地址的列表,就叫做中断向量表
NVIC---嵌套中断向量控制器,用来统一分配中断优先级和管理中断,是内核外设

 

响应优先级---相当于插队

抢占优先级---不等上一个人看完,直接让现在正在看病的客人靠边站,自己看病(中断嵌套)

优先级--值越小,优先级越高,0就是最高优先级

抢占优先级高的可以中断嵌套,响应优先级高的可以优先排队,抢占优先级和响应优先级均相同的按中断号排队

EXTI Extern Interrupt )外部中断
EXTI 可以监测指定 GPIO 口的电平信号,当其指定的 GPIO 口产生电平变化时, EXTI 将立即向 NVIC 发出中断申请,经过 NVIC 裁决后即可中断 CPU 主程序,使 CPU 执行 EXTI 对应的中断程序
支持的触发方式:上升沿 / 下降沿 / 双边沿 / 软件触发
支持的 GPIO 口:所有 GPIO 口,但相同的 Pin 不能同时触发中断
通道数: 16 GPIO_Pin ,外加 PVD 输出、 RTC 闹钟、 USB 唤醒、以太网唤醒
触发响应方式:中断响应 / 事件响应

事件响应不会触发中断,而是触发别的外设操作,属于外设之间的联合工作

外部中断有个功能,就是从低功耗模式的停止模式下唤醒STM32

对于PVD电源电压监测,当从电源从电压过低恢复时,就需要PVD借助外部中断退出停止模式

对于RTC闹钟来说,有时候为了省电,RTC定一个闹钟之后,STM32会进入停止模式,等到闹钟响的时候再唤醒,这也需要借助外部中断

 AFIO是一个数据选择器,可以在GPIO外设的16个引脚里选择其中一个连接到后面的EXTI通道里

PA0,PB0,PC0只有一个能接到EXTI0上

5~9和10~15分别分配到一个通道(同一个中断函数)

到其他外设就是事件响应

AFIO主要用于引脚复用功能的选择和重定义

STM32中,AFIO主要完成两个任务:复用功能引脚重映射、中断引脚选择

旋转编码器:用来测量位置、速度或旋转方向的装置,当其旋转轴旋转时,其输出端可以输出与旋转速度和方向对应的方波信号,读取方波信号的频率和相位信息即可得知旋转轴的速度和方向
类型:机械触点式 / 霍尔传感器式 / 光栅式

机械触点式编码器,按键的轴按下,上面两根线短路,松手,上面两根线断开,就是个普通按键

正向旋转时,B相输出是滞后90度的,反向时B相提前90度,这种相位差90度的波形就叫正交波形

内核外设要在Cortex-M3编程手册里面找

第一步:配置RCC,把涉及的相关时钟打开

第二步:配置GPIO,选择我们的端口为输入模式

 第三步:配置AFIO,选择我们用的这一路GPIO,连接到后面的EXTI

第四步:配置EXTI,选择边沿触发方式,比如上升沿、下降沿或者双边沿,还有选择触发响应方式,可以选择中断响应和事件响应

第五步:配置NVIC,给我们这个中断选择一个合适的优先级

最后:通过NVIC,外部中断信号就能进入CPU了

NVIC,EXTI都不需要开启时钟

NVIC是住在CPU里,自然不需要RCC,但EXTI是个例外了

void GPIO_AFIODeInit(void);//AFIO恢复到默认上电设置

void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//锁定GPIO设置

void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);//配置AFIO的事件输出功能
void GPIO_EventOutputCmd(FunctionalState NewState);

void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);//用来进行引脚重映射第一个引脚是选择重映射的方式,第二个是引脚的状态

void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);//配置AFIO的数据选择器,来选择我们想要的中断引脚

void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface);//跟以太网有关
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);//在中断函数里清除中断挂起标志位
//下面这两个函数只能读写与中断有关的标志位,并且对中断是否允许做出了判断
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);//用来中断分组

void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);//根据结构体初始化NVIC

void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset);//设置中断向量表

void NVIC_SystemLPConfig(uint8_t LowPowerMode, FunctionalState NewState);//系统低功耗配置

先占优先级就是抢占优先级,从占优先级就是响应优先级

分组方式整个芯片只能用一种,所以这个分组的代码整个工程只需要执行一次就行了

每次中断程序结束后,都应该清除一下中断标志位

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值