目錄
前言
格式化函數
實驗程序編寫
stdio文件夾
main.c
Makefile修改
編譯下載
前言
在學習實驗12:imx6ull串口通信實驗,我們實現了 UART1 基本的數據收發功能,雖然可以用來調試程序,但是功能太單一了,只能輸出字符。
本講實驗我們就來學習如何將 printf 這樣的格式化函數,移植到正點原子 I.MX6U-ALPHA 開發板上。
格式化函數
格式化函數說的是 printf、 sprintf 和 scanf 這樣的函數,分為格式化輸入和格式化輸出兩類函數。
我們剛開始學習 C 語言的時候,常常通過 printf 函數在屏幕上顯示字符串,通過 scanf 函數從鍵盤獲取輸入。
在 I.MX6U-ALPHA 開發板上也可以,將 printf 和 scanf 映射到串口上,這樣就可以使用 MobaXterm 作為開發板的終端, 完成與開發板的交互。
也可以使用 printf 和 sprintf 來實現各種各樣的格式化字符串,方便我們后續的開發。
實驗程序編寫
stdio文件夾
在正點原子提供的源碼資料里,有一個文件夾 stdio ,里面的文件就是我們要移植的源碼文件。
stdio 里面有兩個文件夾: include 和 lib,這兩個文件夾里面的內容如圖:
stdio 里面的文件其實是從 uboot 里面移植過來的,但stdio 中并沒有實現完全版的格式化函數,比如 printf 函數并不支持浮點數。
main.c
移植好以后就要測試相應的函數工作是否正常,我們使用 scanf 函數等待鍵盤輸入兩個整數,然后將兩個整數進行相加并使用 printf 函數輸出結果。
int main(void)
{unsigned char state = OFF;int a , b;int_init(); /* 初始化中斷(一定要最先調用!) */imx6u_clkinit(); /* 初始化系統時鐘 */delay_init(); /* 初始化延時 */clk_enable(); /* 使能所有的時鐘 */led_init(); /* 初始化led */beep_init(); /* 初始化beep */uart_init(); /* 初始化串口,波特率115200 */while(1) { printf("輸入兩個整數,使用空格隔開:");scanf("%d %d", &a, &b); /* 輸入兩個整數 */printf("\r\n數據%d + %d = %d\r\n\r\n", a, b, a+b); /* 輸出兩個數相加的和 */state = !state;led_switch(LED0,state);}return 0;
}
Makefile修改
修改 Makefile 中的 TARGET 為 printf,在 INCDIRS 中加入“stdio/include”,在 SRCDIRS中加入“stdio/lib”,
在編譯 C 文件的時候添加了選項“-Wa,-mimplicit-it=thumb”,
否則的話會有如下類似的錯誤提示:
thumb conditional instruction should be in IT block -- `addcs r5,r5,#65536'
編譯下載
使用 Make 命令編譯代碼,編譯成功以后使用軟件 imxdownload 將編譯完成的 printf.bin 文件下載到 SD 卡中,命令如下:
燒寫成功以后將 SD 卡插到開發板的 SD 卡槽中,打開 MobaXterm,設置好連接,然后復位開發板。
根據提示,輸入兩個整數,使用空格隔開,輸入完成以后按下“回車鍵”,
本講實驗到此結束啦,是不是很簡單~
我們下次見,比心~
?