STM32重定向printf的兩種方法,並解決在TIMER2中printf只能列印double型別的整數部分
阿新 • • 發佈:2019-02-04
方法一:直接在工程中新增以下程式碼,然後那個c檔案要使用,直接用 #include "stdio.h" 即可使用printf
/**************加入以下程式碼,支援printf函式,而不需要選擇use MicroLIB***************/ #if 0 #pragma import(__use_no_semihosting) struct __FILE { int handle; /* Whatever you require here. If the only file you are using is */ /* standard output using printf() for debugging, no file handling */ /* is required. */ }; /* FILE is typedef¡¯ d in stdio.h. */ FILE __stdout; _sys_exit(int x) { x = x; } //Öض¨Òåfputcº¯Êý int fputc(int ch, FILE *f) { //while((USART1->SR&0X40)==0);//Ñ»··¢ËÍ,Ö±µ½·¢ËÍÍê±Ï //USART1->DR = (u8) ch; USART_SendData(USART1,(u8)ch); while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); return ch; } #endif /********************************************************************************/
這種方法發現了一個很奇怪的問題,在定時器2TIMER2中,列印double型別資料時,只能列印整數部分,無法列印小數點和小數部分。例如 double test = 5.6789;
用printf("%f",test);只能輸出5
嘗試各種辦法,後來嘗試下述第二種方法解決這個問題。
方法二:
(1/3)在usart.c檔案中新增以下程式碼
int fputc(int ch, FILE *f)
{
USART_SendData(USART1,(u8)ch);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
return ch;
}
(2/3)在usart.h檔案新增宣告
int fputc(int ch, FILE *f);
(3/3)在設定中勾選Use MicroLIB選項
此時就能在TIMER2中列印double函數了。