【STM32CubeMX】 串列埠通訊(USART) Printf重定向
阿新 • • 發佈:2019-01-07
- STM32CubeMX: Version 4.26.1
- MDK-ARM: Version 5.24.2
- 開發板: 中移onenet 麒麟座MINI板
- 晶片: STM32F103CBT6
1.STM32CubeMX設定
-
設定外部時鐘源
-
設定Debug
-
設定串列埠 使用USART1 PA9,PA10
-
設定時鐘頻率
-
設定USART1詳細引數
-
生成MDK-ARM工程
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)
- 在 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.除錯
4.關於實現串列埠收發的幾種方式
- 輪詢法
- 中斷法
- DMA法