STM32-HAL库02-USART串口通信

本文介绍了STM32-HAL库的USART串口通信,包括所用材料如STM32F103C8T6单片机、STM32CUBEMX和MDK5软件等。详细说明了实现电脑与STM32串口通信的步骤,从新建CUBEMX工程到程序编写,还推荐了免费的串口调试工具vofa+。

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

STM32-HAL库02-USART串口通信

所用材料:

STM32F103C8T6(单片机);
STM32CUBEMX(软件);
MDK5(软件);
XCOM v2.0(串口助手);

本节内容:

实现电脑与STM32的串口通信,包括串口发送与中断接收。

第一步:新建CUBEMX工程

  1. 选择MCU-F103C8
    F103C8T6最小版

第二步:USART串口配置

  1. 选择USART1
  2. MODE选择:异步通信Asynchronous
  3. Parameter Settings(参数设定)全部默认
  4. 比特率:115200
  5. NVIC Setting中勾选串口中断
    在这里插入图片描述
    在这里插入图片描述

第三步:SYS设置

将DEBUG选线设置为Serial Wire
在这里插入图片描述

第四步:RCC设置

选择高速外部时钟
在这里插入图片描述

第五步:时钟树设置

对照图片设置即可
在这里插入图片描述

第六步:文件设置

在这里插入图片描述
在这里插入图片描述

第七步:程序编写

  1. 打开MDK5
  2. 烧录程序设置:魔术棒-DEBUG(选择STlink)-Settings-Flash Download-勾选Reset and run
    在这里插入图片描述
  3. 在usart.c中将printf重定向
    usart.c中添加一下程序:
#include "stdio.h"
int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);//HAL库串口发送函数
  return ch;
}

int fgetc(FILE *f)
{
  uint8_t ch = 0;
  HAL_UART_Receive(&huart1, &ch, 1, 0xffff);//HAL库串口接收函数
  return ch;
}

魔术棒中勾选Use MicroLIB
在这里插入图片描述

  1. 实现串口发送
    通过重定义后的printf函数实现串口信息的发送。
  while (1)
  {
    /* USER CODE END WHILE */
	  printf("Open ready\n");
	  HAL_Delay(1000);
    /* USER CODE BEGIN 3 */
  }

在这里插入图片描述
5. 实现串口中断接收
先设定单字节接收缓冲,数组接收缓冲与接收计数

uint16_t rx_bit;          //单字节接收缓冲
uint16_t rx_data[256];    //数组接收缓冲
uint8_t rx_cnt=0;         //接收计数

再在主函数中,while(1)之前调用一次接收中断开启函数

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART1_UART_Init();
	
  /* USER CODE BEGIN 2 */
  printf("Open ready\r\n");
  HAL_UART_Receive_IT(&huart1, (uint8_t *)&rx_bit, 1);//接收中断开启函数
  /* USER CODE END 2 */

  /* USER CODE BEGIN WHILE */
  while (1)
  {
	 
    /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

最后在main.c中,主函数以外的地方编写中断回调函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	rx_data[rx_cnt] = rx_bit;
	rx_cnt=rx_cnt+1;
	if (rx_data[rx_cnt-1] == 0x0A  && rx_data[rx_cnt-2] == 0x0D)
	{
		printf("接收到的数据为:\r\n");
		HAL_UART_Transmit(&huart1, (uint8_t *)&rx_data, sizeof(rx_data),0xFFFF); 
		printf("\r\n");
		rx_cnt =0;
		memset(rx_data,0x00,sizeof(rx_data));
	}

	 HAL_UART_Receive_IT(&huart1, (uint8_t *)&rx_bit, 1);
}

在这里插入图片描述

强烈推荐一个免费好用的串口调试工具vofa+

下载网址如下 : https://www.vofa.plus/

您好!关于STM32USART串口通信,您可以使用HAL来实现。HAL提供了一系列的函数,可以方便地进行串口的初始化、发送和接收操作。 首先,您需要在CubeMX中配置串口相关的引脚和参数。然后在代码中包含相应的头文件,例如"stm32f4xx_hal.h"。 接下来,您可以使用HAL_UART_Init函数初始化串口,并设置波特率、数据位、停止位等参数。例如,以下代码将USART1初始化为波特率为9600,数据位为8位,无校验位,停止位为1位: ```c UART_HandleTypeDef huart1; void USART1_Init(void) { huart1.Instance = USART1; huart1.Init.BaudRate = 9600; 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; HAL_UART_Init(&huart1); } ``` 然后,您可以使用HAL_UART_Transmit函数发送数据。例如,以下代码将发送一个字节的数据到USART1: ```c uint8_t data = 0x55; HAL_UART_Transmit(&huart1, &data, 1, HAL_MAX_DELAY); ``` 最后,您可以使用HAL_UART_Receive函数接收数据。例如,以下代码将接收USART1收到的数据,并存储到一个缓冲区中: ```c uint8_t buffer[10]; HAL_UART_Receive(&huart1, buffer, 10, HAL_MAX_DELAY); ``` 这样,您就可以通过HAL来实现USART串口通信了。当然,还有其他更多的函数和功能可以使用,您可以参考HAL的文档或示例代码进行更详细的了解和使用。希望对您有帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tony0925

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值