STM32的串口通信——HAL库

TTL串口

TTL串口仅仅需要两根数据线就可以进行串口通信:

①一条是从A设备发送的IO口连接到B设备的接收IO口

②一条是从B设备发送的IO口连接到A设备的接收IO口

③共地(GND)是两个设备通信的前提(保证他们的电平标准一致)

操作步骤:

①新建文件——命名为serial

②找到USART2,将串口模式改为TTL模式——即Asynchronous(异步模式)

③配置小灯的GPIO口:

④生成代码后:我们可以看到初始化串口的函数

编写代码:

因为我们在串口发送的时候需要发送字符,因此我们要加上头文件:

代码:

 MX_GPIO_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */
  //char message[]="Hello World!";
  uint8_t receiveData[2];

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  //HAL_UART_Transmit(&huart2, (uint8_t*)message, strlen(message), 100);
	  //HAL_Delay(1000);
	  HAL_UART_Receive(&huart2, receiveData, 2, HAL_MAX_DELAY);
	  HAL_UART_Transmit(&huart2, receiveData, 2, 100);
	  GPIO_PinState state =GPIO_PIN_SET;
	  if(receiveData[1]=='0')
	  {
		  state = GPIO_PIN_RESET;
	  }
	  else if(receiveData[1]=='1')
	  {
		  state = GPIO_PIN_SET;
	  }
	  if(receiveData[0]=='R')
	  {
          HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, state);
	  }
	  else if(receiveData[0]=='G')
	  {
          HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, state);
	  }
	  else if(receiveData[0]=='B')
	  {
          HAL_GPIO_WritePin(LED_BLUE_GPIO_Port, LED_BLUE_Pin, state);
	  }
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

 定义串口接收缓冲区,数组大小为2

// 串口接收缓冲区
uint8_t rx_data[2];

代码详解:

1. while (1)
这是一个无限循环,代码会一直在这个循环内运行。常用于嵌入式系统中,确保程序不断执行。

2. HAL_UART_Receive(&huart2, receiveData, 2, HAL_MAX_DELAY);
该行代码通过UART接收2个字节的数据,将其存储到 `receiveData` 缓冲区中。
HAL_MAX_DELAY表示函数将一直阻塞,直到接收到2个字节的数据。

3. HAL_UART_Transmit(&huart2, receiveData, 2, 100);
该行代码将接收到的数据通过UART原样发送回去,用于回显

4. GPIO_PinState state = GPIO_PIN_SET;
这里定义了一个 `GPIO_PinState` 类型的变量 `state`,初始值为 `GPIO_PIN_SET`(高电平)。

5. if(receiveData[1]=='0')
该行代码检查 `receiveData[1]` 是否等于字符 '0'。如果是,将 `state` 设置为 `GPIO_PIN_RESET`,即低电平。这表示如果接收到的第二个字节是 `'0'`,LED灯将被关闭。

6. else if(receiveData[1]=='1')
该行代码检查 `receiveData[1]` 是否等于字符 '1'。如果是,将 `state` 设置为 `GPIO_PIN_SET`,即高电平。这表示如果接收到的第二个字节是 '1',LED灯将被打开。

7. if(receiveData[0]=='R')
该行代码检查 receiveData[0]是否为字符 'R',如果是,表示控制红色LED灯。
HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, state);`根据前面设置的 `state` 值,控制红色LED引脚的状态(高电平点亮,低电平熄灭)。

调试:

使用B站UP主keysking写的波特律动 串口助手

网址:

波特律动 串口助手 (baud-dance.com)

编写时遇到的问题:

芯片自锁:STlink烧录一次后就无法在进行烧录,这种情况一般为芯片自锁

解决方法详细参考这篇文章:

STlink烧录一次后就无法在进行烧录解决办法_stm32烧录一次后便无法烧录-CSDN博客

与此同时:在问题解决之后,我们最好是把SYS中Debug配置为Serial Wire

STM32串口HAL库是一个用于驱动STM32系列微控制器上串口功能的库。它提供了一系列的API函数,使得开发者可以方便地配置和使用串口功能。 使用STM32串口HAL库,你可以通过以下步骤来配置和初始化串口: 1. 初始化串口的GPIO引脚,将其配置为对应的串口功能。 2. 使用`HAL_UART_Init()`函数初始化串口的相关参数,例如波特率、数据位、校验位和停止位等。 3. 使用`HAL_UART_Receive()`函数接收数据,或使用`HAL_UART_Transmit()`函数发送数据。 以下是一个简单的示例代码,展示了如何使用STM32串口HAL库来发送一串字符: ```c #include "stm32f4xx_hal.h" UART_HandleTypeDef huart2; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_USART2_UART_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART2_UART_Init(); char msg[] = "Hello, World!"; HAL_UART_Transmit(&huart2, (uint8_t*)msg, sizeof(msg), HAL_MAX_DELAY); while (1) { } } void SystemClock_Config(void) { // 系统时钟初始化 } static void MX_GPIO_Init(void) { // GPIO引脚初始化,配置为USART2的功能 } static void MX_USART2_UART_Init(void) { huart2.Instance = USART2; huart2.Init.BaudRate = 115200; huart2.Init.WordLength = UART_WORDLENGTH_8B; huart2.Init.StopBits = UART_STOPBITS_1; huart2.Init.Parity = UART_PARITY_NONE; huart2.Init.Mode = UART_MODE_TX_RX; huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; HAL_UART_Init(&huart2); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

庆庆知识库

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

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

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

打赏作者

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

抵扣说明:

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

余额充值