HAL库编写程序 printf输出函数 多printf串口
时间: 2023-10-24 10:16:12 浏览: 65
使用HAL库编写程序中,可以通过以下步骤实现多个串口的printf输出:
1. 在main函数之前,定义一个全局变量USART_HandleTypeDef类型的数组,用于存储多个串口的句柄。
```
USART_HandleTypeDef huart1;
USART_HandleTypeDef huart2;
USART_HandleTypeDef huart3;
USART_HandleTypeDef* UsartHandle[] = {&huart1, &huart2, &huart3};
```
2. 在main函数中,对每个串口进行初始化,同时设置printf函数输出到对应的串口,例如以下代码使用了3个串口(USART1、USART2、USART3),并将printf输出设置到对应的串口。
```
HAL_UART_MspInit(&huart1);
HAL_UART_MspInit(&huart2);
HAL_UART_MspInit(&huart3);
__HAL_RCC_USART1_CLK_ENABLE();
__HAL_RCC_USART2_CLK_ENABLE();
__HAL_RCC_USART3_CLK_ENABLE();
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
HAL_UART_Init(&huart1);
huart2.Instance = USART2;
huart2.Init.BaudRate = 115200;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
HAL_UART_Init(&huart2);
huart3.Instance = USART3;
huart3.Init.BaudRate = 115200;
huart3.Init.WordLength = UART_WORDLENGTH_8B;
huart3.Init.StopBits = UART_STOPBITS_1;
huart3.Init.Parity = UART_PARITY_NONE;
huart3.Init.Mode = UART_MODE_TX_RX;
huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
HAL_UART_Init(&huart3);
/* 将printf输出重定向到对应的串口 */
void HAL_UART_MspInit(UART_HandleTypeDef* huart)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(huart->Instance==USART1)
{
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_USART1_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(USART1_IRQn);
}
else if(huart->Instance==USART2)
{
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_USART2_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF7_USART2;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_NVIC_SetPriority(USART2_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(USART2_IRQn);
}
else if(huart->Instance==USART3)
{
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_USART3_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF7_USART3;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
HAL_NVIC_SetPriority(USART3_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(USART3_IRQn);
}
}
```
3. 在printf输出时,通过参数指定输出到哪个串口,例如以下代码使用了3个串口(USART1、USART2、USART3),并使用参数idx指定输出到哪个串口。
```
void usart_printf(uint8_t idx, char* format, ...)
{
va_list args;
va_start(args, format);
char str[128];
vsnprintf(str, sizeof(str), format, args);
va_end(args);
HAL_UART_Transmit(UsartHandle[idx], (uint8_t*)str, strlen(str), 0xffff);
}
```
4. 最后在其他函数中调用usart_printf函数即可输出到对应的串口,例如以下代码在main函数中分别输出到3个串口。
```
int main(void)
{
HAL_Init();
SystemClock_Config();
usart_printf(0, "Hello from USART1!\r\n");
usart_printf(1, "Hello from USART2!\r\n");
usart_printf(2, "Hello from USART3!\r\n");
while (1)
{
}
}
```