STM32之串口通信实验

STM32串口通信实验

配置STM32CubeMX

在 Pinout&Configuration 栏目的 System Core 下,先点击 SYS,再勾选 Serial Wire 框,配置好 SWD 下载引脚设置。

配置外部时钟源

配置 PB6,PB7 为 USART1 收发引脚。

完成后生成代码

编辑代码

int main(void)
{

  /* USER CODE BEGIN 1 */
  uint8_t   Transmit_data[] = {"World_Skills_Competition\r\n"}; // 定义需要发送的字符串

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();  // HAL 库初始化

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();  // 时钟初始化

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();     // GPIO 初始化
  MX_USART1_UART_Init();  // 串口初始化
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    HAL_UART_Transmit(&huart1, Transmit_data, sizeof(Transmit_data)+1, 1000); // 发送字符串
    HAL_Delay(1000);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

编译下载后,使用TTL转USB模块连上电脑后用串口助手就可以查看发送的信息。

printf()重定向实验

对于 STM32 来说,串口是一种常用的调试手段,在程序中加入串口调试语句,可以降低程序调试的难度。

通过使用串口作为printf()函数的输出对象,使得在程序中可以用printf()来发送串口数据,就像在 PC 上用 C 语言控制台编程一样。

首先在usart.h中加入以下代码:

/* USER CODE BEGIN Includes */

#ifndef UART_PRINTF_H
#define UART_PRINTF_H

#include <stdio.h>

void UART_Printf_Init(UART_HandleTypeDef *huart);

#endif /* UART_PRINTF_H */

/* USER CODE END Includes */

然后在usart.c中添加以下代码:

/* USER CODE BEGIN 0 */

static UART_HandleTypeDef *debug_uart;  // Store UART handle

// Initialize UART for printf redirection
void UART_Printf_Init(UART_HandleTypeDef *huart)
{
    debug_uart = huart;  // Assign the UART handle
}

// Redirect printf() output to UART
int fputc(int ch, FILE *f)
{
    HAL_UART_Transmit(debug_uart, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
    return ch;
}

// Redirect scanf() input from UART (optional)
int fgetc(FILE *f)
{
    uint8_t ch = 0;
    HAL_UART_Receive(debug_uart, &ch, 1, HAL_MAX_DELAY);
    return ch;
}

/* USER CODE END 0 */

修改main函数

int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */

  UART_Printf_Init(&huart1);  // 初始化printf重定向

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {

    printf("Hello STM32\r\n");
    HAL_Delay(1000);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

点击Keil5中的这个图标

修改完成后编译下载,运行程序即可在串口助手中看到信息。