HC32F460串口重定向printf

使用的是旧版官方库2.2.0,如果用的是新版库的话需修改,应该差不多

01 引脚

需要通过F460数据手册的2.2章节【引脚功能表】确认引脚在功能组里,最后一列不为空的引脚就是可使用的

image

根据分组自行确认使用的是UARTx

image

02 代码

通过官方的串口轮询例程【uart_polling】修改,首先初始化要使用的串口

/* Print测试用 */
#define USART_BAUDRATE                  (115200ul)
#define USART2_CH                        (M4_USART2)
#define USART2_TX_PORT                   (PortD)
#define USART2_TX_PIN                    (Pin01)
#define USART2_TX_FUNC                   (Func_Usart2_Tx)

/* USART2初始化 printf调试用 */
static void USART2_Initialize(void)
{
	uint32_t u32Fcg1Periph = PWC_FCG1_PERIPH_USART2;
	const stc_usart_uart_init_t stcInitCfg = {
        UsartIntClkCkNoOutput,
        UsartClkDiv_1,
        UsartDataBits8,
        UsartDataLsbFirst,
        UsartOneStopBit,
        UsartParityNone,
        UsartSampleBit8,
        UsartStartBitFallEdge,
        UsartRtsEnable,
    };
	
	/* Enable peripheral clock */
	PWC_Fcg1PeriphClockCmd(u32Fcg1Periph, Enable);
	
	/* Initialize USART IO */
    //PORT_SetFunc(USART2_RX_PORT, USART2_RX_PIN, USART2_RX_FUNC, Disable);
    PORT_SetFunc(USART2_TX_PORT, USART2_TX_PIN, USART2_TX_FUNC, Disable);
	
	/* Initialize UART */
	USART_UART_Init(USART2_CH, &stcInitCfg);
	
	/* Set baudrate */
    USART_SetBaudrate(USART2_CH, USART_BAUDRATE);
	
	USART_FuncCmd(USART2_CH, UsartTx, Enable);


}

printf初始化使用的是hc32f460_utility.c中定义的函数UART_PrintfInit,该函数的参数分别是使用的串口通道,波特率以及前面所写的串口初始化函数:

extern void USART_Initialize(void)
{
	UART_PrintfInit(USART2_CH, USART_BAUDRATE, USART2_Initialize);	/* 串口2初始化 printf输出 */
	//printf("hello");
}

调用了上述官方的printf初始化函数就不需要改动重定向hc32f460_utility.c中的fputc函数了,因为默认就是重定向到UART_PrintfInit所使用的串口的.

库里原先写的fputc重定向函数如下:

/**
 *******************************************************************************
 ** \brief  Re-target fputc function.
 **
 ** \param  [in] ch
 ** \param  [in] f
 **
 ** \retval int32_t
 **
 ******************************************************************************/
int32_t fputc(int32_t ch, FILE *f)
{
    (void)f;  /* Prevent unused argument compilation warning */

    return (Ok == UartPutChar(m_PrintfDevice, (char)ch)) ? ch: -1;
}

然后就可以通过使用printf函数在串口进行输出调试了

03 在其他工程里添加串口

在原本没有串口的工程里添加串口输出需要添加hc32f460_usart.c进工程
并且修改ddl_config.h文件,使能串口库模块
image

在没有初始化时钟的工程里需要加初始化时钟BSP_CLK_Init();,把上述步骤的代码加进来,调用printf初始化函数即可


结束

posted @ 2025-09-12 10:08  T3rra  阅读(22)  评论(0)    收藏  举报
window.opts = config;