#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); }