博客專欄

EEPW首頁 > 博客 > 遇到這種情況 你需要添加這幾行代碼

遇到這種情況 你需要添加這幾行代碼

發(fā)布人:12345zhi 時間:2023-08-10 來源:工程師 發(fā)布文章

問:在STM32上輕松使用printf函數

除了點亮LED外,向串行控制臺發(fā)送打印信息可能是調試嵌入式項目時最簡單、最直接且最常用的技術。雖然大多數平臺都擁有可以在UART總線上傳輸數據的API,但它們在功能和普及度上都遜于printf() 函數。但在嵌入式C應用應用中僅僅利用此函數包含stdio 庫是遠遠不夠的。在STM32項目中,我們還需要額外添加幾行代碼。


如果你希望在UART總線上 傳輸 和 接收 格式化數據,請查看附屬文章在STM32上輕松使用scanf !

步驟

此程序涵蓋了配置和啟用適當的UART外設的預備步驟、將該UART實例映射到printf() 函數的主要步驟,以及用于打印浮點數的可選輔助步驟。本文適用于使用STM32CubeIDE 20(版本1.11.2)開發(fā)的項目,但也可以展開以用于其他環(huán)境。

0  建立UART實例

為了在接下來的步驟中正確地使用stdio 庫中的printf() 函數,我們必須配置一個UART(或USART)外設以傳輸格式化字符串。通常情況下,在ST開發(fā)板上操作時,應選擇可以連接到ST-LINK編程器/調試器RX和TX引腳的UART外設。因為,這樣可以通過ST-LINK的USB虛擬COM端口橋接將字符串發(fā)送到串行控制臺。幸運的是,在STM32CubeIDE或STM32CubeMX中啟動新項目時,該UART實例已默認配置完畢!作為程序員,你只需要留意已經配置的具體UART,然后繼續(xù)下一步操作即可。

對于那些已有項目但未配置UART的用戶,只需打開項目的.ioc 文件,并按照圖1所示進行修改即可。具體來說,

選擇適當的外設實例

設置模式和配置參數(通常使用的設置如圖1所示)

確保將適當的GPIO引腳配置為UART RX和TX。

完成后,保存.ioc 文件以生成項目的代碼。

圖片

圖 1 : 啟用和配置所需的U(S)ART外設的示例

1  重新定向printf() 至UART實例

UART準備就緒后,只需添加幾行代碼即可添加printf() 。

a. 將#include <stdio.h> 添加到main.c 文件頂部的“包含”部分中(圖2)。

圖片

圖2:納入stdio庫

b. 在main.c 文件中,將以下代碼復制并粘貼到main() 函數前、UART句柄聲明之后的位置。你可以選擇“私有函數原型”部分,如下圖3所示。請注意,UART句柄必須從&huart?更改為所需UART外設的句柄(例如 &huart2)。

#ifdef __GNUC__

#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)

#else

#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)

#endif

PUTCHAR_PROTOTYPE

{

HAL_UART_Transmit(&huart?, (uint8_t *)&ch, 1, HAL_MAX_DELAY);

return ch;

}

圖片

圖3:將重新定向代碼添加到main.c文件中

printf() 函數現在應該可以按預期運行了,除了浮點格式說明符。要啟用這些格式說明符,請繼續(xù)下一步。

2  啟用浮點支持(可選)

為了說明浮點格式化的問題,我們可以使用printf() 參考頁面提供的示例代碼。

printf("Characters: %c %cn", 'a', 65);

printf("Decimals: %d %ldn", 1977, 650000L);

p rintf("Preceding with blanks: %10dn", 1977);

printf("Preceding with zeros: %010dn", 1977);

printf("Some different radices: %d %x %o %#x %#on", 100, 100, 100, 100, 100);

printf("floats: %4.2f %+.0e %En", 3.1416, 3.1416, 3.1416);

printf("Width trick: %*dn", 5, 10);

printf("%sn", "A string");

在將此代碼添加到項目后,系統(tǒng)會顯示警告,說明“不支持浮點格式化”。如果我們繼續(xù)構建并運行項目,串行控制臺上的輸出將確認不會打印浮點數(圖4)。

圖片

圖4:未啟用浮點格式化支持的輸出示例

如果你的應用中未使用浮點數,那這可能就不是什么問題。但如果你需要使用浮點數,則可在“項目資源管理器”(Project Explorer)中右鍵單擊項目名稱,并選擇屬性(Properties ) 。在“C / C ++ Build”類別下選擇設置(Settings ) ,并在工具設置選項卡下選擇MCU( MCU Settings) 設置 。勾選“從newlib-nano使用printf的浮點數”旁邊的復選框,如下圖5所示。點擊應用并關閉( Apply and Close ) 。

請注意,啟用printf() 的浮點格式化支持將消耗相當數量的額外內存。具體來說,除了在未啟用浮點支持時printf() 函數所消耗的內存之外,啟用后還將消耗約0.35 KB的RAM和10.30 KB的閃存,這對低端設備而言已經是個問題。

圖片

圖5:啟用浮點格式化支持

現在,在重新構建項目并運行代碼后,浮點數值已經正確格式化,并如圖6所示。

圖片

圖6:啟用浮點格式化支持的輸出示例

*博客內容為網友個人發(fā)布,僅代表博主個人觀點,如有侵權請聯(lián)系工作人員刪除。



關鍵詞: STM32 printf

相關推薦

技術專區(qū)

關閉