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

目的

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

HAL库使用UART非常简单,LL库相对来说会稍微麻烦一点点。HAL库设计了三套数据首发了模式,你可以选择其中一套使用,这对新手来说上手可以非常快,但现实情况中这三套模式其实不是那么实用的,你如果想要在此基础上做些改变就会麻烦。UART中使用LL库相对来说是个更好的选择,这篇文章先讲下LL库中使用UART的基本操作。

基础说明与初始化

基础说明

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

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

初始化配置

使用STM32CubeIDE或STM32CubeMX来初始化UART的话我们一般只要根据需求设置基本参数、中断、DMA即可,如下图所示:
在这里插入图片描述
使用中如果需要更改相关参数的话可以直接按照软件生成的初始化程序来,也可以使用LL库中提供的修改单独参数的方法:

  • LL_USART_SetBaudRate(USART_TypeDef *USARTx, uint32_t PeriphClk, uint32_t OverSampling, uint32_t BaudRate)
    设置通讯波特率;
  • LL_USART_SetDataWidth(USART_TypeDef *USARTx, uint32_t DataWidth)
    设置数据位长度;
  • LL_USART_SetStopBitsLength(USART_TypeDef *USARTx, uint32_t StopBits)
    设置停止位长度;
  • LL_USART_SetParity(USART_TypeDef *USARTx, uint32_t Parity)
    设置校验位;
  • LL_USART_SetTransferDirection(USART_TypeDef *USARTx, uint32_t TransferDirection)
    设置传输方向;
  • LL_USART_SetHWFlowCtrl(USART_TypeDef *USARTx, uint32_t HardwareFlowControl)
    设置硬件流控制;
  • LL_USART_SetOverSampling(USART_TypeDef *USARTx, uint32_t OverSampling)
    设置过采样;

在这里插入图片描述

数据接收和发送

HAL库中UART的数据接收和发送设计了轮询、中断、DMA三种方式来使用,这篇文章中将介绍下LL库中这三种基础的使用方式。

轮询方式

如果只是要测试串口收发数据的话,轮询方式不管是配置还是使用都是最简单的,先看下面演示:
在这里插入图片描述
上面演示中软件配置中只是使能了USART1,将其设置成异步模式,然后将相关的库设置为LL库,其它的都没改,在生成的程序中在主循环中添加了少量代码就实现了将收到的数据回传的功能。其中涉及的方法如下:

  • uint32_t LL_USART_IsActiveFlag_RXNE(USART_TypeDef *USARTx)
    查询是否有收到可读取的数据;
  • uint8_t LL_USART_ReceiveData8(USART_TypeDef *USARTx)
    读取收到的数据,读取后会自动清除RXNE标志位;
  • uint32_t LL_USART_IsActiveFlag_TXE(USART_TypeDef *USARTx)
    查询是否可以向发送数据寄存器写数据;
  • void LL_USART_TransmitData8(USART_TypeDef *USARTx, uint8_t Value)
    将数据写入发送数据寄存器,写入后数据将自动发送;

中断方式

上面的轮询方式在实际项目中通常使用率不是那么高,中断的方式更加常用些,先看下面演示:
在这里插入图片描述
上面演示中除了软件自动生成的代码手动添加的代码只有开启中断已经中断回调函数中的操作,新涉及的方法如下:

  • void LL_USART_EnableIT_RXNE(USART_TypeDef *USARTx)
    使能RXNE中断;
  • uint32_t LL_USART_IsEnabledIT_RXNE(USART_TypeDef *USARTx)
    查询是否是RXNE中断;

上面例子中只用到了接收中断,发送中断也有相应的方法使能和查询。另外可以用 LL_USART_ClearFlag_.... 方法来清除中断标志。

DMA方式

和中断方式相比使用DMA方式使用频率就更高了,先看下面演示:

  • 初始化配置
    在这里插入图片描述
  • 测试代码
    在这里插入图片描述
  • 通讯测试
    在这里插入图片描述

上面演示中除了软件自动生成的代码,我们需要手动添加下面这些内容来启用相应功能:

  • 设置外设地址
    void LL_DMA_SetPeriphAddress(DMA_TypeDef* DMAx, uint32_t Stream, uint32_t PeriphAddress)
    使用上面方法来设置外设地址,这个演示中指USART的DR寄存器地址,通过下面方法获取:
    uint32_t LL_USART_DMA_GetRegAddr(USART_TypeDef *USARTx)
  • 设置内存地址
    void LL_DMA_SetMemoryAddress(DMA_TypeDef* DMAx, uint32_t Stream, uint32_t MemoryAddress)
    使用上面方法来设置内存地址,这个演示中指接收或发的数组数据;
  • 设置数据长度
    void LL_DMA_SetDataLength(DMA_TypeDef* DMAx, uint32_t Stream, uint32_t NbData)
    使用上面方法来设置要传输的数据长度;
  • 使能相应的中断
    void LL_DMA_EnableIT_TC(DMA_TypeDef *DMAx, uint32_t Stream)
    这个演示中使用了上面方法来开启DMA传输完成中断;
  • 使能USART的DMA传输
    void LL_USART_EnableDMAReq_RX(USART_TypeDef *USARTx)
    void LL_USART_EnableDMAReq_TX(USART_TypeDef *USARTx)
    使用上面方法分别使能USART通过DMA传输数据;
  • 启动DMA传输
    void LL_DMA_EnableStream(DMA_TypeDef *DMAx, uint32_t Stream)
    使用上面方法后数据将开始传输;

上面演示中在中断回调函数中我们进行了下面的操作:

  • 判断中断事件类型
    uint32_t LL_DMA_IsActiveFlag_xxx(DMA_TypeDef *DMAx)
    使用上面方法来判断中断类型;
  • 清除中断标志
    void LL_DMA_ClearFlag_xxx(DMA_TypeDef *DMAx)
    使用上面方法来清除中断标志;
  • 停止已完成的DMA传输
    void LL_DMA_DisableStream(DMA_TypeDef *DMAx, uint32_t Stream)
    使用上面方法可以停止DMA传输;
  • 添加所需的功能代码
    上面演示中我在接收完成中断中启动了USART DMA发送功能,将收到的数据回发;在发送完成中断中重新启动了USART DMA接收功能;

总结

用LL库来使用UART相比HAL库也并没有复杂太多,不过和HAL库对于各种芯片有着较好兼容性不同的是LL库对于各种芯片的兼容性不怎么好,比如STM32F4系列的芯片中DMA涉及Stream,而STM32F1系列芯片的DMA并没有Stream却有Channel,两者代码上无法直接套用。
事实上这篇文章中的各个演示只是介绍了下LL库中UART的基本使用方法,实际项目中通常不会这么用,更常见的使用方法将在后面的文章中介绍。

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Naisu Xu

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

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

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

打赏作者

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

抵扣说明:

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

余额充值