STM32HAL库中断模式串口收发

一.简单了解
串口模式实现有三种
1.普通模式:在主函数中接收函数
2.中断模式:产生的不影响主程序运行
3. DMA模式:与主函数互不影响,独立运行
本文记录第二种普通模式。
学习目标是:实现中断串口的数据收发,发送数据时LED灯电平翻转。
二.步骤
在上一篇文章基础上,传送门:STM32HAL库普通模式串口收发
需在STM32CUBEMX软件中USART1的NVIC SETTING中使能中断,然后再次生成代码。
【小tips:如果在用户区域块编写代码的话不会被覆盖】
1-宏定义串口中断

#define UART1_IRQ
uint8_t TdataIRQ[]={
    
    "welcome to uart irq!\r\n"};//测试数组
uint8_t Rdata;//存放接收数据

2-同样是在stm32l4xx_hal_uart.c中1611行找到函数

HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

3-在main函数中添加如下代码

	#ifdef UART1_IRQ
		HAL_UART_Receive_IT(&huart1,&Rdata,1);//触发中断接收
		HAL_UART_Transmit_IT(&huart1,TdataIRQ,sizeof(TdataIRQ));//发送我们使用的IRQ TEST 
	#endif
	while(1)
	{
    
    
		#ifdef UART1_IRQ		
		HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
		printf("welcome to uart1 IRQ test!\r\n");
		HAL_Delay(2000);
		#endif		
	}

4-修改回调函数

//回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    
    
	#ifdef UART1_IRQ
	//把接收到的数据发送回屏幕,发送函数要在接收函数前面
	HAL_UART_Transmit(&huart1,&Rdata,1,0xff);
	HAL_UART_Receive_IT(&huart1,&Rdata,1);
	#endif
}

三.总结
1.在串口可以发现,使用串口中断实现数据的收发,是不影响while中的循环的,不影响主程序运行。
2.如果是在普通模式下使用串口,添加延时函数HAL_Delay(2000),会导致程序反应不过来。

猜你喜欢

转载自blog.csdn.net/ABCisCOOL/article/details/113977863