目录
前言
本章我们将使用STM32官方BSP中的串口驱动,在串口上输出HelloWorld。
从串口输出HelloWorld的方法
1. 简单的将HelloWorld这个字符串从串口里输出。
2. 可以将C库的printf输出重定向到串口上
本章我们使用第2种方法,因为第一种方法有太多的参考代码了。
串口初始化
首先我们需要将USART初始化为普通的异步串口。
USART的初始化代码,在我们第一章里,已经由STM32CubeMX自动产生出来了,因为我们当时在配置引脚的时候将PA9/PA10配置成了UART1,自动产生出的UART初始化代码请参考main.c里面的:
MX_USART1_UART_Init函数:
/**
* @brief USART1 Initialization Function
* @param None
* @retval None
*/
static void MX_USART1_UART_Init(void)
{
/* USER CODE BEGIN USART1_Init 0 */
/* USER CODE END USART1_Init 0 */
/* USER CODE BEGIN USART1_Init 1 */
/* USER CODE END USART1_Init 1 */
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;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN USART1_Init 2 */
/* USER CODE END USART1_Init 2 */
}
以及stm32f1xx_hal_msp.c里面的函数MX_USART1_UART_Init:
/**
* @brief USART1 Initialization Function
* @param None
* @retval None
*/
static void MX_USART1_UART_Init(void)
{
/* USER CODE BEGIN USART1_Init 0 */
/* USER CODE END USART1_Init 0 */
/* USER CODE BEGIN USART1_Init 1 */
/* USER CODE END USART1_Init 1 */
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;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN USART1_Init 2 */
/* USER CODE END USART1_Init 2 */
}
其中:MX_USART1_UART_Init是在HAL_UART_Init里面调用的。
然后我们稍微封装一下串口的输出接口:
void uart1_write(void* pdata, unsigned int len)
{
HAL_UART_Transmit(&huart1, pdata, len, HAL_MAX_DELAY);
}
void uart1_write_byte(uint8_t value)
{
uart1_write(&value, 1);
}
重定向C库的printf函数到串口
gcc编译器的small库需要重新实现__io_putchar即可。
而非gcc编译器,如ARMCC编译器则需要重新实现fputc。
#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/**
* @brief Retargets the C library printf function to the USART.
* @param None
* @retval None
*/
PUTCHAR_PROTOTYPE
{
uart1_write_byte((uint8_t)ch);
return ch;
}
所以上面这段代码可以同时用于gcc或非gcc编译器。
在main中添加测试代码
在串口初始化后的任意地方加入HelloWorld输出语句:
printf("Hello

本文详细介绍了如何使用STM32官方BSP中的串口驱动进行串口通信,包括初始化串口、重定向printf到串口、发送测试数据以及实现串口输入。通过实例代码展示了格式化字符串输出和串口数据回显功能,适用于STM32的初学者进行串口调试。
最低0.47元/天 解锁文章
276





