STM32Cube MX学习二【uart串口通信】

本文详细介绍了如何在STM32上配置串口通信,并提供了串口发送与接收的具体实现方法,包括阻塞模式及中断模式的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、cubeMX配置过程

在这里插入图片描述
本次选用的是引脚9和10进行串口的通讯因此使用的为uart1,配置如上图所示。
在这里插入图片描述
并且将自己的uart中断进行使能,对enable打勾。
在这里插入图片描述

二、代码改进

重定义printf函数
需要在usart.c文件中添以下的代码进行对stdio.h进行重定向。
首先在头部添加

#include "stdio.h"
extern UART_HandleTypeDef huart1;   //声明串口

接着添加重定向代码

/**
  * 函数功能: 重定向c库函数printf到DEBUG_USARTx
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明:无
  */
int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
  return ch;
}
 
/**
  * 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明:无
  */
int fgetc(FILE *f)
{
  uint8_t ch = 0;
  HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
  return ch;
}

1.功能函数使用方法

1、HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)阻塞发送

本次的使用过程中使用的是串口1
并且定义了一个要发送的数据的数组为 uint8_t str[]="Hello World";
在第1个参数中传入我们使用的串口的地址:&huart1
在第2个参数中传入我们要发送数据的首地址:str
在第3个参数中传入我们使用的数据的大小,通过sizeof计算:sizeof(str)
在第4个参数中传入我们设置的超时时间单位是ms,超过设置的时间,则函数返回HAL_TIMEOUT,如果设置为HAL_MAX_DELAY:这里设置为100
代码如下(示例):HAL_UART_Transmit(&huart1,str,sizeof(str),100);
之后在main函数当中的while()循环中添加此函数便能重复的对我们的数据进行在串口中的打印效果。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)阻塞接收

本次的使用过程中使用的是串口1
并且定义了一个接收数据的数据 uint8_t rxd[5];
在第1个参数中传入我们使用的串口的地址:&huart1
在第2个参数中传入我们要接收数据的首地址:rxd
在第3个参数中传入我们使用的数据的大小,通过sizeof计算:sizeof(rxd)
在第4个参数中传入我们设置的超时时间单位是ms,超过设置的时间,则函数返回HAL_TIMEOUT,如果设置为HAL_MAX_DELAY:这里设置为1000
代码如下(示例):HAL_UART_Receive(&huart1,rxd,sizeof(rxd),1000)
之后在while()函数中添加使用的函数,当接收到了数据以后,将接受到的数据直接发送出去。
在这里插入图片描述
在这里插入图片描述
注意:1、最好发送几个数据就把相应的位数设置成几
2、在发送数据的时候结尾一定要加回车

中断接收数据
1、首先要在main函数中进行定义

#define RXBUFFERSIZE 256   //最大接收的字节数
char RxBuffer[RXBUFFERSIZE];//接收数据
uint8_t aRxBuffer; //接收中断缓冲
uint8_t Uart1_cet=0;//接收缓冲区计数

2、之后在主函数中添加中断接收函数

HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer,1);//调用中断接收函数

在这里插入图片描述
3、之后添加一个相应的中断回调函数便完成了对与接收中断函数的编写

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  UNUSED(huart);
	if(Uart1_cet>=255)//对Uart_cetde的位数进行判断是否字符串数据溢出
	{
		Uart1_cet=0;
		memset(RxBuffer,0x00,sizeof(RxBuffer));
		HAL_UART_Transmit(&huart1, (uint8_t *)"数据溢出", 10,0xFFFF); 	
	}
	else
	{
		RxBuffer[Uart1_cet++] = aRxBuffer;   //接收数据转存
	
		if((RxBuffer[Uart1_cet-1] == 0x0A)&&(RxBuffer[Uart1_cet-2] == 0x0D)) //判断结束位
		{
			HAL_UART_Transmit(&huart1, (uint8_t *)&RxBuffer, Uart1_cet,0xFFFF); //将收到的信息发送出去
            while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);//检测UART发送结束
			Uart1_cet = 0;
			memset(RxBuffer,0x00,sizeof(RxBuffer)); //清空数组
		}
	}
	
	HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);   //再开启接收中断(因为里面中断只会触发一次,因此需要再次开启)
}

最终现象:当接收到数据时将触发相应的中断进行对数据的传输。

在这里插入图片描述

### 配置 UART 用于调试打印 #### 使用 STM32CubeMX 进行基本配置 为了使能并配置 UART 接口以便于调试打印,在 STM32CubeMX 工具中需完成如下操作: - 打开项目后,选择左侧的“Pinout & Configuration”标签页下的 Connectivity 节点中的 USART 或者 UART 设备。 - 设置参数如波特率、字长、停止位以及校验方式等以适应上层应用需求[^1]。 对于具体的初始化设置,通常建议采用默认选项除非有特殊要求。此外还需要确保正确指定了 RX 和 TX 引脚连接到外部硬件设备或者仿真器上的相应接口。 #### 启用中断和服务例程 当涉及到通过回调机制处理接收到的数据或是实现更复杂的通信协议时,则要启用相应的中断源,并定义服务程序来响应这些事件。这可以通过勾选 NVIC (Nested Vectored Interrupt Controller) 的对应条目轻松做到;同时也要记得在 `usart.h` 文件里声明任何自定义的回调函数原型,比如 `USER_UART_IDLECallback()` 和 `USER_UART_IRQHandler()` 函数[^3]。 #### 编写发送字符串至 UART 的辅助函数 为了让应用程序能够方便地调用串口输出信息作为日志记录或其他用途,可以编写一个简单的封装函数来进行字符数组传输。下面给出了一种基于 HAL 库的方式实现此目的的方法: ```c #include "main.h" void DebugPrint(const char* str){ while(*str != '\0'){ HAL_UART_Transmit(&huart1, (uint8_t*)str++, strlen(str), HAL_MAX_DELAY); } } ``` 请注意上述代码片段仅作为一个示范例子提供给开发者参考,实际开发过程中可能需要根据具体应用场景调整细节部分,例如使用的 huartX 变量名应该匹配 CubeMX 自动生成文件里的实例名称,而且这里假设输入的是以 null 结尾的标准C风格字符串[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值