測試芯片是STM32F103C8T6,直接封裝好了,波特率是 9600?
MyDbg.h?
#ifndef __MYDBG_H
#define __MYDBG_H
#include "stm32f1xx_hal.h"
#include <stdio.h>
#include <stdarg.h>/*使用GPIO口 模擬 UART 輸出字符串
*/
//初始化調試接口
void InitDbg(GPIO_TypeDef *pGPIO ,uint16_t uPin);
//調試 輸出
void DbgPrintf(char *pFmt,...);
#endif
MyDbg.c
#include "MyDbg.h"char g_DbgContent[100];
uint32_t g_Freq = 0;
GPIO_TypeDef *g_DBG_GPIO;
uint16_t g_Pin;void Delay_us(uint32_t us) {uint32_t uTickCount = 0;//重載時間戳uint32_t uReloadTick = SysTick->LOAD;//轉化uint32_t uTicks = us * g_Freq; uint32_t uLastTick = SysTick->VAL; while(1){//獲取當前時間戳uint32_t uNowTick = SysTick->VAL;if(uNowTick != uLastTick){if (uNowTick < uLastTick) {uTickCount += uLastTick - uNowTick;}else {uTickCount += uReloadTick - uNowTick + uLastTick;}//更新時間戳uLastTick = uNowTick;//判斷是否到時間了if (uTickCount >= uTicks){break;}}};
}void UART_SendChar(char ch) {uint8_t data = (uint8_t)ch;HAL_GPIO_WritePin(g_DBG_GPIO, g_Pin, GPIO_PIN_RESET); Delay_us(100); for (int i = 0; i < 8; i++) { // 8位數據if (data & 0x01) {HAL_GPIO_WritePin(g_DBG_GPIO, g_Pin, GPIO_PIN_SET); // 設置高電平} else {HAL_GPIO_WritePin(g_DBG_GPIO, g_Pin, GPIO_PIN_RESET); // 設置低電平}Delay_us(100); // 延時1微秒(根據實際情況調整)data >>= 1; // 移位到下一個位}// 發送停止位(通常一個高電平位)HAL_GPIO_WritePin(g_DBG_GPIO, g_Pin, GPIO_PIN_SET); // 高電平停止位Delay_us(100);
}void DbgPrintf(char *pFmt,...) {va_list ap;va_start(ap,pFmt);int n = vsprintf(g_DbgContent,pFmt,ap);va_end(ap);char *pStr = (char*)&g_DbgContent;while (*pStr != 0){UART_SendChar(*pStr++); // 逐個字符發送}
}void InitDbg(GPIO_TypeDef *pGPIO ,uint16_t uPin){g_DBG_GPIO = pGPIO;g_Pin = uPin;g_Freq = SystemCoreClock / 1000000;
}
難點在于實現微秒級的延遲。
測試代碼使用了GPIOA的PIN_1
int main(void){HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_I2C1_Init();//初始化InitDbg(GPIOA,GPIO_PIN_1);int Count = 0;while (1){DbgPrintf("Count:%d##",Count);Count++;HAL_Delay(1000);}
}
輸出效果: