大部分小伙伴应该和我一样是从标准库学起的stm32,在过度到hal库时常常因为网上时常过长或者讲不清楚的教程而止步,(还有真心觉得标准库挺好用的//捂脸)
我打算之后在学习的同时更新一些不那么全面,只抓重点用于让熟悉标准库的同学快速上手的hal库笔记
STM32F103
内核中断 |
外部中断 |
中断优先级 |
10 |
60 |
16 |
相关寄存器 |
位数 |
寄存器个数 |
中断使能寄存器ISER |
32 |
8 |
中断除能寄存器ICER |
32 |
8 |
应用程序中断及复位控制寄存器AIRCR |
32 |
1 |
中断优先级寄存器IPR |
8 |
240 |
NVIC工作过程
外部中断---进入nvic
aircr控制几位抢占几位响应
抢占优先级高可以打断抢占优先级低的
响应优先级越高越先
数值越小优先级越高
ipr控制中断优先级
然后依据优先级大小发送给cpu
Aircr |
Ipr(几位抢占几位响应) |
111 |
0:4 |
110 |
1:3 |
101 |
2:2 |
100 |
3:1 |
011 |
4:0 |
NVIC的使用
1,设置中断分组(aircr) |
HAL_NVIC_SetPriorityuGrouping |
2,设置中断优先级(iprx) |
HAL_NVICSetPriority |
3,使能中断(iser) |
HAL_NVICEnableIRQ |
Tips
在
例程代码:
void EXTI_Init(void)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOA_CLK_ENABLE(); //开启GPIOA时钟
__HAL_RCC_GPIOE_CLK_ENABLE(); //开启GPIOE时钟
GPIO_Initure.Pin=GPIO_PIN_0; //PA0
GPIO_Initure.Mode=GPIO_MODE_IT_RISING; //上升沿触发
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
HAL_NVIC_EnableIRQ(EXTI0_IRQn); //使能中断线0
//中断线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(EXTI4_IRQn); //使能中断线4
}
使用格式:
HAL_NVIC_SetPriority(EXTI0_IRQn,2,0);
HAL_NVIC_EnableIRQ(EXTI0_IRQn);