今天尝试使用HAL库的串口中断,发现使用HAL库默认的中断服务函数异常的复杂和艰辛,只能进入一次中断而且会发生各种状况。所以尝试不用默认HAL库的中断服务函数编写方式。
- 配置好串口,使能中断
- 使用以下语句开启接受或发送中断
HAL_UART_Receive_IT(&huart1, Rxdata, 1);//接受数据中断
HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)//传输数据中断
其中第一个参数是初始化串口时的通过结构体配置的变量地址,可自行修改。第二个参数是接受或发送缓存器,可自定 义数组。第三个参数是接受或发送几个字节而产生中断。
- 通过启动文件:starup_stm32f103xe.s找到相应的串口中断函数
USART1_IRQHandler
,通过寻找定义找到HAL库的中断服务函数并注释掉HAL_UART_IRQHandler(&huart1)
。通过函数__HAL_UART_GET_FLAG()
来判断相应的标志位是否为1。其中第一个参数为初始化串口时的通过结构体配置的变量地址,第二个参数为相应标志位,具体可查阅库函数里的注释。这里给出接受数据产生中断而挂起的标志位判断if((__HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE)!=0))
。之后便可以通过DR寄存器来查看接受的数据:USART1->DR
编写中断服务函数。