目的:
【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 */