华大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数据手册里的引脚功能表自由定义
初始化
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);
}
}
}