FM33LC0X系列,需要使用UART5作为调试串口,使用UART5打印数据,使用重定向printf打印和不使用重定向UART5_printf打印
自述
前面使用的都是ST系列的单片机,在转战复旦微之后有点忐忑,担心自己做不出来,担心自己做不好,但是还是咬牙顶上了,这次使用的是复旦微的低功耗系列FM33LC0x系列单片机,前面使用STM32和GD32的时候都习惯使用printf打印调试,在做复旦微的单片机后依然习惯使用printf调试打印,自己在参照STM32代码的基础上,写了使用重定向printf打印和不使用重定向UART5_printf打印的函数
1.使用重定向printf打印
这个没有什么多说的,写过STM32的都知道这个重定向。
#if 1
#pragma import(__use_no_semihosting)
struct __FILE
{
int handle;
};
FILE __stdout;
void _sys_exit(int x)
{
x = x;
}
int fputc(int ch, FILE *f)
{
UART5->TXBUF = ch;
while (!(UART5->ISR & (0x1 << 0)));
UART5->ISR |= (0x1 << 0);
return ch;
}
#endif
2.不使用重定向printf打印
这个代码也是参照其他人的改的,代码中的变量i是没有多的时间来写了,直接用i来代替了,不喜勿喷,谢谢,
void UART5_printf (char *fmt, ...)
{
char buffer[UART5_SEND_LEN+1];
int i = 0;
va_list arg_ptr;
va_start(arg_ptr, fmt);
vsnprintf(buffer, UART5_SEND_LEN+1, fmt, arg_ptr);
while ((i < UART5_SEND_LEN) && buffer[i])
{
FL_UART_WriteTXBuff(UART5, (uint8_t) buffer[i++]);
while(FL_SET != FL_UART_IsActiveFlag_TXShiftBuffEmpty(UART5)); //等待发送完成
}
va_end(arg_ptr);
}
3.完整代码
print.c文件完整代码
#include "print.h"
#if 1
#pragma import(__use_no_semihosting)
struct __FILE
{
int handle;
};
FILE __stdout;
void _sys_exit(int x)
{
x = x;
}
int fputc(int ch, FILE *f)
{
UART5->TXBUF = ch;
while (!(UART5->ISR & (0x1 << 0)));
UART5->ISR |= (0x1 << 0);
return ch;
}
#endif
/**
* @brief UART0 Initialization function
* @param void
* @retval None
*/
void MF_UART5_Init(void)
{
FL_GPIO_InitTypeDef GPIO_InitStruct;
FL_UART_InitTypeDef UART5_InitStruct;
GPIO_InitStruct.pin = FL_GPIO_PIN_4;
GPIO_InitStruct.mode = FL_GPIO_MODE_DIGITAL;
GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.pull = FL_ENABLE;
GPIO_InitStruct.remapPin = FL_ENABLE;
FL_GPIO_Init(GPIOC, &GPIO_InitStruct);
GPIO_InitStruct.pin = FL_GPIO_PIN_5;
GPIO_InitStruct.mode = FL_GPIO_MODE_DIGITAL;
GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.pull = FL_DISABLE;
GPIO_InitStruct.remapPin = FL_ENABLE;
FL_GPIO_Init(GPIOC, &GPIO_InitStruct);
UART5_InitStruct.clockSrc = NULL;
UART5_InitStruct.baudRate = 115200;
UART5_InitStruct.dataWidth = FL_UART_DATA_WIDTH_8B;
UART5_InitStruct.stopBits = FL_UART_STOP_BIT_WIDTH_1B;
UART5_InitStruct.parity = FL_UART_PARITY_NONE;
UART5_InitStruct.transferDirection = FL_UART_DIRECTION_TX_RX;
FL_UART_Init(UART5, &UART5_InitStruct);
}
//#define UART5_printf(...) printf(...)
void UART5_printf (char *fmt, ...)
{
char buffer[UART5_SEND_LEN+1];
int i = 0;
va_list arg_ptr;
va_start(arg_ptr, fmt);
vsnprintf(buffer, UART5_SEND_LEN+1, fmt, arg_ptr);
while ((i < UART5_SEND_LEN) && buffer[i])
{
FL_UART_WriteTXBuff(UART5, (uint8_t) buffer[i++]);
while(FL_SET != FL_UART_IsActiveFlag_TXShiftBuffEmpty(UART5)); //等待发送完成
}
va_end(arg_ptr);
}
print.h文件完整代码
#ifndef __PRINT_1_H__
#define __PRINT_1_H__
#include "fm33lc0xx_fl.h"
#include <string.h>
#include <stdarg.h>
#include <stdio.h>
void MF_UART5_Init(void);
void UART5_printf (char *fmt, ...) ;
#define UART5_SEND_LEN 300
#endif
结语
这个有参照别人的代码,并非是自己的原创,我做出来只是分享给大家,大家可以更快捷的使用printf函数,你自己花费一定的时间也可以写出来。