概述
我們在初學 C 語言的時候,第一句打印就是 printf("hello world")
,後面也經常用來調試打印信息,但是我們在單片機開發的時候 printf 就用不了,因爲 printf 會打印在命令行窗口上,但是單片機上肯定沒有,所以我們通過改寫函數,將 printf 重定向到串口之上,然後通過串口調試助手來顯示。
一. 改寫函數
新建一個頭文件 debug_com.h
#ifndef __DEBUG_COM_H
#define __DEBUG_COM_H
#ifdef __cplusplus
extern "C" {
#endif
#include "stdio.h"
#include "usart.h"
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
#ifdef __cplusplus
}
#endif
#endif
在使用 printf
的時候,其實最終也是調用 fputc
函數進行打印,因此我們可以通過添加以下代碼來達成我們的目的:
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
注意: huart1
可以根據你使用的串口進行修改
之後將該頭文件放到一個文件夾(比如 debug_com
)裏面,再放到項目目錄下
再包含該頭文件,如下圖所示
之後在項目中使用 #include "debug_com.h"
就可以使用 printf
了
二. printf 使用實例
打印串口1中所用到的寄存器的首地址
//包含頭文件
#include "debug_com.h"
//主函數中添加
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
printf("huart1.Instance->SR %p\r\n",&huart1.Instance->SR);
printf("huart1.Instance->DR %p\r\n",&huart1.Instance->DR);
printf("huart1.Instance->BRR %p\r\n",&huart1.Instance->BRR);
printf("huart1.Instance->CR1 %p\r\n",&huart1.Instance->CR1);
printf("huart1.Instance->CR2 %p\r\n",&huart1.Instance->CR2);
printf("huart1.Instance->CR3 %p\r\n",&huart1.Instance->CR3);
printf("huart1.Instance->CTPR %p\r\n",&huart1.Instance->GTPR);
HAL_Delay(1000);
printf("\r\n");
}
這樣,我們就可以在調試助手上看到寄存器的地址值了
後續還會繼續分享串口的其他基礎知識和使用,感興趣的小夥伴記得關注我!
-----------------------------------------------結束--------------------------------------------------------
文章有價值,請各位看官點個贊,關注我或者點右邊打個賞吧!