STM32 HAL库 UART串口发送数据实验

一、实验目标

通过STM32的UART串口发送字符串数据到PC端串口调试助手,验证通信功能。


二、硬件准备

  1. 主控芯片:STM32F103C8T6。

  2. 串口模块:USB转TTL模块。

  3. 接线说明

  • STM32的USART1_TX(PA9) → USB-TTL模块的RX。
  • STM32的USART1_RX(PA10) → USB-TTL模块的TX。
  • STM32的GND → USB-TTL模块的GND。
  • 开发板供电:USB或3.3V电源。


三、软件配置(STM32CubeMX)

1. 新建工程

  • 打开STM32CubeMX,选择芯片型号STM32F103C8T6。

  • 配置系统时钟

2. 配置UART

  1. 启用USART1

  • 左侧引脚图找到USART1,模式选择 Asynchronous(异步通信)。

模式参数清单

  • 自动分配引脚PA9(TX)和PA10(RX)。

  • 参数设置:

  • 生成代码


四、代码实现

发送数据函数

main()中添加发送代码:

	uint8_t Number = 0x5a;
	uint8_t Array[] = {1,2,3,4,5};
	char ch = 'a';
	char *str = "Hello World";
	
	
	HAL_UART_Transmit(&huart1,&Number,1,HAL_MAX_DELAY);
	HAL_UART_Transmit(&huart1,Array,5,HAL_MAX_DELAY);
	HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,HAL_MAX_DELAY);
	HAL_UART_Transmit(&huart1,(uint8_t*)&str,strlen(str),HAL_MAX_DELAY);

五、代码烧录与验证

1. 烧录程序

  • 使用ST-Link或J-Link工具将代码烧录到STM32。

2. 串口调试助手设置

  1. 打开PC端串口调试工具。

  2. 选择正确的COM口。

  3. 设置参数:波特率 115200,8数据位,无校验,1停止位。

3. 实验结果

  • 按下复位键后调试器接收区显示如下数据。


六、关键代码解析

HAL_UART_Transmit函数

HAL_UART_Transmit 是 STM32 HAL 库中用于通过 UART(通用异步收发器)发送数据的核心函数。它以阻塞(同步)方式工作,即函数会等待数据发送完成或超时后才返回。

HAL_StatusTypeDef HAL_UART_Transmit(
  UART_HandleTypeDef *huart,  // UART 外设句柄
  uint8_t *pData,             // 待发送数据的缓冲区指针
  uint16_t Size,              // 待发送数据的字节数
  uint32_t Timeout            // 超时时间(单位:毫秒)
);

参数解析

参数类型说明
huartUART_HandleTypeDef*指向 UART 配置结构体的指针(如 &huart1),包含波特率、数据位等配置信息。
pDatauint8_t*待发送数据的缓冲区首地址。需确保数据在发送期间有效(如全局变量或静态数组)。
Sizeuint16_t发送数据的字节数。若为 0,函数直接返回 HAL_ERROR
Timeoutuint32_t超时时间(毫秒)。若超时前未完成发送,函数返回 HAL_TIMEOUT

返回值

返回值为 HAL_StatusTypeDef 枚举类型:

  • HAL_OK : 数据发送成功。

  • HAL_ERROR : 参数错误(如 huart 未初始化或 Size=0)。

  • HAL_BUSY : UART 正忙(如上一次传输未完成)。

  • HAL_TIMEOUT : 发送超时(未在指定时间内完成)。


七、常见问题排查

  1. 无数据接收

    • 检查接线(TX/RX是否交叉连接)。

    • 确认波特率一致(STM32与PC端均为115200)。

    • 检查USB-TTL模块驱动是否安装。

  2. 代码未执行

    • 确认烧录时复位模式正确(如NRST引脚接复位按钮)。

解决STM32H7 HAL串口DMA发送丢失部分数据问题,可从以下几方面着手: ### 确保DMA传输完成 在使用RS485等通信时,若DMA未传输完成就进行状态切换,易导致数据丢失。可利用DMA中断完成来确保状态切换时机,等待DMA传输完成再进行状态切换。示例代码如下: ```c // 等待DMA传输完成,否则数据较长的话丢数据 while(uart2_dma_tx_complete != 1){}; uart2_dma_tx_complete=0; ``` ### 正确配置DMA参数 DMA的内存地址、传输数量等配置不正确,可能导致数据没有完整传输。要正确配置DMA的相关参数,以下是一个启动DMA发送串口数据的示例代码: ```c void uart_send(uint8_t *pbuf, uint16_t len){ if(len==0) return; GPIO_BOP(GPIOA) = GPIO_PIN_1; //485使能发送 HAL_DMA_Abort(&hdma_usart1_tx); HAL_UART_Transmit_DMA(&huart1, pbuf, len); } ``` ### 处理好中断程序 在开启了DMA发送完成中断和USART空闲中断等情况下,中断处理程序编写不当,可能会影响数据的正常传输。需仔细检查中断服务程序,确保标志位判断和状态切换等操作正确。例如在DMA发送完成中断服务程序中判断到有DMA发送完成标志置位时,再进行相应操作,如将RS485再次切换为接收模式。 ### 注意内存使用 因为STM32H7的DMA不支持RAM1,所以要启用RAM2,数组前加 `__attribute__((section(".RAM_D2")))`,在Keil中打开 [^3]。 ### 检查串口和DMA初始化 确保串口和DMA的初始化配置正确,包括波特率、数据位、停止位、DMA通道等。以下是一个简单的初始化示例: ```c /* 串口初始化 */ void MX_USART1_UART_Init(void) { huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Handler(); } } /* DMA初始化 */ void MX_DMA_Init(void) { /* DMA controller clock enable */ __HAL_RCC_DMA1_CLK_ENABLE(); /* DMA interrupt init */ /* DMA1_Stream6_IRQn interrupt configuration */ HAL_NVIC_SetPriority(DMA1_Stream6_IRQn, 0, 0); HAL_NVIC_EnableIRQ(DMA1_Stream6_IRQn); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值