STM32学习笔记整理之(2)——外部中断
2022-06-16 来源:eefocus
学习STM32也快一年了,现在工作的内容跟用的是STM32平台的,趁着年前工作量比较小,总结一下STM32的基础知识,不出意外的话将会连续发布完整的笔记整理,学习的时候主要是跟着野火教程学的,然后在整理出适合自己的笔记。
2.1 NVIC配置
1、中断分组
在配置优先级的时候,NVIC 只可以配置 16 种中断向量的优先级,抢占优先级和响应优先级的数量由一个 4 位的数字来决定,把这个 4 位数字的位数分配成抢占优先级部分和响应优先级部分。
有 5 组分配方式:
第0组:所有4位用来配置响应优先级。
第1组:最高1位配抢占优先级,低3位配响应优先级。2^1=2 种抢占优先级(0,1),2^3=8 种响应优先级,
第2组:2位配抢占优先级,2位配响应优先级。4种抢占优先级,4种响应优先级。
第3组:高3位配抢占优先级,1位配响应优先级。8 种抢占优先级,2种响应优先级。
第4组:所有4位配抢占优先级,16 种中断向量都是抢占属性,没有响应属性。
2、中断优先级
1、STM32中断向量有抢占属性和响应属性,编号越小,级别越高。
2、抢占,是指打断其他中断的属性,即因为具有这个属性会出现嵌套中断
3、响应,当两个中断向量的抢占优先级相同时,如两个中断同时到达,则先处理响应优先级高的中断
3、中断通道
中断服务函数的名字必须要与启动文件startup_stm32f10x_hd.s 中的中断向量表定义一致(以下是相对应的表)
中断通道 中断服务函数 中断线路 中断引脚
EXTI0_IRQn EXTI0_IRQHandler ; EXTI Line 0 PA0~PG0
EXTI1_IRQn EXTI1_IRQHandler; EXTI Line 1 PA1~PG1
EXTI2_IRQn EXTI2_IRQHandler ; EXTI Line 2 PA2~PG2
EXTI3_IRQn EXTI3_IRQHandler ; EXTI Line 3 PA3~PG3
EXTI4_IRQn EXTI4_IRQHandler ; EXTI Line 4 PA4~PG4
EXTI9_5_IRQn EXTI9_5_IRQHandler ; EXTI Line 9..5
EXTI15_10_IRQn EXTI15_10_IRQHandler ; EXTI Line 15..10
4、代码
static void NVIC_A11exti_inti(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //选择中断分组1
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //选择中断通道0
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//抢占式中断优先级设置
NVIC_InitStructure.NVIC_IRQChannelSubPriority =0; //响应式中断优先级设置
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断
NVIC_Init(&NVIC_InitStructure);
}
2.1 外部中断配置
1、使能 EXTIx 线的时钟和第二功能 AFIO 时钟
2、配置 EXTIx 线的中断优先级(NVIC)
3、配置GPIO引脚
4、配置为 EXTI模式和中断线路
void EXTI_PA0_inti(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO宏操作的结构体
EXTI_InitTypeDef EXTI_InitStructure;//定义EXTI宏操作的结构体
EXTI_ClearITPendingBit(EXTI_Line0);//清空中断标志
/*config the exitline clock and AFIO clock*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);//使能GPIO时钟
/*config the NVIC*/
NVIC_A11exti_inti();//配置中断
/*EXTI line gpio config*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //选定引脚号
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//上拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure);//配置输出
/*EXYI line mode config*/
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);//选择中断引脚
EXTI_InitStructure.EXTI_Line = EXTI_Line0;//选择中断线路0
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//设置为中断请求,非事件请求
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿中断
EXTI_InitStructure.EXTI_LineCmd = ENABLE;//外部中断使能
EXTI_Init(&EXTI_InitStructure);
}
2.1 服务函数
void EXTI0_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line0) != RESET)
{
//uart_sendStr(USART1,'q ');
EXTI_ClearITPendingBit(EXTI_Line0);
}
}