硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3771|回复: 4
收起左侧

[HAL学习笔记] HAL库串口源文件stm32h7xx_hal_uart.c学习笔记(2018-11-12 V1.0)

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
发表于 2018-11-12 16:33:58 | 显示全部楼层 |阅读模式
说明:
这里主要是异步方式串口。

==============================================================================
                                                                   ##### 如何使用此驱动  #####
==============================================================================

1、定义UART_HandleTypeDef类型串口结构体变量,比如UART_HandleTypeDef huart
2、使用函数HAL_UART_MspInit初始化串口底层。
(1)使能串口时钟
(2)引脚配置
        a、使能串口所使用的GPIO时钟
        b、配置GPIO的复用模式
(3)如果使用中断方式函数HAL_UART_Transmit_IT和HAL_UART_Receive_IT需要做如下配置
        a、配置串口中断优先级
        b、使能串口中断。
(4)串口中断的开关是通过函数__HAL_UART_ENABLE_IT() 和 __HAL_UART_DISABLE_IT()来实现,这两个函数被嵌套到串口的发送和接收函数中调用。
(5)如果使用中断方式函数HAL_UART_Transmit_DMA和HAL_UART_Receive_DMA需要做如下配置
        a、声明串口的发送和接收DMA结构体变量,注意发送和接收是独立的两个,如果都是用,那就都需要配置。
        b、使能DMA接口时钟
        c、配置串口的发送和接收DMA结构体变量
        d、配置DMA发送和接收通道
        e、关键DMA和串口的句柄
        f、配置发送DMA和接收DMA的传输完成中断和中断优先级。

3、配置串口结构体变量xxx的波特率,位长,停止位,奇偶校验位,流控制和发送接收模式

4、如果需要,可以编程高级特性,比如TX/RX交换引脚,自动波特率检测。在串口结构体变量xxx的结构体成员AdvancedInit来设置。

5、串口初始化调用的函数HAL_UART_Init初始化

6、串口半双工初始化调用的函数HAL_HalfDuplex_Init初始化后

7、串口LIN模式调用函数HAL_LIN_Init初始化

8、多处理器模式调用函数HAL_MultiProcessor_Init初始化

9、485驱动模式,调用函数HAL_RS485Ex_Init初始化

这几个函数都会调用HAL_UART_MspInit做底层的GPIO,时钟等初始化。



1、初始化函数
HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart);
HAL_StatusTypeDef HAL_HalfDuplex_Init(UART_HandleTypeDef *huart);
HAL_StatusTypeDef HAL_LIN_Init(UART_HandleTypeDef *huart, uint32_t BreakDetectLength);
HAL_StatusTypeDef HAL_MultiProcessor_Init(UART_HandleTypeDef *huart, uint8_t Address, uint32_t WakeUpMethod);
HAL_StatusTypeDef HAL_UART_DeInit (UART_HandleTypeDef *huart);
void HAL_UART_MspInit(UART_HandleTypeDef *huart);
void HAL_UART_MspDeInit(UART_HandleTypeDef *huart);

其中函数
HAL_UART_Init和HAL_UART_Init是较常用的。

初始化的基础特性:
(++) Baud Rate
(++) Word Length
(++) Stop Bit
(++) Parity
(++) Hardware flow control
(++) Receiver/transmitter modes
(++) Over Sampling Method
(++) One-Bit Sampling Method


初始化的高级特性:
(++) TX and/or RX pin level inversion
(++) data logical level inversion
(++) RX and TX pins swap
(++) RX overrun detection disabling
(++) DMA disabling on RX error
(++) MSB first on communication line
(++) auto Baud rate detection


支持的位格式:
QQ截图20181113230143.png

2、阻塞方式的函数和非阻塞方式的函数

(#) 阻塞方式API
    (+) HAL_UART_Transmit()
    (+) HAL_UART_Receive()

(#) 非阻塞中断方式
    (+) HAL_UART_Transmit_IT()
    (+) HAL_UART_Receive_IT()
    (+) HAL_UART_IRQHandler()

(#) 非阻塞DMA方式
    (+) HAL_UART_Transmit_DMA()
    (+) HAL_UART_Receive_DMA()
    (+) HAL_UART_DMAPause()
    (+) HAL_UART_DMAResume()
    (+) HAL_UART_DMAStop()

(#) 回调函数
    (+) HAL_UART_TxHalfCpltCallback()
    (+) HAL_UART_TxCpltCallback()
    (+) HAL_UART_RxHalfCpltCallback()
    (+) HAL_UART_RxCpltCallback()
    (+) HAL_UART_ErrorCallback()

(#) 非阻塞方式终止函数
    (+) HAL_UART_Abort()
    (+) HAL_UART_AbortTransmit()
    (+) HAL_UART_AbortReceive()
    (+) HAL_UART_Abort_IT()
    (+) HAL_UART_AbortTransmit_IT()
    (+) HAL_UART_AbortReceive_IT()

(#) 基于中断方式的终止服务,提供了如下几个回调函数:
    (+) HAL_UART_AbortCpltCallback()
    (+) HAL_UART_AbortTransmitCpltCallback()
    (+) HAL_UART_AbortReceiveCpltCallback()


另外串口的错误处理,分为阻塞式和非阻塞两种。
=======================================
(#) In Non-Blocking mode transfers, possible errors are split into 2 categories.
        Errors are handled as follows :
       (+) Error is considered as Recoverable and non blocking : Transfer could go till end, but error severity is
           to be evaluated by user : this concerns Frame Error, Parity Error or Noise Error in Interrupt mode reception .
           Received character is then retrieved and stored in Rx buffer, Error code is set to allow user to identify error type,
           and HAL_UART_ErrorCallback() user callback is executed. Transfer is kept ongoing on UART side.
           If user wants to abort it, Abort services should be called by user.
       (+) Error is considered as Blocking : Transfer could not be completed properly and is aborted.
           This concerns Overrun Error In Interrupt mode reception and all errors in DMA mode.
           Error code is set to allow user to identify error type, and HAL_UART_ErrorCallback() user callback is executed.

    -@- In the Half duplex communication, it is forbidden to run the transmit
        and receive process in parallel, the UART state HAL_UART_STATE_BUSY_TX_RX can't be useful.
=======================================



回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
 楼主| 发表于 2018-11-13 03:34:18 | 显示全部楼层
晚上忙于Embedded Studio的模板设计了,白天了再更新把。
回复

使用道具 举报

2

主题

69

回帖

75

积分

初级会员

积分
75
发表于 2018-11-13 11:22:12 来自手机 | 显示全部楼层
还可以 TX/RX 交换引脚,学习了。 只会复制例程,设置bps,通了 就从没看过DS。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
 楼主| 发表于 2018-11-14 01:56:18 | 显示全部楼层
整理完毕。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
 楼主| 发表于 2018-11-14 01:56:21 | 显示全部楼层
整理完毕。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-6 03:37 , Processed in 0.262860 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表