一、串口配置
- 管脚以及参数配置
![]()
- 使能串口中断
![]()
配置完成并保存后,点击【GENERATE CODE】重新生成代码。
二、串口发送
串口发送调用HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)函数即可。
- 定义一个存放串口数据发送的缓冲区:
【注】自定义添加的代码请放置于/* xx CODE BEGIN xx */与/* xx CODE END xx */之间,以免在STM32CubeMX重新生成代码时被覆盖掉。
- /* USER CODE BEGIN 0 */
- uint8_t tx_buff[]="Welcome to 羽墨志n";
- /* USER CODE END 0 */
- 串口数据发送
在while循环中添加如下代码:
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_UART_Transmit(&huart1,aTxBuffer,sizeof(tx_buff)-1,0xffff);
HAL_Delay(1000);
}
/* USER CODE END 3 */
编译下载后,可以看到每隔一秒钟收到一次数据:
三、串口接收
- 定义串口数据接收缓冲区
- /* USER CODE BEGIN 0 /
- uint8_t tx_buff[]="Welcome to 羽墨志n"; // 串口数据发送缓冲区
- uint8_t rx_buffer; // 串口数据接收缓冲区
- / USER CODE END 0 */
- 使能串口中断
在main()的初始化部分添加串口中断使能函数:
- /* USER CODE BEGIN 2 */
- HAL_UART_Receive_IT(&huart1,(uint8_t *)&rx_buffer,1); //使能接收中断
- /* USER CODE END 2 */
- 重写串口中断服务函数
- /**
- * @brief Rewrite callback function for USART1
- * @retval None
- */
- void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
- {
- if(huart->Instance == USART1)//判断串口号
- {
- HAL_UART_Transmit(&huart1,&rx_buffer,1,100); // 将接收到的数据再通过串口发送出去
- HAL_UART_Receive_IT(&huart1, (uint8_t *)&rx_buffer, 1); //重新使能接收中断
- }
- }
- 每次串口接收数据时会自动关闭串口中断,因此在中断回调函数中需要再次使能串口接收中断,一边等待下一次数据接收中断。
![]()
四、串口重定向
- 添加标准库头文件
在usart.h文件中添加标准库头文件stdio.h:
- /* USER CODE BEGIN Includes */
- #include
- /* USER CODE END Includes */
- 添加重定义函数
在usart.h文件中添加相关的重定向函数:
- /* USER CODE BEGIN 1 */
- int fputc(int ch, FILE *fp)
- {
- HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
- return ch;
- }
-
- int fgetc(FILE *fp)
- {
- uint8_t ch = 0;
- HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
- return ch;
- }
- /* USER CODE END 1 */
- 添加函数声明
在usart.h文件中添加相关的函数声明:
- /* USER CODE BEGIN Prototypes */
- int fputc(int ch, FILE *f);
- int fgetc(FILE *f);
- /* USER CODE END Prototypes */
- 测试
下main函数的while(1)循环中添加如下代码:
- /* Infinite loop */
- /* USER CODE BEGIN WHILE */
- while (1)
- {
- /* USER CODE END WHILE */
- /* USER CODE BEGIN 3 */
- printf("Hi,yomo!n");
- HAL_Delay(1000);
- }
- /* USER CODE END 3 */
- 编译下载后就可以在串口看到一秒打印一次的串口数据了。
![]()
|
|
2021-12-7 15:43:44
评论
举报
|
|
|