华大HC32F4A0串口使用及printf重定向

说明:
轮询 polling方法
更改自小华HC32官方库DDL_2.2.0版本


相关宏定义

/* 串口 */
#define USART_RX_PORT                   (GPIO_PORT_B)   /* PH13: USART1_RX */
#define USART_RX_PIN                    (GPIO_PIN_15)
#define USART_RX_GPIO_FUNC              (GPIO_FUNC_33)

#define USART_TX_PORT                   (GPIO_PORT_B)   /* PH15: USART1_TX */
#define USART_TX_PIN                    (GPIO_PIN_14)
#define USART_TX_GPIO_FUNC              (GPIO_FUNC_32)

/* USART unit definition */
#define USART_UNIT                      (CM_USART1)

引脚可以参照HC32F4A0数据手册里的引脚功能表自由定义
image

初始化

void USART_Init()
{
	stc_usart_uart_init_t stcUartInit;
	
	/* Set TX port function */
	GPIO_SetFunc(USART_TX_PORT, USART_TX_PIN, USART_TX_GPIO_FUNC);
	GPIO_SetFunc(USART_RX_PORT, USART_RX_PIN, USART_RX_GPIO_FUNC);

	/* Enable clock  */
	FCG_Fcg3PeriphClockCmd(FCG3_PERIPH_USART1, ENABLE);
	USART_UART_StructInit(&stcUartInit);
	stcUartInit.u32ClockDiv = USART_CLK_DIV64;
	stcUartInit.u32OverSampleBit = USART_OVER_SAMPLE_8BIT;
	stcUartInit.u32Baudrate = 115200ul;
	(void)USART_UART_Init(USART_UNIT, &stcUartInit, NULL);
	USART_FuncCmd(USART_UNIT, USART_RX | USART_TX, ENABLE);
	
//	uint8_t buf[] = "hello world!\n"; 
//	USART_UART_Trans(USART_UNIT, buf, sizeof(buf), 1000);
}

串口printf使用 重定向fputc函数

修改hc32_ll_utility.c文件中的fputc函数,把默认的注释掉就行
参考博客:HC32F4A0串口重定义printf

/**
 * @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 (LL_OK == DDL_ConsoleOutputChar((char)ch)) ? ch : -1;
//}


int32_t fputc(int32_t ch, FILE *f)
{
    (void)f;  /* Prevent unused argument compilation warning */
    while(USART_GetStatus(CM_USART1, USART_FLAG_TX_EMPTY) == RESET);
    USART_WriteData(CM_USART1,(char)ch);
    return ch;
}

主循环中调用

例程里的,功能是将RX接收到的数据原样从TX发出

int32_t main(void)
{
	/* Peripheral registers write unprotected */
	LL_PERIPH_WE(EXAMPLE_PERIPH_WE);
	/* Configure BSP */
	BSP_Config();
	/* Peripheral registers write protected */
	LL_PERIPH_WP(EXAMPLE_PERIPH_WP);
	printf("hello");
	for (;;) 
	{
//		printf("hello");
//		USART_WriteData(CM_USART1, 'a');
		
		if (SET == USART_GetStatus(USART_UNIT, USART_FLAG_RX_FULL)) {
			uint16_t u16RxData = USART_ReadData(USART_UNIT);

			/* Wait Tx data register empty */
			while (RESET == USART_GetStatus(USART_UNIT, USART_FLAG_TX_EMPTY)) {
			}

			USART_WriteData(USART_UNIT, u16RxData);
		}
	}
}
posted @ 2025-01-14 10:22  T3rra  阅读(500)  评论(0)    收藏  举报
window.opts = config;