实现一个DEBUG调试的基础是实现自己的一个串口printf。
由于IAR下S32K144的开发环境没有控制台,所以需要自己实现一个串口,将输出重定向到对应的串口下。
1、将需要重定向的串口初始化,并且完成该串口的uart_send接口。
void uart_init_hal(uint8_t uartinstance,uint32_t bitrate)
{
//对需要的串口进行初始化,并设置baudrate
}
void uart_send(uint8_t uartinstance,uint8_t *data,uint16_t len)
{
//根据uartinstance获取lpuartState
//调用SDK完成发送接口
LPUART_DRV_SendData(uartinstance,data,len);
while(lpuartState->isTxBusy);//等待串口数据发送完成
}
2、使用初始化完成后的串口发送接口,编写自己的printf函数
static void myputchar(char ch)
{
uint8_t mychar = ch;
uart_send(PRINT_UART,&mychar,1);
}
//输出整数型
static void myprintint(const int dec) //输出整型数
{
if(dec>=10)
myprintint(dec/10);
myputchar((char)(dec % 10 + '0'));
if(dec == 0)
{
//myputchar('0');
return;
}
}
//输出字符串
static void myprintstr(const char *ptr)
{
while(*ptr)
{
myputchar(*ptr);
ptr++;
}
}
//输出浮点数,小数点第5位四舍五入
static void myprintfloat(const float flt)
{
int tmpint = (int)flt;
int tmpflt = (int)(100000 * (flt - tmpint));
if(tmpflt % 10 >= 5)
{
tmpflt = tmpflt / 10 + 1;
}
else
{
tmpflt = tmpflt / 10;
}
myprintint(tmpint);
myputchar('.');
myprintint(tmpflt);
}
//实现自己的串口打印
void my_printf(const char *format,...)
{
va_list ap;
va_start(ap,format); //将ap指向第一个实际参数的地址
while(*format)
{
if(*format != '%')
{
myputchar(*format);
format++;
}
else
{
format++;
switch(*format)
{
case 'c':
{
char valch = va_arg(ap,int); //记录当前实践参数所在地址
myputchar(valch);
format++;
break;
}
case 'd':
{
int valint = va_arg(ap,int);
myprintint(valint);
format++;
break;
}
case 's':
{
char *valstr = va_arg(ap,char *);
myprintstr(valstr);
format++;
break;
}
case 'f':
{
float valflt = va_arg(ap,double);
myprintfloat(valflt);
format++;
break;
}
default:
{
myputchar(*format);
format++;
}
}
}
}
va_end(ap);
}
3、使用my_printf去定义DEBUG宏
#define printf_s my_printf
#define DEBUG_LOG(format, ...) \
printf_s("DEBUG[%s(%d)]# ", __FILE__, __LINE__); \
printf_s(format, ##__VA_ARGS__); \
printf_s("\r\n");
这样就完成了一个自己的DEBUG代码,可以用来在自定义的串口输出自己想要的调试信息。