一.串口1的打印重定义。
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{
int handle;
};
FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
void _sys_exit(int x)
{
x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{
while((USART1->SR&0x40)==0);//循环发送,直到发送完毕
USART1->DR = (uint8_t) ch;
return ch;
}
二.打印功能:#include ”stdarg.h“
typedef struct _DOWNLOAD_PARA
{
//align
uint32_t crc;
//align
uint16_t magic;
uint8_t Res0[2];
//chip factory code
uint8_t sta_baudrate;
uint8_t sta_packet_len;
uint8_t sta_timeout;
uint8_t sta_ABarea;
uint32_t printf_control;
uint8_t Res1[30];
}
DOWNLOAD_PARA;
DOWNLOAD_PARA DownLoad_Para_Info;
#define PRINT_BUF_SIZE 4200// 200// 100 //调试缓冲区大小
char szBuffer[PRINT_BUF_SIZE];
//串口打印控制
int console_write(int ch)
{
HAL_UART_Transmit(&huart1,(u8*)&ch,1,5);
return 0;
}
//输出打印重新封装
int putch_api(int ch)
{
return console_write(ch);
}
//输出打印字符串数据
int puts_api(const char *s)
{
while (*s != 0) {
putch_api(*s++);
}
return 0;
}
//打印数据八进制
void print_oct_api(char ch2, unsigned long l)
{
unsigned char ch;
int i;
ch2 = ch2 - '0';
for (i = ch2 - 1; i >= 0; i--) {
ch = (l >> (i * 4)) & 0x0f;
if (ch < 10)
putch_api(ch + '0');
else
putch_api(ch - 10 + 'A');
}
}
//打印数据整型
void print_d_api(unsigned long l)
{
unsigned long prod, t;
int flag = 0;
unsigned char ch;
int i, j;
for (i = 15; i >= 0; i--) {
prod = 1;
t = l;
for (j = 0; j < i; j++) {
prod = prod * 10;
t = t / 10;
}
ch = t;
l -= prod * t;
if (ch == 0 && flag == 0)
continue;
if (ch < 10)
putch_api(ch + '0');
else
putch_api('?');
flag = 1;
}
}
//打印数据16进制
void print_x_api(unsigned long l)
{
int flag = 0;
unsigned char ch;
int i;
for (i = 7; i >= 0; i--)
{
ch = (l >> i)&0x0f;
if(ch == 0 && flag == 0)
continue;
if (ch < 10)
{
putch_api(ch + '0');
}
else
{
putch_api(ch - 10 + 'A');
}
flag = 1;
}
}
//数据数据函数
int printf_api(const char *s, ...)
{
va_list ap;
unsigned long arg;
const char *str;
char ch1, ch2, ch3;
char lastch = 0;
//Console_Print_Number = 0;
//Console_Print_Input = 0;
va_start(ap, s);
//API_IO_WDI();
while (*s != 0)
{
if (*s == '%')
{
s++;
ch1 = *s++;
if (ch1 == 's')
{
str =(const char *) va_arg(ap, unsigned char *);
puts_api(str);
}
else if (ch1 == 'd')
{
arg = va_arg(ap, unsigned long);
print_d_api(arg);
}
else if (ch1 == 'x')
{
arg = va_arg(ap, unsigned long);
print_x_api(arg);
}
else if (ch1 == 'n')
{
putch_api(0x0d);
}
else if (ch1 == 'r')
{
putch_api(0x0a);
}
else if(ch1 == ' ')
{
break;
}
else
{
ch2 = *s++;
ch3 = *s++;
arg = va_arg(ap, unsigned long);
if(ch2 >= '0' && ch2 <= '9' && ch3 != ' ')
{
print_0nx_api(ch2, arg);
}
else
{
break;
}
}
}
else
{
ch1 = *s++;
if (ch1 == 'r')
{
putch_api(0x0d);
}
else if (ch1 == 'n')
{
if(lastch != 'r')
{
putch_api(0x0d);
}
putch_api(0x0a);
}
else if(ch1 == ' ')
{
break;
}
else
{
putch_api(ch1);
}
lastch = ch1;
}
}
va_end(ap);
return 0;
}
//用于参数数据输出打印
void Trace(unsigned long print_en_flag,const char* lpszFormat, ...)
{
va_list args;
int len;
if(DownLoad_Para_Info.printf_control&print_en_flag)
{
va_start(args, lpszFormat);
len = vsprintf(szBuffer, lpszFormat, args);
va_end(args);
if(len < PRINT_BUF_SIZE - 2)
{
szBuffer[len] = ' ';
printf_api(szBuffer);
}
else
{
szBuffer[PRINT_BUF_SIZE-3] = ' ';
printf_api(szBuffer);
}
}
}
//打印数据16进制
void TraceHex(unsigned long print_en_flag,unsigned char *pBuf, unsigned short size)
{
unsigned short i;
unsigned short print_size= 0;
//if(print_en_flag&CCO_para.print_en_flag)
{
if(size == 0)
{
return;
}
print_size = size;
if(print_size>(PRINT_BUF_SIZE-2))
{
print_size=(PRINT_BUF_SIZE-2);
}
for(i = 0; i < print_size; i++)
{
Trace(print_en_flag,"%02x ", pBuf[i]);
}
Trace(print_en_flag,"n");
}
}
//打印数据,使能参数,数据,长度
void TraceHexExp(unsigned long print_en_flag,unsigned char *pBuf, unsigned short size)
{
unsigned short i;
unsigned short print_size= 0;
//if(print_en_flag&CCO_para.print_en_flag)
{
if(size == 0)
{
return;
}
print_size = size;
if(print_size>(PRINT_BUF_SIZE-2))
{
print_size=(PRINT_BUF_SIZE-2);
}
for(i = 0; i < print_size; i++)
{
Trace(print_en_flag,"%02x ", pBuf[i]);
}
}
}
//打印数据
void TraceExp(const char* lpszFormat, ...)
{
va_list args;
int len;
va_start(args, lpszFormat);
len = vsprintf(szBuffer, lpszFormat, args);
va_end(args);
if(len < PRINT_BUF_SIZE - 2)
{
szBuffer[len] = ' ';
printf_api(szBuffer);
}
else
{
szBuffer[PRINT_BUF_SIZE-3] = ' ';
printf_api(szBuffer);
}
}



