本帖最后由 sujingliang 于 2025-7-14 15:11 编辑
本文实现UART串口通讯
一、UART配置
1、STM32CuteMX中新建工程
在选择bsp时将VCOM取消勾选
VCOM使用了USART1,这里要自己配置USART1串口收发,因此要取消VCOM 板级驱动
2、USART1配置
mode:异步
3、中断设置
勾选中断
NVIC中设置USART1中断优先级为12
4、DMA使能
增加一个DMA用于USART RX接收
外设到内存,外设地址不变,内存递增
生成工程
二、软件部分
1、printf重定向
勾选微库
#include <stdio.h>
增加
- #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
- PUTCHAR_PROTOTYPE
- {
- HAL_UART_Transmit(&huart1, (uint8_t *) &ch, 1, HAL_MAX_DELAY);
- return ch;
- }
2、全局变量定义
//发送标志,是否允许每1秒中发送1次缺省信息。
uint8_t tx_info_flag=1;
//接收缓存区,接收标志,接收长度
#define RX_BUF_SIZE 256
uint8_t rx_buf[RX_BUF_SIZE];
volatile uint8_t rx_flag = 0;
uint16_t rx_len = 0;
3、接收中断使能
USART1(static void MX_USART1_UART_Init(void))初始化中增加
- /* USER CODE BEGIN USART1_Init 2 */
- __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
- HAL_UARTEx_ReceiveToIdle_DMA(&huart1, rx_buf, RX_BUF_SIZE);
- /* USER CODE END USART1_Init 2 */
增加idle中断
4、中断处理函数
- void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
- {
- if(huart->Instance == USART1)
- {
- rx_len = Size;
- rx_flag = 1;
-
- // 需要重新启动接收
- HAL_UARTEx_ReceiveToIdle_DMA(huart, rx_buf, RX_BUF_SIZE);
- }
- }
5、main函数while(1)中
- while (1)
- {
- if(tx_info_flag)
- {
- printf("Hello 21ic, Hello NUCLEO-U385RG-Q!\r\n");
- printf("CMD: txstop:stop tx ; txstart:start tx\r\n");
- }
-
- if(rx_flag)
- {
- rx_flag = 0;
- HAL_UART_Transmit(&huart1, rx_buf, rx_len, HAL_MAX_DELAY);
- if(strstr((char*)rx_buf,"txstop")) tx_info_flag=0;
- if(strstr((char*)rx_buf,"txstart")) tx_info_flag=1;
-
- memset(rx_buf, 0, RX_BUF_SIZE);
- rx_len = 0;
- }
-
- HAL_Delay(1000);
每隔1秒打印“Hello 21ic, Hello NUCLEO-U385RG-Q!\r\n”和提示信息
如果接收到txstop,则停止打印默认信息,如果接收到txstart,则继续打印默认信息
三、运行
源码已上传:https://gitee.com/sujingliang/stm32u385
|