2018年6月2日星期六

[STM32] printf 重定向到 UART

一般要開發使用像 STM32 這類的單片機,如果要做 Debug 將訊息往外輸出 最常用的就是 UART 串口。我想也是大部分朋友的習慣,這一篇就來介紹 STM32 如何重定向 printf

其實在 ST 範例包中就可以找到範例,我找了一下 在 STM32F411RE-Nucleo 裡的 UART 有一項 UART_printf  專案。

只要在 main.c 裡加兩段程式碼,在 Define 自變數 段加入以下


#ifdef __GNUC__
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */


然後再任一處 加入以下這個 Function , 我的習慣是放在 SystemClock_Config(void) 前


PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}

huart1是在程式定義 UART 自變數,依你的環境做適當調整。
這樣就完成了。
在 main() 不免俗的來一下 Hello
printf("Hello!\r\n");
..... 等等。 如果你是使用 GCC cross compiler 的朋友,你會發現編譯過程中產生一個錯誤
undefined reference to `_sbrk'
OK,在TrueSTUDIO 範例裡有 syscall.c 檔案, 直接複製到你的專案裡然後重新 Compiler 

在最近的 STM32CUBE 版本中已經加入了 syscall.c 可以不用再手動加入。  

範例連結

https://github.com/cold63/STM32F031x6Project/tree/master/UARTPrintf

相關連結

printf 後記
https://www.makdev.net/2018/08/stm32-printf.html