正點原子學習筆記
1,printf函數(shù)輸出流程
2,printf的使用
3,printf函數(shù)支持
printf函數(shù)輸出流程(C語言)
1)用戶調(diào)用 printf()
2)編譯器從stdio.h里解析
3)最終由fputc()實現(xiàn)輸出
由此用戶需要根據(jù)最終輸出的硬件重新定義該函數(shù),此過程稱為:printf重定向
printf的使用
1,printf("Hello World!\r\n");
2,printf("%d\r\n",121);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ????????????????? 常用輸出控制符表
控制符 | 說明 |
%d | 按十進制整數(shù)型數(shù)據(jù)的實際長度輸出 |
%ld | 輸出長整型數(shù)據(jù) |
%md | m為指定的輸出字段的寬度。如果數(shù)據(jù)的位數(shù)小于m,則左端補以空格,若大于m,則按實際位數(shù)輸出 |
%c | 用來輸出一個字符 |
%s | 用來輸出字符 |
%u | 輸出無符號整型(unsigned) |
%f | 輸出實數(shù),包括單精度和雙精度,以小數(shù)形式輸出 |
%x | 以十六進制形式輸出整數(shù) |
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 常用轉(zhuǎn)義字符表
控制符 | 說明 |
\r | 回車,將當前位置移到本行開頭 |
\n | 換行,將當前位置移到下一行 |
\\ | 代表一個反斜線字符 |
\' | 代表一個單引號字符 |
\" | 代表一個雙引號字符 |
\? | 代表一個問號 |
\0 | 空字符NULL |
\t | 水平制表(HT)(跳到下一個TAB位置) |
printf函數(shù)支持
1,避免使用半主機模式? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 兩種方法:微庫法、代碼法
2,實現(xiàn)fputc函數(shù)? ? ? ? ? ? ? ? ????????????????????????實現(xiàn)單個字符輸出
半主機模式簡介
用于ARM目標的一種機制,可將來自應用程序代碼的輸入/輸出請求傳送至運行調(diào)試器的主機
簡單說:就是通過仿真器實現(xiàn)開發(fā)板在電腦上的輸入和輸出
一般我們:不使用半主機模式??!
方法一:微庫法
?方法二:代碼法? ? ? ?(推介)? ? ? ? ? ? ? ? ?一個預處理、兩個定義、三個函數(shù)
1,#pragma import(__use_no_semihosting),確保不從C庫中使用半主機函數(shù)
2,定義:__FILE 結(jié)構體,避免HAL庫某些情況下報錯
3,定義:FILE__stdout,避免編譯報錯
4,實現(xiàn):__ttywrch、_sys_exti 和 _sys_command_string 等三個函數(shù)
#if 1
#pragma import(__use_no_semihosting)
//標準庫需要的支持函數(shù)
struct __FILE
{
int handle;
};
FILE __stdout;
//定義_sys_exit()以避免使用半主機模式
void _sys_exit(int x)
{
x = x;
}
//重定義fputc函數(shù)
int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0);//循環(huán)發(fā)送,直到發(fā)送完畢
USART1->DR = (u8) ch;
return ch;
}
#endif
因特殊原因,不完善,但能用,正點原子提供
當使用微庫法時,只需定義 fputc函數(shù)即可文章來源:http://www.zghlxwxcb.cn/news/detail-727526.html
fputc函數(shù)介紹
USART1->SR&0X40?????????????????當上一幀發(fā)送完成后,位6(TX=1)
USART1->DR =(u8) ch;? ? ? ? ? ? ?將要發(fā)送的字符ch寫入到DR寄存器
?文章來源地址http://www.zghlxwxcb.cn/news/detail-727526.html
到了這里,關于STM32使用printf函數(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!