目的: 【1】开机后,向串口1发送“hello world!”。 【2】串口1收到字节指令“0xA1”,打开LED1,发送“LED1 Open!”。 【3】串口1收到字节指令“0xA2”,关闭LED1,发送“LED1 Closed!”。 【4】在串口发送过程中,打开LED0作为发送数据指示灯。
串口也是单片机的内部资源,所以并不需要外接。本次实验只用到了一个串口,USART1_TX与PA9复用,USART1_RX与PA10复用。只需要用到两个led作为指示灯。
串口发送 串口接收STM32CUBEMX配置: 1.串口配置+中断使能
串口配置 中断使能代码编写: 1.宏定义led亮灭+定义字符串:
/* USER CODE BEGIN Includes */ #define LED0_ON() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET)//LED0点亮 #define LED0_OFF() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET)//LED0熄灭 #define LED1_ON() HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_RESET)//LED1点亮 #define LED1_OFF() HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_SET)//LED1熄灭 uint8_t Tx_str1[] = "hello world!\r\n"; uint8_t Tx_str2[] = "LED1 Open!\r\n"; uint8_t Tx_str3[] = "LED1 Closed!\r\n"; uint8_t Rx_dat = 0; /* USER CODE END Includes */2.串口发送功能(阻塞式)
/* USER CODE BEGIN 2 */ HAL_UART_Transmit(&huart1,Tx_str1,sizeof(Tx_str1),10000); //向上位机发送“hello world!” HAL_UART_Receive_IT(&huart1,&Rx_dat,1); //接收数据 /* USER CODE END 2 */3.串口接收功能(非阻塞式) 编写回调函数
/* USER CODE BEGIN PTD */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART1) { if(Rx_dat == 0xa1) { HAL_UART_Transmit(&huart1,Tx_str2,sizeof(Tx_str2),10000); huart1.RxState = HAL_UART_STATE_READY; __HAL_UART_FLUSH_DRREGISTER(&huart1);//这两句如果不加就只能接收到一次 HAL_UART_Receive_IT(&huart1,&Rx_dat,1);//这两句如果不加就只能接收到一次 } else if(Rx_dat == 0xa2) { HAL_UART_Transmit(&huart1,Tx_str3,sizeof(Tx_str3),10000); huart1.RxState = HAL_UART_STATE_READY;//这两句如果不加就只能接收到一次 __HAL_UART_FLUSH_DRREGISTER(&huart1);//这两句如果不加就只能接收到一次 HAL_UART_Receive_IT(&huart1,&Rx_dat,1); } } } /* USER CODE END PTD */