176 lines
3.8 KiB
C
176 lines
3.8 KiB
C
|
#include "debug.h"
|
|||
|
//
|
|||
|
// Created by KS00596 on 2022/7/12.
|
|||
|
//
|
|||
|
|
|||
|
/**********************************************************
|
|||
|
行注释
|
|||
|
内容:HAL 接口层
|
|||
|
**********************************************************/
|
|||
|
static void SerialInit(void)
|
|||
|
{
|
|||
|
UART_InitStructure UART_initStruct;
|
|||
|
PORT_Init(PORTC, PIN2, FUNMUX0_UART0_RXD, 1); // GPIOA.2配置为UART0输入引脚
|
|||
|
PORT_Init(PORTC, PIN3, FUNMUX1_UART0_TXD, 0); // GPIOA.3配置为UART0输出引脚
|
|||
|
UART_initStruct.Baudrate = 115200;
|
|||
|
UART_initStruct.DataBits = UART_DATA_8BIT;
|
|||
|
UART_initStruct.Parity = UART_PARITY_NONE;
|
|||
|
UART_initStruct.StopBits = UART_STOP_1BIT;
|
|||
|
UART_initStruct.RXThreshold = 3;
|
|||
|
UART_initStruct.RXThresholdIEn = 1;
|
|||
|
UART_initStruct.TXThreshold = 3;
|
|||
|
UART_initStruct.TXThresholdIEn = 0;
|
|||
|
UART_initStruct.TimeoutTime = 10; //10个字符时间内未接收到新的数据则触发超时中断
|
|||
|
UART_initStruct.TimeoutIEn = 1;
|
|||
|
UART_Init(UART0, &UART_initStruct);
|
|||
|
UART_Open(UART0);
|
|||
|
}
|
|||
|
|
|||
|
static void putChar(char ch)
|
|||
|
{
|
|||
|
UART_WriteByte(UART0, (u32)ch);
|
|||
|
while (UART_IsTXBusy(UART0));
|
|||
|
}
|
|||
|
void DebugInit(void){
|
|||
|
SerialInit();
|
|||
|
}
|
|||
|
/***
|
|||
|
* 自己写的printf函数
|
|||
|
* 函数定义void Printf(const char *format, ...)
|
|||
|
* 目前支持%d,%c,%s,%f
|
|||
|
* */
|
|||
|
|
|||
|
/**
|
|||
|
* @brief uart输出单个字符-interface
|
|||
|
*
|
|||
|
* @param c 输出字符
|
|||
|
*/
|
|||
|
void PutChar(char c)
|
|||
|
{
|
|||
|
// extern void putChar(char c);
|
|||
|
putChar(c);
|
|||
|
}
|
|||
|
|
|||
|
void printch(const char ch) //输出字符
|
|||
|
{
|
|||
|
PutChar(ch);
|
|||
|
}
|
|||
|
|
|||
|
void printint(const int dec) //输出整型数
|
|||
|
{
|
|||
|
|
|||
|
if (dec == 0)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
printint(dec / 10);
|
|||
|
PutChar((char)(dec % 10 + '0'));
|
|||
|
}
|
|||
|
|
|||
|
void printstr(const char *ptr) //输出字符串
|
|||
|
{
|
|||
|
while (*ptr)
|
|||
|
{
|
|||
|
PutChar(*ptr);
|
|||
|
ptr++;
|
|||
|
}
|
|||
|
}
|
|||
|
static void printBit(const int dec)
|
|||
|
{
|
|||
|
|
|||
|
if (dec == 0)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
printBit(dec / 2);
|
|||
|
PutChar((char)(dec % 2 + '0'));
|
|||
|
}
|
|||
|
|
|||
|
void printfloat(const float flt) //输出浮点数,小数点第5位四舍五入
|
|||
|
{
|
|||
|
int tmpint = (int)flt;
|
|||
|
int tmpflt = (int)(100000 * (flt - tmpint));
|
|||
|
if (tmpflt % 10 >= 5)
|
|||
|
{
|
|||
|
tmpflt = tmpflt / 10 + 1;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
tmpflt = tmpflt / 10;
|
|||
|
}
|
|||
|
printint(tmpint);
|
|||
|
PutChar('.');
|
|||
|
printint(tmpflt);
|
|||
|
}
|
|||
|
|
|||
|
void Printf(const char *format, ...)
|
|||
|
{
|
|||
|
va_list ap;
|
|||
|
va_start(ap, format); //将ap指向第一个实际参数的地址
|
|||
|
while (*format != '\0')
|
|||
|
{
|
|||
|
if (*format != '%')
|
|||
|
{
|
|||
|
PutChar(*format);
|
|||
|
format++;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
format++;
|
|||
|
switch (*format)
|
|||
|
{
|
|||
|
case 'c':
|
|||
|
{
|
|||
|
char valch = va_arg(ap, int); //记录当前实践参数所在地址
|
|||
|
printch(valch);
|
|||
|
format++;
|
|||
|
break;
|
|||
|
}
|
|||
|
case 'd':
|
|||
|
{
|
|||
|
int valint = va_arg(ap, int);
|
|||
|
if (valint)
|
|||
|
printint(valint);
|
|||
|
else
|
|||
|
{
|
|||
|
PutChar('0');
|
|||
|
}
|
|||
|
format++;
|
|||
|
break;
|
|||
|
}
|
|||
|
case 's':
|
|||
|
{
|
|||
|
char *valstr = va_arg(ap, char *);
|
|||
|
printstr(valstr);
|
|||
|
format++;
|
|||
|
break;
|
|||
|
}
|
|||
|
case 'f':
|
|||
|
{
|
|||
|
float valflt = va_arg(ap, double);
|
|||
|
printfloat(valflt);
|
|||
|
format++;
|
|||
|
break;
|
|||
|
}
|
|||
|
case 'b':
|
|||
|
{
|
|||
|
int valint = va_arg(ap, int);
|
|||
|
if (valint)
|
|||
|
printBit(valint);
|
|||
|
else
|
|||
|
{
|
|||
|
PutChar('0');
|
|||
|
}
|
|||
|
format++;
|
|||
|
break;
|
|||
|
}
|
|||
|
default:
|
|||
|
{
|
|||
|
printch(*format);
|
|||
|
format++;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
va_end(ap);
|
|||
|
}
|