STM32从零开始 - 第三章:从串口输出HelloWorld

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

目录

 

前言

串口初始化

重定向C库的printf函数到串口

在main中添加测试代码

完整的main.c代码

编译下载

程序效果

扩展实验1:格式化字符串输出

扩展实验2:串口输入


前言

本章我们将使用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
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值