使用HAL库开发STM32:UART基础使用

目的

UART(异步串口)是单片机非常常用的一个功能,一般用作设备或模块间通讯的一种方式。通常所说的232或是485通讯从写程序的角度来说就是使用UART进行通讯。(这个地方有些人会混淆,串口更多是一种通讯方式、机制,而TTL、232、485更多的是电气相关特性)

基础说明与初始化

基础说明

STM32系列MCU大多都有多个UART可以使用,每个UART可以设置独立的参数,和其它设备通讯时通讯的双方必须有相同的参数。一般会涉及的参数如下:

  • BaudRate 波特率,通讯速率,当其他参数默认时,每秒可传输字节数约为 BaudRate/10;
  • WordLength 数据位,数据位表示每一个数据包含bit数,一般用8bit,即一个数据为一个字节;
  • StopBits 停止位,停止位用来表示一个数据传输结束;
  • Parity 校验位,校验位用来校验传输的数据是否正确,一般也比较少用,通讯用的协议一般带自己的校验方式;
  • HwFlowCtl 流控制,现在比较少用到;
  • OverSampling 过采样,一般默认就行;

初始化

如果使用STM32CubeMX来初始化UART的话我们一般只要根据需求设置基本参数、中断、DMA即可,如下图所示:
在这里插入图片描述
默认情况下STM32CubeMX生成的初始化代码分别位于main和stm32fxxx_hal_msp文件中,其中UART基本参数相关设置代码如下:

static void MX_USART1_UART_Init(void)
{
  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();
  }
}

如果想要在使用过程中更改串口参数可以用上面代码更改,如果想要关闭串口可以使用 HAL_StatusTypeDef HAL_UART_DeInit(UART_HandleTypeDef *huart) 函数。

数据接收和发送

UART的数据接收和发送可以分别为轮询、中断、DMA三种方式,同一个串口三种方式不可混用。

轮询方式

在这里插入图片描述
轮询方式使用UART只需要设置基本参数就行,不需要开启中断和DMA。轮询模式下收发数据使用下面函数:

  • HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
  • HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

上面函数使用时分别传入UART对象、数据指针、数据长度、超时时间(默认情况下单位ms)。这两个函数在调用时均会阻塞程序,直至数据传输完成或者超时。所以轮询方式一般不怎么推荐。

中断方式

在这里插入图片描述
中断方式使用UART需要设置基本参数和开启中断,不需要启用DMA。中断模式下收发数据需要用到下面函数:

  • HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
  • HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

上面两个函数分别是接收和发送的操作。

  • void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  • void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)

上面两个函数分别是接收和发送完成时的回调函数,用户需要自行编写回调函数具体的内容。

中断方式收发数据其实是每收发一个字节均会触发一次中断的,只不过HAL库将它处理了,用户一般只在全部完成时进行操作。这种方式会频繁进出中断,在使用时需要注意。

DMA方式

在这里插入图片描述
DMA模式下收发数据需要用到下面函数:

  • HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
  • HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

上面两个函数分别是接收和发送的操作。

  • void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  • void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)

上面两个函数分别是接收和发送完成时的回调函数,用户需要自行编写回调函数具体的内容。

其它说明

UART除了设置、收发数据外还有一些功能,如下图:
在这里插入图片描述

  • 带有 HAL_UART_Abort 字符的函数是用来取消当前正在进行的传输的相关操作;
  • 带有 HAL_UART_DMA 字符的函数是用来控制DMA方式收发数据过程的相关操作;
  • HAL_UART_GetErrorHAL_UART_GetState 函数分别用来获取UART的错误和状态信息,具体信息参见其宏定义;
  • 带有 HalfCpltCallback 字符的函数是传输过半回调函数,用户可以根据需求自行重写函数具体功能;

总结

UART基本使用还是比较简单的。一般实际使用中除了基本的功能使用外还需要编写一些额外的收发逻辑,这块内容会在之后的文章中讲解。
更多内容可以参考官方库文档,比如上面演示中用的F4系列文档《UM1725 User Manual - Description of STM32F4 HAL and LL drivers》。

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
STM32F091中,可以通过使用HAL提供的函数来配置UART使用DMA进行数据传输。以下是UART发送使用DMA的配置步骤: 1. 开启DMA时钟 需要先开启DMA时钟,以DMA1为例: ```c __HAL_RCC_DMA1_CLK_ENABLE(); ``` 2. 配置DMA通道 使用HAL提供的函数配置DMA通道,以DMA1通道2为例: ```c hdma_tx.Instance = DMA1_Channel2; hdma_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; // 数据传输方向,从存储器到外设 hdma_tx.Init.PeriphInc = DMA_PINC_DISABLE; // 禁止外设地址自增 hdma_tx.Init.MemInc = DMA_MINC_ENABLE; // 允许存储器地址自增 hdma_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; // 外设数据宽度为8位 hdma_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; // 存储器数据宽度为8位 hdma_tx.Init.Mode = DMA_NORMAL; // DMA模式为普通模式 hdma_tx.Init.Priority = DMA_PRIORITY_HIGH; // DMA通道优先级为高 HAL_DMA_Init(&hdma_tx); ``` 3. 配置UART 使用HAL提供的函数配置UART使用DMA进行数据发送,以USART1为例: ```c 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; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; HAL_UART_Init(&huart1); ``` 4. 启动DMA传输 使用HAL提供的函数启动DMA传输,以发送数据为例: ```c HAL_UART_Transmit_DMA(&huart1, (uint8_t*)sendBuffer, sendSize); ``` 以上是UART发送使用DMA的配置步骤,UART接收使用DMA的配置步骤与此类似。需要注意的是,UART接收使用DMA时需要将数据传输方向配置为从外设到存储器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Naisu Xu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值