1. 程式人生 > >STM32重定向printf的兩種方法,並解決在TIMER2中printf只能列印double型別的整數部分

STM32重定向printf的兩種方法,並解決在TIMER2中printf只能列印double型別的整數部分

方法一:直接在工程中新增以下程式碼,然後那個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函數了。