S32K144实现自己的DEBUG调试

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值