
响应优先级---相当于插队
抢占优先级---不等上一个人看完,直接让现在正在看病的客人靠边站,自己看病(中断嵌套)
优先级--值越小,优先级越高,0就是最高优先级
•抢占优先级高的可以中断嵌套,响应优先级高的可以优先排队,抢占优先级和响应优先级均相同的按中断号排队
事件响应不会触发中断,而是触发别的外设操作,属于外设之间的联合工作
外部中断有个功能,就是从低功耗模式的停止模式下唤醒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);//系统低功耗配置
先占优先级就是抢占优先级,从占优先级就是响应优先级
分组方式整个芯片只能用一种,所以这个分组的代码整个工程只需要执行一次就行了
每次中断程序结束后,都应该清除一下中断标志位