EXIT:是指在ARM Cortex-M系列处理器中用于管理中断控制的一种硬件模块。它负责管理和分配处理器中断的优先级和服务程序执行的顺序。
NVIC:是一种特定于STM32微控制器的外部中断控制器。它用于处理来自外部设备或引脚的中断事件,如按钮按下、外部触发器、外部输入等。
使用到的参数和函数
EXTI4_IRQn:PX4的中断
EXTI4_IRQHandler(void):中断服务函数
HAL_GPIO_EXTI_Callback:中断服务处理函数,所有的中断都会调用这个,随后根据引脚不同来分流处理。
HAL_NVIC_SetPriority(KEY0_INT_IRQn, 0, 2);:这个是中断优先级的设置
HAL_NVIC_EnableIRQ(KEY0_INT_IRQn);: 使能KEY0_INT_IRQn中断线的中断
__HAL_RCC_GPIOE_CLK_ENABLE():使能开了中断的引脚对应的GPIO
HAL_GPIO_Init();用几个引脚直接配好就开启即可。模式(中断输入)和触发沿要配好。
抢占优先级就是可以打断其他中断,比如说小明在执行打游戏的程序,爸爸在他打游戏的时候下达去楼下买烟的中断,小明刚走到门口就被妈妈叫回写作业,写完作业再去买烟,很明显妈妈的中断优先级更高可以打断爸爸的中断,执行完妈妈的中断后才可以继续执行爸爸请求的中断,这就叫抢占。数字越小抢占优先级的级别越高。
响应优先级是在抢占属性相同的情况下,当两个中断向量的抢占优先级相同时,如果两个中断同时到达, 则先处理响应优先级高的中断。注意在抢占优先级相同的情况下,高响应优先级不可以打断正在执行的低响应优先级的中断子函数。数字越小响应优先级的级别越高。
先看抢占 强的上 同强看响应(数字越小优先级越高)
注意:EXTI15_10_IRQn 、EXTI9_5_IRQn
但是使用串口就不一样了。
void uart_init(uint32_t baudrate):在这可以配置串口属性 例:波特率、字长位。。。
最后用HAL_UART_Init(&g_uart1_handle);使能。但是这些最后都要回归到引脚上
所以要去配置引脚void HAL_UART_MspInit(UART_HandleTypeDef *huart):这个函数是被上面的函数自动调用的。在这里初始化引脚、开时钟、定中断优先级、开中断、判断是否要重新定义一下中断服务函数。
串口相互调用逻辑
HAL_UART_Recive_IT:我自己把这个函数理解为使能中断。
USART1_IRQHandler(中断服务函数),在stm32f1xx_it.c文件中,串口接收到数据,产生中断时立即调用。
HAL_UART_IRQHandler(中断处理函数),串口产生中断后调用USART1_IRQHandler中断服务函数,中断服务函数调用中断处理函数,该函数用于判断产生中断的来源(收到数据还是发送数据),然后根据来源判断是调用UART_Recive_IT还是UART_Transmit_IT函数。
UART_Recive_IT(接收函数)(以收到数据产生中断为例),接收发来的数据并储存,然后调用HAL_UART_RxCpltCallBack(中断回调函数),中断回调函数用于用户自行编写产生中断后单片机的动作,记得再次开启接收函数中断,即再次调用HAL_UART_Recive_IT(中断接收函数)。
按钮中断也是一样
KEY1_INT_IRQHandler:中断服务函数
HAL_GPIO_EXTI_IRQHandler(KEY1_INT_GPIO_PIN); /* 调用中断处理公用函数 清除KEY1所在中断线 的中断标志位,中断下半部在HAL_GPIO_EXTI_Callback执行 /
__HAL_GPIO_EXTI_CLEAR_IT(KEY1_INT_GPIO_PIN); / HAL库默认先清中断再处理回调,退出时再清一次中断,避免按键抖动误触发 */
希望能帮到你!喜欢我就多多为我投票吧!