天天看點

【STM32CubeMX】 序列槽通信(USART) Printf重定向1.STM32CubeMX設定2.重定向Printf 及 Scanf3.調試4.關于實作序列槽收發的幾種方式5.參考資料

【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.STM32CubeMX設定2.重定向Printf 及 Scanf3.調試4.關于實作序列槽收發的幾種方式5.參考資料
  • 設定Debug
    【STM32CubeMX】 序列槽通信(USART) Printf重定向1.STM32CubeMX設定2.重定向Printf 及 Scanf3.調試4.關于實作序列槽收發的幾種方式5.參考資料
  • 設定序列槽 使用USART1 PA9,PA10
    【STM32CubeMX】 序列槽通信(USART) Printf重定向1.STM32CubeMX設定2.重定向Printf 及 Scanf3.調試4.關于實作序列槽收發的幾種方式5.參考資料
  • 設定時鐘頻率
    【STM32CubeMX】 序列槽通信(USART) Printf重定向1.STM32CubeMX設定2.重定向Printf 及 Scanf3.調試4.關于實作序列槽收發的幾種方式5.參考資料
    【STM32CubeMX】 序列槽通信(USART) Printf重定向1.STM32CubeMX設定2.重定向Printf 及 Scanf3.調試4.關于實作序列槽收發的幾種方式5.參考資料
  • 設定USART1詳細參數
    【STM32CubeMX】 序列槽通信(USART) Printf重定向1.STM32CubeMX設定2.重定向Printf 及 Scanf3.調試4.關于實作序列槽收發的幾種方式5.參考資料
  • 生成MDK-ARM工程
    【STM32CubeMX】 序列槽通信(USART) Printf重定向1.STM32CubeMX設定2.重定向Printf 及 Scanf3.調試4.關于實作序列槽收發的幾種方式5.參考資料

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重定向1.STM32CubeMX設定2.重定向Printf 及 Scanf3.調試4.關于實作序列槽收發的幾種方式5.參考資料
  • 在 bsp_debug_usart.h 中添加頭檔案
#include "stm32f1xx_hal.h"
#include "stm32f1xx_hal_usart.h"

#include <stdio.h>
           
  • 在 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重定向1.STM32CubeMX設定2.重定向Printf 及 Scanf3.調試4.關于實作序列槽收發的幾種方式5.參考資料

4.關于實作序列槽收發的幾種方式

  • 輪詢法
  • 中斷法
  • DMA法

5.參考資料

  • STM32 序列槽通信基本原理(超基礎、詳細版)
  • 關于printf重定向到序列槽的問題分析

繼續閱讀