S32K144实现自己的DEBUG调试

实现一个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代码,可以用来在自定义的串口输出自己想要的调试信息。

猜你喜欢

转载自blog.csdn.net/weixin_40983190/article/details/89924568