1. 程式人生 > >在STM32中使用printf傳送字串到串列埠

在STM32中使用printf傳送字串到串列埠

問題:在使用STM32除錯時,經常使用串列埠傳送資訊,為了方便除錯與串列埠傳送資訊,用printf()函式實現通過串列埠列印資訊。

方法一:

1.新增包含printf()函式的標頭檔案:#include “stdio.h”
2.重寫 stdio.h 標頭檔案中的 int fputc(int ch, FILE *f) 函式

int fputc(int ch, FILE *f)
{
    while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
    //等待先前的字元傳送完成
    USART_SendData(USART1, (uint8_t) ch);
    //傳送字元
return ch; } //示例函式中使用了USART1來發送訊息 //實際情況可以根據硬體板來決定使用哪個串列埠

注意:使用while迴圈先等待先前的字元傳送完成,避免造成字串首字元傳送丟失的問題。
3.將該函式” int fputc(int ch, FILE *f) “放在main()函式能夠呼叫到的檔案中,KEIL->Options for Target’xxx’->Target->Code Generation,勾選Use MicroLIB

方法二:

//加入以下程式碼,支援printf函式,而不需要選擇use MicroLIB    
#if USART_DEBUG
#pragma import(__use_no_semihosting) //標準庫需要的支援函式 struct __FILE { int handle; }; FILE __stdout; //定義_sys_exit()以避免使用半主機模式 _sys_exit(int x) { x = x; } //重定義fputc函式 int fputc(int ch, FILE *f) { while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET) {} USART_SendData(USART1,(uint8_t)ch); return
ch; } #endif

使用以上任一方法,均可實現printf()函式列印字串重定義到USART1。