1. 程式人生 > >IAR +STM32實現printf()輸出到串列埠

IAR +STM32實現printf()輸出到串列埠

  搜尋網際網路上,關於此類問題的解決文章資料也比較豐富,不過按照其思路還是遇到了不少問題。

  首先,貼程式碼,大部分程式碼都是類似的方案,重寫putchar或者fputc函式。

#ifdef  USE_IAR
#define PUTCHAR_PROTOTYPE int putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch,FILE *f)   
#endif

PUTCHAR_PROTOTYPE{
  HAL_UART_Transmit(&huart1, (char *)(&(ch)), 1, 10);
  return ch;
} 
  實際程式我定義了巨集 USE_IAR,也就是實現了putchar()函式,不過實際除錯,printf()函式會依次呼叫putchar()及fputs(),所以實際中實現其中任一一個函式即可。也就是上述的程式碼,即使我不定義USE_IAR,仍然是可用的。   需要注意的一點是重寫的putchar()函式必須要返回ch變數,否則只會列印首個字元一次。   使用STM32的串列埠傳送是阻塞的,也就是傳送完一個字元程式才會繼續執行傳送下一個字元。   記得配置IAR的環境 Options->General Options->Library Configuation的Library為Full。   加入printf()函式在未使用IAR的優化功能前提下,會增加8.5KBytes左右的readonly  code memory,30Bytes的readonly  data memory,及2.4KBytes左右的readwrite data memory。