【STM32CubeMX】 串口通信(USART) Printf重定向

【STM32CubeMx】 串口通信(USART)Printf重定向

  • 1.STM32CubeMX设置
  • 2.重定向Printf 及 Scanf
  • 3.调试
  • 4.关于实现串口收发的几种方式
  • 5.参考资料


  • STM32CubeMX: Version 4.26.1
  • MDK-ARM: Version 5.24.2
  • 开发板: 中移onenet 麒麟座MINI板
  • 芯片: STM32F103CBT6

1.STM32CubeMX设置

  • 设置外部时钟源
    【STM32CubeMX】 串口通信(USART) Printf重定向_第1张图片

  • 设置Debug
    设置Debug

  • 设置串口 使用USART1 PA9,PA10
    设置串口

  • 设置时钟频率
    在这里插入图片描述
    【STM32CubeMX】 串口通信(USART) Printf重定向_第2张图片

  • 设置USART1详细参数
    【STM32CubeMX】 串口通信(USART) Printf重定向_第3张图片

  • 生成MDK-ARM工程
    【STM32CubeMX】 串口通信(USART) Printf重定向_第4张图片


2.重定向Printf 及 Scanf

  • 主要用到两个函数

  • HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

  • HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

【STM32CubeMX】 串口通信(USART) Printf重定向_第5张图片

  • 在 bsp_debug_usart.h 中添加头文件
#include "stm32f1xx_hal.h"
#include "stm32f1xx_hal_usart.h"

#include 
  • 在 bsp_debug_usart.c 中重写fget和fput函数
/**
  * 函数功能: 重定向c库函数printf到DEBUG_USARTx
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明:无
  */
int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&husart_debug, (uint8_t *)&ch, 1, 0xffff);
  return ch;
}

/**
  * 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明:无
  */
int fgetc(FILE *f)
{
  uint8_t ch = 0;
  HAL_UART_Receive(&husart_debug, &ch, 1, 0xffff);
  return ch;
}
  • 在 main.c 中添加 bsp_debug_usart.h
#include "bsp_debug_usart.h"
/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/

uint16_t cnt = 0;
char str[256];

/* USER CODE END PV */

while(1)
{
	HAL_Delay(1000);
	sprintf(str, "%d:usart_debug_test...\r\n", ++cnt);
	printf("%s", str);
}

3.调试

【STM32CubeMX】 串口通信(USART) Printf重定向_第6张图片


4.关于实现串口收发的几种方式

  • 轮询法
  • 中断法
  • DMA法

5.参考资料

  • STM32 串口通信基本原理(超基础、详细版)
  • 关于printf重定向到串口的问题分析

你可能感兴趣的:(STM32CubeMX)