文章目录
一、对外设的控制方式:轮询、中断、MDA
二、中断:可以改变任务的执行顺序
三、NVIC:中断控制器:设置分组与设置优先级
分组
分组不同,抢占优先级与响应优先级的占位不同,一般设置为组2
先看抢占,再看响应,数字越小,优先级越高。
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);//设置分组函数调用
NVIC_InitTypeDef NVICInitDef; //定义结构体变量
NVICInitDef.NVIC_IRQChannel=USART1_IRQn; //设置中断通道,在10x.h文件中寻找
NVICInitDef.NVIC_IRQChannelCmd=ENABLE; //使能中断
NVICInitDef.NVIC_IRQChannelPreemptionPriority=2; //抢占优先级(0-3)
NVICInitDef.NVIC_IRQChannelSubPriority=1; //响应优先级(0-3)
NVIC_Init(&NVICInitDef); //初始化函数调用
四、EXTI:外部中断
外设产生中断信号->交给EXTI->交给内核NVIC
STM32每个io口都可以设置为中断
EXTI结构体
EXTI 初始化结构体
typedef struct {
uint32_t EXTI_Line; // 中断事件线
EXTIMode_TypeDef EXTI_Mode; // EXTI 模式
EXTITrigger_TypeDef EXTI_Trigger; // 触发类型
FunctionalState EXTI_LineCmd; // 使能EXTI线
} EXTI_InitTypeDef;
外设中断线(在10x.h文件中)
EXTI共有0-15,16根输入线对应GPIOX_0-15
需要开启AFIO时钟。
4根输出线
EXTI线16————PVD输出
EXTI线17————RTC闹钟事件
EXTI线18————USB唤醒事件
EXTI线19————以太网唤醒事件(只适合于互相联网产品)
触发方式
有三种:具体看检测到的第一个出现的边沿信号
上升沿、下降沿、上双向沿
中断服务函数 IRQHandle(IO口输入线0-15)(在.s文件中)
五、配置流程
1.初始化中断使用的io口为输入
开启GPIO时钟: RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx,ENABLE);//打开gpiox时钟
使能外部中断时钟: RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //开AIFO时钟
gpio初始化:GPIO_Init();
2.配置中断分组,和优先级
NVIC_PriorityGroupConfig(); //分组
NVIC_Init(); //初始化。设置中断通道,使能,和优先级,中断向量在10x.h文件中
3.配置中断
使能外部中断时钟: RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //开AIFO时钟
设置GPIO与中断线的映射关系:GPIO_EXTILineConfig(); //映射中断线
初始化中断:EXTI_Init(); //设置中断模式、中断通道(10x.h文件中)、触发方式
4.编写中断服务函数
EXTIx_IRQHandler(); //在.s启动文件中
注意清楚中断标志位函数的调用
EXTI_ClearITPendingBit(); //清除中断标志位