HAL库的中断执行步骤--2017-8-30
这里简单介绍一下在HAL库中的中断执行步骤
以stm32f103的uart接收中断为例。
首先,在主函数中,用户调用中断函数HAL_UART_Receive_IT(&huart2,&RxData,1)(来自HAL库中的UART外设库),在该函数中,为huart结构体赋值,包括RxData的地址等等,然后加上一个标志位,“表明”开启了中断
if(huart->State == HAL_UART_STATE_BUSY_TX) { huart->State = HAL_UART_STATE_BUSY_TX_RX; } else { huart->State = HAL_UART_STATE_BUSY_RX; }
其中HAL_UART_STATE_BUSY_RX与HAL_UART_STATE_BUSY_TX_RX是置位后的标志位,这个标志位用于后面判断主程序是否“开启”了中断(这里的“开启”表示需要开启的意思)。最后结束。
然后,当中断发生后,硬件置位相关位,程序跳转到USART2_IRQHandler(void)中断服务函数,此函数在stm32fxxx_it.c中。在中断服务函数中,仅存在一个函数HAL_UART_IRQHandler(&huart2),此函数存在于HAL库中的UART外设库。在该函数中,根据硬件的置位进行中断类型的判断,在此例中,判断为接收中断,跳转到HAL_StatusTypeDef UART_Receive_IT(UART_HandleTypeDef *huart)函数,暂时称为H函数。
在H函数中,判断中断标志位是否开启,即判断HAL_UART_STATE_BUSY_RX与HAL_UART_STATE_BUSY_TX_RX是否置位,如果置位,则继续执行中断任务。在此例中,接下来程序把接到的数一个一个发到预先指定的RxData的地址上去。发送完成后,复位那两个标志位,接收数据部分结束。紧接着的是关键的回调函数HAL_UART_RxCpltCallback(huart),这个回调函数在用户函数的主函数中,由用户自己瞎写。最后,H函数结束。