試過用IAR內建的PRINTF,會有印錯誤字串。
自已改了PRINTF,
#include "ML51_IAR.H"
void UART_UART0(uint8_t c)
{
SFRS = 0;
TI = 0;
SBUF = c;
while(TI==0);
TI = 0;
}
/*---------------------------------------------------------------------------------------------------------*/
/* Simple printf() function */
/*---------------------------------------------------------------------------------------------------------*/
void printf_UART(uint8_t *str, ...);
void printInteger(uint32_t u32Temp)
{
uint8_t print_buf[16];
uint32_t i = 15, j;
*(print_buf + i) = '\0';
j = u32Temp >> 31;
if(j)
u32Temp = ~u32Temp + 1;
do
{
i--;
*(print_buf + i) = '0' + u32Temp % 10;
u32Temp = u32Temp / 10;
}
while(u32Temp != 0);
if(j)
{
i--;
*(print_buf + i) = '-';
}
printf_UART(print_buf + i);
}
void printHex(uint32_t u32Temp)
{
uint8_t print_buf[16];
uint32_t i = 15;
uint32_t temp;
*(print_buf + i) = '\0';
do
{
i--;
temp = u32Temp % 16;
if(temp < 10)
*(print_buf + i) = '0' + temp;
else
*(print_buf + i) = 'a' + (temp - 10) ;
u32Temp = u32Temp / 16;
}
while(u32Temp != 0);
printf_UART(print_buf + i);
}
void printf_UART(uint8_t *str, ...)
{
va_list args;
va_start(args, str);
while(*str != '\0')
{
if(*str == '%')
{
str++;
if(*str == '\0') return;
if(*str == 'd')
{
str++;
printInteger(va_arg(args, int));
}
else if(*str == 'x')
{
str++;
printHex(va_arg(args, int));
}
}
//SendChar_ToUART(*str++);
//UART_Send_Data(UART0,*str++);
UART_UART0(*str++);
}
}
/*******************************************************************************
* FUNCTION_PURPOSE: Main function
******************************************************************************/
void main (void)
{
/* Initial UART0 for printf */
unsigned char t1=0x5a;
MFP_P31_UART0_TXD;
P31_PUSHPULL_MODE;
UART_Open(24000000,UART0_Timer3,115200);
UART_UART0(0x55);
printf_UART("test\n\r");
printf_UART("%d\n\r",t1);
printf_UART("%x\n\r",t1);
while(1);
}
|