使用STM32F407

串口:PA9、PA10(利用CH340G驱动)

一、 stm32f4xx_hal_uart.c 函数说明

  1. HAL_UART_Init 函数

    要使用一个外设首先要对它进行初始化,所以先看串口的初始化函数,其声明如下:

        HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart);

    函数描述:

    用于初始化异步模式的收发器。

函数形参:

形参 1 是串口的句柄,UART_HandleTypeDef 结构体类型,其定义如下:



1)Instance:指向 UART 寄存器基地址。实际上这个基地址 HAL 库已经定义好了,可以选择范围:USART1~ USART3、USART6、UART4、UART5。

2)Init:UART 初始化结构体,用于配置通讯参数,如波特率、数据位数、停止位等等。下面我们再详细讲解这个结构体。

3)AdvancedInit:用于配置高级功能,如自动波特率,MSB 先行等。

4)pTxBuffPtr,TxXferSize,TxXferCount:分别是指向发送数据缓冲区的指针,发送数据的大小,发送数据的个数。

5)pRxBuffPtr,RxXferSize,RxXferCount:分别是指向接收数据缓冲区的指针,接受数据的大小,接收数据的个数。

6)Mask:UART 数据接收寄存器的掩码,用于存放数据的校验位。

7)hdmatx,hdmarx:配置串口发送接收数据的 DMA 具体参数。

8)Lock:对资源操作增加操作锁保护,可选 HAL_UNLOCKED 或者 HAL_LOCKED 两个参数。如果 gState 的值等于 HAL_UART_STATE_RESET,则认为串口未被初始化,此时,分配锁资源,并且调用 HAL_UART_MspInit 函数来对串口的 GPIO 和时钟进行初始化。

9)gState,RxState:分别是 UART 的发送状态、工作状态的结构体和 UART 接受状态的结构

体。HAL_UART_StateTypeDef 是一个枚举类型,列出串口在工作过程中的状态值,有些值只

适用于 gState,如 HAL_UART_STATE_BUSY。

10)ErrorCode:串口错误操作信息。主要用于存放串口操作的错误信息。

UART_InitTypedef:



1)BaudRate:波特率设置。一般设置为 2400、9600、19200、115200。

2)WordLength:数据帧字长,可选 8 位或 9 位。这里我们设置为 8 位字长数据格式。

3)StopBits:停止位设置,可选 0.5 个、1 个、1.5 个和 2 个停止位,一般我们选择 1 个停止位。

4)Parity:奇偶校验控制选择,我们设定为无奇偶校验位。

5)Mode:UART 模式选择,可以设置为只收模式,只发模式,或者收发模式。这里我们设置为全双工收发模式。

6)HwFlowCtl:硬件流控制选择,我们设置为无硬件流控制。

7)OverSampling:过采样选择,选择 8 倍过采样或者 16 过采样,一般选择 16 过采样。

    函数返回值:

    HAL_StatusTypeDef 枚举类型的值,有 4 个,分别是 HAL_OK 表示成功,HAL_ERROR 表示错误,HAL_BUSY 表示忙碌,HAL_TIMEOUT 超时。后续遇到该结构体也是一样的。


  1. HAL_UART_Receive_IT 函数

    HAL_UART_Receive_IT 函数是开启串口接收中断函数。其声明如下:



    函数描述:

    用于开启以中断的方式接收指定字节。数据接收在中断处理函数里面实现。

    函数形参:

    形参 1 是 UART_HandleTypeDef 结构体指针类型的串口句柄。

    形参 2 是要接收的数据地址。

    形参 3 是要接收的数据大小,以字节为单位。

    函数返回值:

    HAL_StatusTypeDef 枚举类型的值。

  1. HAL_UART_IRQHandler 函数

    HAL_UART_IRQHandler 函数是 HAL 库中断处理公共函数。其声明如下:



    函数描述:

    该函数是 HAL 库中断处理公共函数,在串口中断服务函数中被调用。

    函数形参:

    形参 1 是 UART_HandleTypeDef 结构体指针类型的串口句柄。

    函数返回值:



    注意事项:

    该函数是 HAL 库已经定义好,用户一般不能随意修改。如果用户要在中断中实现自己的逻辑代码,可以直接在函数 HAL_UART_IRQHandler 的前面或者后面添加新代码,也可以直接在HAL_UART_IRQHandler 调用的各种回调函数里面执行,这些回调都是弱定义的,方便用户直接在其它文件里面重定义。串口回调函数主要有下面几个:



    本实验我们用到的是接收回调函数 HAL_UART_RxCpltCallback,就是在接收回调函数里面编写我们的接收逻辑代码,具体请参考实验源码。

二、串口通信配置步骤

  1. 串口参数初始化(波特率、字长、奇偶校验等),并使能串口。

    HAL 库通过调用串口初始化函数 HAL_UART_Init 完成对串口参数初始化,详见例程源码。

    注意:该函数会调用:HAL_UART_MspInit 函数来完成对串口底层的初始化,包括:串口

    及 GPIO 时钟使能、GPIO 模式设置、中断设置等。

    2)使能串口和 GPIO 口时钟

    本实验用到 USART1 串口,使用 PA9 和 PA10 作为串口的 TX 和 RX 脚,因此需要先使能USART1 和 GPIOA 时钟。参考代码如下:



    3)GPIO 模式设置(速度、上下拉、复用功能等)

        GPIO 模式设置通过调用 HAL_GPIO_Init 函数实现,详见本例程源码。

    4)开启串口相关中断,配置串口中断优先级

        本实验我们使用串口中断来接收数据。我们使用 HAL_UART_Receive_IT 函数开启串口中断接收,并设置接收 buffer 及其长度。通过 HAL_NVIC_EnableIRQ 函数使能串口中断,通过HAL_NVIC_SetPriority 函数设置中断优先级。

    5)编写中断服务函数

        串口 1 中断服务函数为:USART1_IRQHandler,当发生中断的时候,程序就会执行中断服务函数。HAL 库为了使用方便,提供了一个串口中断通用处理函数 HAL_UART_IRQHandler,该函数在串口接收完数据后,又会调用回调函数 HAL_UART_RxCpltCallback,用于给用户处理串口接收到的数据。

        因此我们需要在 HAL_UART_RxCpltCallback 函数实现数据接收处理,详见本例程源码。

    6)串口数据接收和发送

        最后我们可以通过读写 USART_DR 寄存器,完成串口数据的接收和发送,HAL 库也给我们提供了:HAL_UART_Receive 和 HAL_UART_Transmit 两个函数用于串口数据的接收和发送。大家可以根据实际情况选择使用那种方式来收发串口数据。

三、STM32CubeMX配置USART1



    Disable:不进行配置

    Asynchronous:异步。对于USART来说大家几乎都用的异步通信。

    Synchronous:同步

    Single Wire(Half-Duplex):单线(半双工)模式

    Multiprocessor Communication:多处理器通信

    IrDA:Infrared Data Association,即IrDA协议栈,红外通信

    LIN:LIN总线是目前常见的一种A类网络协议。LIN的全称为Local Interconnect Network。LIN主要功能是为CAN总线网络提供辅助功能。局域互联网模式

    SmartCard:IC卡/智能卡模式




Hardware Flow Control (RS232):)是串口工作在异步模式下的选项,配置是否需要硬流控RTS 、CTS ;

    Disable:不进行配置

    CTS Only:(Clear ToSend,发送允许)为输入信号,用于判断是否可以向对方发送数据,低电平有效,低电平说明本设备可以向对方发送数据。

    RTS Only:(Require ToSend,发送请求)为输出信号,用于指示本设备准备好可接收数据,低电平有效,低电平说明本设备可以接收数据。

    CTS/RTS:假如串口1和串口2相互通信,都开了硬流控,那么就是串口1的RTS接串口2的CTS,串口1的CTS接串口2的RTS。

    Word Length : 数据位

    Parity :校验位

    Data Direction :数据方向

    Over Sampling:过样率

STM32 HAL库学习 (2) USART实验的更多相关文章

  1. STM32 HAL库学习系列第8篇---回调函数总结

    普通函数与回调函数的区别:就是ST将中断封装,给使用者的API,就是标准库的中断函数 对普通函数的调用: 调用程序发出对普通函数的调用后,程序执行立即转向被调用函数执行,直到被调用函数执行完毕后,再返 ...

  2. STM32 HAL库学习系列第1篇 ADC配置 及 DAC配置

    ADC工作均为非阻塞状态 轮询模式 中断模式 DMA模式 库函数: HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc);//轮询模式,需放 ...

  3. STM32 HAL库学习系列第6篇---定时器TIM 级联配置

    应用情景 使用定时器配置编码器模式,发现STM32只有两个定时器是32位,16位的测量值不够用,发现是可以使用两个16位定时器级联为32位的. 我是在使用编码器计数电机转速时使用,但是最终实现的效果不 ...

  4. STM32 HAL库学习系列第5篇 定时器TIM---编码器接口模式配置

    cube基本配置,外设开启编码器,串口2 可能大家在设置的时候有这个错误 错误:error:  #20: identifier "TIM_ICPOLARITY_BOTHEDGE" ...

  5. STM32 HAL库学习系列第4篇 定时器TIM----- 开始定时器与PWM输出配置

    基本流程: 1.配置定时器 2.开启定时器 3.动态改变pwm输出,改变值  HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1); 函数总结: __HAL_TIM ...

  6. STM32 HAL库学习系列第3篇 常使用的几种延时方式

    1   自带的hal_delay 函数    毫秒级延迟 void HAL_Delay(__IO uint32_t Delay) { uint32_t tickstart = HAL_GetTick( ...

  7. STM32 HAL库学习系列第2篇 GPIO配置

    GPIO 库函数 基本就是使用以下几个函数 GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); void H ...

  8. STM32 HAL库学习系列第7篇---定时器TIM 输入捕获功能

    测量脉冲宽度或者测量频率   基本方法 1.设置TIM2 CH1为输入捕获功能:  2.设置上升沿捕获:  3.使能TIM2 CH1捕获功能:  4.捕获到上升沿后,存入capture_buf[0], ...

  9. STM32 HAL库学习系列---定时器TIM 输入捕获功能

    基本方法 1.设置TIM2 CH1为输入捕获功能: 2.设置上升沿捕获: 3.使能TIM2 CH1捕获功能: 4.捕获到上升沿后,存入capture_buf[0],改为捕获下降沿: 5.捕获到下降沿后 ...

  10. 【书籍连载】《STM32 HAL 库开发实战指南—基于F7》-第一章

    从今天起,每天开始连载一章<STM32 HAL 库开发实战指南—基于F7>.欢迎各位阅读.点评.学习. 第1章  如何使用本书 1.1  本书的参考资料 本书参考资料为:<STM32 ...

随机推荐

  1. 运行代码后出现Process finished with exit code 0

    pycharm_运行不出结果,也不报错_Process finished with exit code 0用pycharm运行程序的时候,运行不出结果 ,也不报错,且正常退出解决1:将 run → e ...

  2. FastReport报表金额数字转大写问题

    在使用FastReport报表打印的时候涉及到财务结算金额时,会用到大写,系统保存的都为数字,将数字转换为大写没有默认的系统内置函数,经过查阅资料,可通过对FastReport的页面设计代码修改实现: ...

  3. ES6 函数的扩展 rest参数

    function add(...values) { let sum = 0; for (var val of values) { sum += val; } return sum; } add(2, ...

  4. 在 Linux 上微调 Nginx 获得最佳性能的 8 种方法

    转载来自:Linux迷链接:https://www.linuxmi.com/linux-nginx-performance.html NGINX 是一种流行的.免费的开源 Web 服务器.默认的 NG ...

  5. 微信小程序使用echart图表不随着页面滚动

    1,问题描述 使用echarts时界面滑动时,图标不跟随滑动,浮在元素上方. 2,最简单的方法 在ec-canvas中添加,force-use-old-canvas="true", ...

  6. 4组-Beta冲刺-4/5

    一.基本情况 队名:摸鲨鱼小队 组长博客:https://www.cnblogs.com/smallgrape/p/15604878.html github链接:https://github.com/ ...

  7. sat初学入门资料2022-12

    1. GlueMiniSatPPT-nabeshima.pdf A fast SAT solver with an aggressive acquiring strategy of glue clau ...

  8. 使用navicat连接本地数据库时,出现错误1251错误

    在安装完MySQL的时候,我们现在一般都使用Navicat来连接数据库,可惜出现下面的错误:1251-Client does not support authentication protocol r ...

  9. qt webassembly emscripten build 编译 环境搭建 JS调用C++传参

    环境搭建 本文主要是针对ubuntu/mac编译环境搭建和调试环境 可以直接参考下面的dockerfile qt wasm build docker pull colorlength/qt-webas ...

  10. vue使用echarts控制台报错Can't get DOM width or height并且地图显示超范围

    用echarts实现展示地图,但是地图显示的范围一直超出他那个div,同时报错. 完整报错信息: Can't get DOM width or height. Please check dom.cli ...