STM32F429第十三篇之stm32f4xx_hal_uart

前言

本篇文章主要介绍STM32F429的HAL库中UART的用法。主要参考资料为:

  • Description of STM32F4 HAL and low-layer drivers

本文中将枚举类型归入到结构体中介绍,严格说是不严谨的。但是为了方便,姑且如此操作。

综述

用法

  1. 声明一个UART_HandleTypeDef句柄结构体(UART_HandleTypeDef huart)。
  2. 通过重定义函数HAL_UART_MspInit()初始化UART底层资源。
    1. 使能 UARTx接口时钟。
    2. UART管脚配置
      1. 使能对应GPIO的时钟。
      2. 配置UART管脚,并且配置成上拉。
    3. 如果需要使用中断,需要配置NVIC。(HAL_UART_Transmit_IT(,HAL_UART_Receive_IT() 以及 HAL_UART_TransmitReceive_IT())
      1. 配置 UARTx的中断优先级。
      2. 使能NVIC UART IRQ。
    4. 如果你需要使用DMA功能,则进行DMA配置。(HAL_UART_Transmit_DMA(),HAL_UART_Receive_DMA() 以及HAL_UART_TransmitReceive_DMA())。
      1. 声明一个发送/接收流的DMA句柄结构体。
      2. 使能DMAx接口时钟。
      3. 通过所需的参数配置已被声明的DMA句柄结构体。
      4. 配置DMA发送/接收流。
      5. 将已被初始化的DMA句柄与UART DMA 收发句柄连接。
      6. 配置优先级,使能DMA传输完成。
      7. 配置UARTx中断优先级并启用NVIC UART IRQ句柄(用于DMA非循环模式下的最后一个字节发送完成检测)。
  3. 在初始化结构体huart中,配置波特率,字长,停止位,奇偶校验,流控制等。
  4. 通过调用 HAL_UART_Init()函数初始化UART寄存器。
    1.将会调用HAL_UART_MspInit()初始化UART底层资源。

三种模式

轮询模式

  • 通过使用HAL_UART_Transmit()阻塞模式发送大量数据。
  • 通过使用HAL_UART_Receive()阻塞模式接收大量数据。

中断模式

  • 使用HAL_UART_Transmit_IT()函数非阻塞模式发送大量数据。
  • 在发送数据之后,HAL_UART_TxHalfCpltCallback函数会被自动调用。用户可以自定义该函数。
  • 使用HAL_UART_Receive_IT()函数非阻塞模式接收大量数据。
  • 在接收数据之后,HAL_UART_RxCpltCallback函数会被自动调用。用户可以自定义该函数。
  • 若出现传输错误,HAL_UART_ErrorCallback()函数将会被调用。

DMA模式

  • 使用HAL_UART_Transmit_DMA()函数以非阻塞的方式发送大量数据。
  • 在半传输发送完成后,函数HAL_UART_TxHalfCpltCallback会被调用,用户可自定义其内容。
  • 在传输发送完成后,函数HAL_UART_TxCpltCallback会被调用,用户可自定义其内容。
  • 使用HAL_UART_Receive_DMA()函数以非阻塞的方式接收大量数据。
  • 在半传输接收完成后,函数HAL_UART_RxHalfCpltCallback会被调用,用户可自定义其内容。
  • 在传输接收完成后,函数HAL_UART_RxCpltCallback会被调用,用户可自定义其内容。
  • 若传输过程中出现错误,函数HAL_UART_ErrorCallback()会被调用,用户可以自定义其内容。
  • HAL_UART_DMAPause()暂停传输
  • HAL_UART_DMAResume()继续传输
  • HAL_UART_DMAStop()停止传输

宏列表

  • __HAL_UART_ENABLE: 使能UART
  • __HAL_UART_DISABLE: 禁用UART
  • __HAL_UART_GET_FLAG : 检测标志位
  • __HAL_UART_CLEAR_FLAG : 清除标志位
  • __HAL_UART_ENABLE_IT: 使能中断
  • __HAL_UART_DISABLE_IT: 禁止中断

注意: 还有更多的宏定义参考<stm32f4xx_hal_UART.h>

函数介绍

HAL_UART_Init

函数原型

HAL_StatusTypeDef HAL_UART_Init (UART_HandleTypeDef * huart)

根据结构体 UART_HandleTypeDef中指定的参数初始化UART模式。

参数

返回类型

HAL_HalfDuplex_Init

函数原型

HAL_StatusTypeDef HAL_HalfDuplex_Init(UART_HandleTypeDef *huart)

初始化串口半双工模式。根据结构体UART_InitTypeDef指定其参数,并且创界句柄huart。

参数

返回类型

HAL_LIN_Init

函数原型

HAL_StatusTypeDef HAL_LIN_Init(UART_HandleTypeDef *huart, uint32_t BreakDetectLength)

根据结构体UART_InitTypeDef中指定的参数,创建对应的句柄huart,从而初始化LIN模式。

参数

  • huart:指向UART_HandleTypeDef的指针,其包含UART特定的配置信息。
  • BreakDetectLength:指定LIN中断检测长度。该参数可以取值为:
/** @defgroup UART_LIN_Break_Detection_Length  UART LIN Break Detection Length
  * @{
  */  
#define UART_LINBREAKDETECTLENGTH_10B      ((uint32_t)0x00000000)
#define UART_LINBREAKDETECTLENGTH_11B      ((uint32_t)0x00000020)
/**
  * @}
  */

返回类型

HAL_MultiProcessor_Init

函数原型

HAL_StatusTypeDef HAL_MultiProcessor_Init(UART_HandleTypeDef *huart, uint8_t Address, uint32_t WakeUpMethod)

根据huart提供的参数初始化多处理器模式。

参数

  • huart:指向UART_HandleTypeDef的指针,其包含UART特定的配置信息。
  • Address:串口地址
  • WakeUpMethod:指定串口唤醒方法。该参数可以取值为:
/** @defgroup UART_WakeUp_functions  UART Wakeup Functions
  * @{
  */
#define UART_WAKEUPMETHOD_IDLELINE                ((uint32_t)0x00000000)
#define UART_WAKEUPMETHOD_ADDRESSMARK             ((uint32_t)0x00000800)
/**
  * @}
  */

返回类型

HAL_UART_DeInit

函数原型

HAL_StatusTypeDef HAL_UART_DeInit(UART_HandleTypeDef *huart)

注销串口UART外设。

参数

返回类型

HAL_UART_MspInit

函数原型

__weak void HAL_UART_MspInit(UART_HandleTypeDef *huart)

串口MSP初始化。

参数

返回类型

HAL_UART_MspDeInit

函数原型

__weak void HAL_UART_MspDeInit(UART_HandleTypeDef *huart)

注销串口MSP初始化。

参数

返回类型

HAL_UART_Transmit

函数原型

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

以阻塞的方式单工发送大量数据。

参数

  • huart:指向UART_HandleTypeDef的指针,其包含UART特定的配置信息。
  • pData: 发送缓存数组的指针。
  • Size: 发送缓存数组的长度。
  • Timeout:超时时间。

返回类型

HAL_UART_Receive

函数原型

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

以阻塞的方式,接收大量的数据。

参数

  • huart:指向UART_HandleTypeDef的指针,其包含UART特定的配置信息。
  • pData: 发送缓存数组的指针。
  • Size: 发送缓存数组的长度。
  • Timeout:超时时间。

返回类型

HAL_UART_Transmit_IT

函数原型

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

以非阻塞的方式发送大量数据。

参数

  • huart:指向UART_HandleTypeDef的指针,其包含UART特定的配置信息。
  • pData: 发送缓存数组的指针。
  • Size: 发送缓存数组的长度。

返回类型

HAL_UART_Receive_IT

以非阻塞的方式接收大量数据。

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

参数

  • huart:指向UART_HandleTypeDef的指针,其包含UART特定的配置信息。
  • pData: 发送缓存数组的指针。
  • Size: 发送缓存数组的长度。

返回类型

HAL_UART_Transmit_DMA

函数原型

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

以非阻塞的方式发送大量数据。
参数

  • huart:指向UART_HandleTypeDef的指针,其包含UART特定的配置信息。
  • pData: 发送缓存数组的指针。
  • Size: 发送缓存数组的长度。

返回类型

HAL_UART_Receive_DMA

函数模型

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

以非阻塞的方式接收大量数据。
参数

  • huart:指向UART_HandleTypeDef的指针,其包含UART特定的配置信息。
  • pData: 发送缓存数组的指针。
  • Size: 发送缓存数组的长度。

返回类型

注意

  • 当奇偶校验使能时(PCE=1),接收数据包含校验位。

HAL_UART_DMAPause

函数原型

HAL_StatusTypeDef HAL_UART_DMAPause(UART_HandleTypeDef *huart)```

DMA传输停止
参数

返回类型

HAL_UART_DMAResume

函数模型

HAL_StatusTypeDef HAL_UART_DMAResume(UART_HandleTypeDef *huart)

DMA传输恢复

参数

返回类型

HAL_UART_DMAStop

函数原型

HAL_StatusTypeDef HAL_UART_DMAStop(UART_HandleTypeDef *huart)

DMA传输停止

参数

返回类型

HAL_UART_IRQHandler

函数原型

void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)

该函数处理串口中断请求。

参数

返回类型

HAL_UART_TxCpltCallback

函数原型

__weak void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)

TX传输完成回调函数。

参数

返回类型

HAL_UART_TxHalfCpltCallback

 __weak void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart)

Tx半传输完成回调。

参数

返回类型

HAL_UART_RxCpltCallback

函数原型

__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

接收完成回调

参数

返回类型

HAL_UART_RxHalfCpltCallback

函数原型

__weak void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart)

接收半传输完成回调

参数

返回类型

HAL_UART_ErrorCallback

函数原型

 __weak void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)

参数

返回类型

HAL_LIN_SendBreak

函数模型

HAL_StatusTypeDef HAL_LIN_SendBreak(UART_HandleTypeDef *huart)

传输中断字符。

参数

返回类型

HAL_MultiProcessor_EnterMuteMode

函数模型

HAL_StatusTypeDef HAL_MultiProcessor_EnterMuteMode(UART_HandleTypeDef *huart)

进入沉默模式。

参数

返回类型

HAL_MultiProcessor_ExitMuteMode

函数模型

HAL_StatusTypeDef HAL_MultiProcessor_ExitMuteMode(UART_HandleTypeDef *huart)

退出沉默模式

参数

返回类型

HAL_HalfDuplex_EnableTransmitter

函数模型

HAL_StatusTypeDef HAL_HalfDuplex_EnableTransmitter(UART_HandleTypeDef *huart)

使能发送,禁用接收。
参数

返回类型

HAL_HalfDuplex_EnableReceiver

函数模型

HAL_StatusTypeDef HAL_HalfDuplex_EnableReceiver(UART_HandleTypeDef *huart)

使能接收,禁用发送

参数

返回类型

HAL_UART_GetState

函数模型

HAL_UART_StateTypeDef HAL_UART_GetState(UART_HandleTypeDef *huart)

返回串口状态。

参数

返回类型

HAL_UART_GetError

函数模型

uint32_t HAL_UART_GetError(UART_HandleTypeDef *huart)

返回串口错误代码。

参数

返回类型

结构体

HAL_StatusTypeDef

/** 
  * @brief  HAL Status structures definition  
  */  
typedef enum 
{
  HAL_OK       = 0x00,
  HAL_ERROR    = 0x01,
  HAL_BUSY     = 0x02,
  HAL_TIMEOUT  = 0x03
} HAL_StatusTypeDef;

UART_HandleTypeDef

/** 
  * @brief  UART handle Structure definition  
  */  
typedef struct
{
  USART_TypeDef                 *Instance;        /* UART registers base address        */
  
  UART_InitTypeDef             Init;             /* UART communication parameters      */
  
  uint8_t                       *pTxBuffPtr;      /* Pointer to UART Tx transfer Buffer */
  
  uint16_t                      TxXferSize;       /* UART Tx Transfer size              */
  
  __IO uint16_t                 TxXferCount;      /* UART Tx Transfer Counter           */
  
  uint8_t                       *pRxBuffPtr;      /* Pointer to UART Rx transfer Buffer */
  
  uint16_t                      RxXferSize;       /* UART Rx Transfer size              */
  
  __IO uint16_t                 RxXferCount;      /* UART Rx Transfer Counter           */  
  
  DMA_HandleTypeDef             *hdmatx;          /* UART Tx DMA Handle parameters      */
    
  DMA_HandleTypeDef             *hdmarx;          /* UART Rx DMA Handle parameters      */
  
  HAL_LockTypeDef                Lock;            /* Locking object                      */
  
  __IO HAL_UART_StateTypeDef     gState;           /* UART communication state           */
  
  __IO uint32_t                  ErrorCode;       /* UART Error code                    */

}UART_HandleTypeDef;
/**
  * @}
  */

Instance(UART寄存器基地址)

结构体UART_TypeDef 的指针,一般取值为:

#define USART1              ((UART_TypeDef *) UART1_BASE)
#define USART2              ((UART_TypeDef *) UART2_BASE)
#define USART3              ((UART_TypeDef *) UART3_BASE)
#define UART4               ((UART_TypeDef *) UART4_BASE)
#define UART5               ((UART_TypeDef *) UART5_BASE)
#define USART6              ((UART_TypeDef *) UART6_BASE)
#define UART7               ((USART_TypeDef *) UART7_BASE)
#define UART8               ((USART_TypeDef *) UART8_BASE)

在F429中,共有8路串口。

Init(UART通信参数)

结构体UART_InitTypeDef 的指针。在该指针中包含串口通信的最重要参数,波特率,校验位等。

pTxBuffPtr(发送端缓存指针)
发送端缓存数组的指针。

TxXferSize(发送缓存长度)
发送端缓存数组的长度。

TxXferCount(发送端缓存计数器)
发送端缓存数组计数器。

pRxBuffPtr(接收端缓存指针)
接收端缓存数组指针。

RxXferSize(接收端缓存长度)
接收端缓存数组的长度。

RxXferCount(接收端缓存计数器)
接收端缓存数组的计数器。

hdmatx(发送端DMA句柄)
串口发送端DMA句柄参数。关于这部分信息,在DMA中详细展开,此处不再详细展开。

hdmarx(接收端DMA句柄)
串口接收端DMA句柄。

Lock(锁)
枚举类型 HAL_LockTypeDef的变量。用于锁定资源,以防止意外访问,改变数据。关于该结构体的用法,此处不再详细展开。

typedef enum 
{
  HAL_UNLOCKED = 0x00,
  HAL_LOCKED   = 0x01  
} HAL_LockTypeDef;

State(状态)
串口状态,为枚举类型HAL_UART_StateTypeDef变量,可以取值为:

/** 
  * @brief HAL State structures definition  
  */ 
typedef enum
{
  HAL_UART_STATE_RESET             = 0x00,    /*!< Peripheral is not yet Initialized   */
  HAL_UART_STATE_READY             = 0x01,    /*!< Peripheral Initialized and ready for use */
  HAL_UART_STATE_BUSY              = 0x02,    /*!< an internal process is ongoing */   
  HAL_UART_STATE_BUSY_TX           = 0x12,    /*!< Data Transmission process is ongoing */ 
  HAL_UART_STATE_BUSY_RX           = 0x22,    /*!< Data Reception process is ongoing */
  HAL_UART_STATE_BUSY_TX_RX        = 0x32,    /*!< Data Transmission Reception process is ongoing */
  HAL_UART_STATE_TIMEOUT           = 0x03,    /*!< Timeout state */
  HAL_UART_STATE_ERROR             = 0x04     /*!< Error */      
}HAL_UART_StateTypeDef;

ErrorCode(错误代码)
串口错误代码。

UART_InitTypeDef

/** 
  * @brief UART Init Structure definition  
  */ 
typedef struct
{
  uint32_t BaudRate;                  /*!< This member configures the UART communication baud rate.
                                           The baud rate is computed using the following formula:
                                           - IntegerDivider = ((PCLKx) / (8 * (OVR8+1) * (huart->Init.BaudRate)))
                                           - FractionalDivider = ((IntegerDivider - ((uint32_t) IntegerDivider)) * 8 * (OVR8+1)) + 0.5 
                                           Where OVR8 is the "oversampling by 8 mode" configuration bit in the CR1 register. */

  uint32_t WordLength;                /*!< Specifies the number of data bits transmitted or received in a frame.
                                           This parameter can be a value of @ref UART_Word_Length */

  uint32_t StopBits;                  /*!< Specifies the number of stop bits transmitted.
                                           This parameter can be a value of @ref UART_Stop_Bits */

  uint32_t Parity;                    /*!< Specifies the parity mode.
                                           This parameter can be a value of @ref UART_Parity
                                           @note When parity is enabled, the computed parity is inserted
                                                 at the MSB position of the transmitted data (9th bit when
                                                 the word length is set to 9 data bits; 8th bit when the
                                                 word length is set to 8 data bits). */
 
  uint32_t Mode;                      /*!< Specifies whether the Receive or Transmit mode is enabled or disabled.
                                           This parameter can be a value of @ref UART_Mode */

  uint32_t HwFlowCtl;                 /*!< Specifies whether the hardware flow control mode is enabled
                                           or disabled.
                                           This parameter can be a value of @ref UART_Hardware_Flow_Control */
  
  uint32_t OverSampling;              /*!< Specifies whether the Over sampling 8 is enabled or disabled, to achieve higher speed (up to fPCLK/8).
                                           This parameter can be a value of @ref UART_Over_Sampling */ 
}UART_InitTypeDef;

BaudRate(波特率)

该参数配置UART通信的波特率。可以通过以下公式计算分频数。

  • IntegerDivider = ((PCLKx) / (8 * (huart->Init.BaudRate)))
  • FractionalDivider = ((IntegerDivider - ((uint32_t) IntegerDivider)) * 8) + 0.5

WordLength(字长)
该参数可以定义为以下参数:

/** @defgroup UART_Word_Length UART Word Length
  * @{
  */
#define UART_WORDLENGTH_8B                  ((uint32_t)0x00000000)
#define UART_WORDLENGTH_9B                  ((uint32_t)USART_CR1_M)
/**
  * @}
  */

注意:ARM对于字长支持和标准串口不太一致。

StopBits(停止位)
该参数可以取值以下:

/** @defgroup UART_Stop_Bits UART Number of Stop Bits
  * @{
  */
#define UART_STOPBITS_1                     ((uint32_t)0x00000000)
#define UART_STOPBITS_2                     ((uint32_t)USART_CR2_STOP_1)
/**
  * @}
  */ 

Parity(校验位)

/** @defgroup UART_Parity UART Parity
  * @{
  */ 
#define UART_PARITY_NONE                    ((uint32_t)0x00000000)
#define UART_PARITY_EVEN                    ((uint32_t)USART_CR1_PCE)
#define UART_PARITY_ODD                     ((uint32_t)(USART_CR1_PCE | USART_CR1_PS)) 
/**
  * @}
  */ 

注意:

M bitPCE bitUART frame
00SB -8 bit data - STB
01SB -7 bit data - PB -STB
10SB -9 bit data - STB
11SB -8 bit data - PB - STB

其中:

  • SB:起始位
  • PB:校验位
  • STB:停止位

Mode(收发模式)
配置串口通信的收发模式,参数可以选择如下:

/** @defgroup UART_Mode UART Transfer Mode
  * @{
  */ 
#define UART_MODE_RX                        ((uint32_t)USART_CR1_RE)
#define UART_MODE_TX                        ((uint32_t)USART_CR1_TE)
#define UART_MODE_TX_RX                     ((uint32_t)(USART_CR1_TE |USART_CR1_RE))
/**
  * @}
  */

HwFlowCtl(流控制)

硬件流控制选项,可以选择一下内容:

/** @defgroup UART_Hardware_Flow_Control UART Hardware Flow Control
  * @{
  */ 
#define UART_HWCONTROL_NONE                  ((uint32_t)0x00000000)
#define UART_HWCONTROL_RTS                   ((uint32_t)USART_CR3_RTSE)
#define UART_HWCONTROL_CTS                   ((uint32_t)USART_CR3_CTSE)
#define UART_HWCONTROL_RTS_CTS               ((uint32_t)(USART_CR3_RTSE | USART_CR3_CTSE))
/**
  * @}
  */

OverSampling(过采样)
该位确定串口的过采样数为8还是16。具体参数如下:

/** @defgroup UART_Over_Sampling UART Over Sampling
  * @{
  */
#define UART_OVERSAMPLING_16                    ((uint32_t)0x00000000)
#define UART_OVERSAMPLING_8                     ((uint32_t)USART_CR1_OVER8)
/**
  * @}
  */

当采用过采样为8时,串口最高的波特率为PCLK/8。而采用过采样为16时,串口最高的波特率为PCLK/16。所以,过采样为8时,串口的通信频率更快。然而,过采样频率为16时,获取信号更加精确。所以,具体选择需要视情况而定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值