过程概览:
Gpio(外部中断信号)-->AFIO(设置映射关系)-->EXTI(设置如何触发和是否打开)-->NVIC(管理优先级)
F1拥有20根中断线
分别有gpio ,pvd,rtoc,usb otg fs…
常用中断寄存器
中断屏蔽寄存器 | EXTI_IMR |
请求挂起寄存器 | EXTI_PR |
上升沿触发寄存器 | EXTI_RTSR |
下降沿触发寄存器 | EXTI_FTSR |
1,上升沿触发选择寄存器(EXTI_RTSR)
寄存器大小为32位,其中0~18可用,其余保留(19位为互联型产品专用)
2,下降沿触发
中断屏蔽和挂起
EXTI中断线0~15如何分配到gpio端口?
使用AFIO——EXTICR的1~4
(需要开启AFIO的时钟:__HAL_RCC_AFIO_CLK_ENABLE();)
使用方法:
Eg:exti0只能对应0号端口AFIO只决定端口分类比如P"a",p"b"
0000 | A |
0001 | B |
0010 | C |
0011 | D |
0100 | E |
0101 | F |
0110 | g |
AFIO_EXTICR一共有四组:AFIO_EXTICR1,AFIO_EXTICR2,AFIO_EXTICR3,AFIO_EXTICR4
分别对应exti0~3,exti4~7………
exti应用传统配置步骤
HAL库配置过程
1,使能gpio时钟 | _HAL_RCC_GPIOx_CLK-ENABLE |
2,GPIO/AFIO/EXTI | HAL_GPIO_Init |
3,中断分组 | HAL_NVIC_SetPriorityGrouping |
4,中断优先级 | HAL_NVIC_SetPriority |
5,中断使能 | HAL_NVIC_EnableIRQ |
6,中断服务函数 | EXTIx_IRQHandler |
HAL_GPIO_Init内容设置
例程代码:
void EXTI_Init(void)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOA_CLK_ENABLE(); //开启GPIOA时钟 STEP1
__HAL_RCC_GPIOE_CLK_ENABLE(); //开启GPIOE时钟
GPIO_Initure.Pin=GPIO_PIN_0; //PA0
GPIO_Initure.Mode=GPIO_MODE_IT_RISING; //上升沿触发 STEP2
GPIO_Initure.Pull=GPIO_PULLDOWN;
HAL_GPIO_Init(GPIOA,&GPIO_Initure);
GPIO_Initure.Pin=GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4; //PE2,3,4
GPIO_Initure.Mode=GPIO_MODE_IT_FALLING; //下降沿触发
GPIO_Initure.Pull=GPIO_PULLUP;
HAL_GPIO_Init(GPIOE,&GPIO_Initure);
//中断线0-PA0
HAL_NVIC_SetPriority(EXTI0_IRQn,2,0); //抢占优先级为2,子优先级为0 STEP4
HAL_NVIC_EnableIRQ(EXTI0_IRQn); //使能中断线0 STEP5
//中断线2-PE2
HAL_NVIC_SetPriority(EXTI2_IRQn,2,1); //抢占优先级为2,子优先级为1
HAL_NVIC_EnableIRQ(EXTI2_IRQn); //使能中断线2
//中断线3-PE3
HAL_NVIC_SetPriority(EXTI3_IRQn,2,2); //抢占优先级为2,子优先级为2
HAL_NVIC_EnableIRQ(EXTI3_IRQn); //使能中断线2
//中断线4-PE4
HAL_NVIC_SetPriority(EXTI4_IRQn,2,3); //抢占优先级为2,子优先级为3
HAL_NVIC_EnableIRQ
//中断服务函数
void EXTI0_IRQHandler(void)//STEP6
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); //调用中断处理公用函数
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) //调用公用函数之后,定义此回调函数进行用户代码的编写
{
/*用户代码位置*/ ;
}