HAL库自学笔记#0【USART】

目录

绪言

一、USART整体工作框架梳理

1·波特率设置

2·DR寄存器

3·CR1、SR寄存器

 二、CubeMX工具快速配置


绪言

最开始作者是学的标准库,一次偶然的机会接触到了HAL库以及CubeMX这个工具。这才意识到ST公司推出的这个东西有多么强大。其实在刚开始的时候,身边有太多抵触HAL库的声音,说它完全脱离底层,让初学者只懂运用而不懂原理。这也导致我一开始对其也是很抵触的。直到最近自己尝试着学了之后,才发现是真的香。同时也意识到,其实自己之前学习固件库的时候其实也是半壶水,对原理了解得也不是很清楚。所以,立志成为六边形战士的我决定一边学习HAL库,一边去了解各个外设的底层工作原理。知其然的同时也知其所以然,这才是最重要的。现在想来之前一直不愿意学HAL库,更重要原因可能还是不愿意脱离自己的舒适区,奈何时代在变化,接收新事物才能促进我们的成长!

一、USART整体工作框架梳理

先来看ST给出的整体框图,按照我自己的理解,我将其分为了三部分。也是作为一个初学者常用的地方:

1·波特率设置

通过BRR寄存器实现分频,其中高16位保留,低16位为分频系数(USARTDIV),对总线时钟进行分频。

BRR寄存器中[15:4]位为整数部分,[3:0]位为小数部分,因此分频系数是一个定点小数。

波特率=fPCLK/USARTDIV/16=fPCLK/(USARTDIV*16)

(USARTDIV*16)相当于将USARTDIV左移四位,刚好将USARTDIV变成一个u16类型的整数。

例如:总线时钟为72MHz,我们需要9600的波特率

代入公式9600=72MHz/(USARTDIV*16)

USARTDIV=468.75

所以BRR[3:0]=0X0B、BRR[15:4]=0X01D4

即USART->BRR=0X1D4B

2·DR寄存器

由TDR和RDR两部分组成,主要用于缓存发送、接收的数据。同时连接移位寄存器和总线。我们平时收发数据主要就是通过这个寄存器和移位寄存器完成的。网上有种形象的描述方法如下图:

 这是一个发送数据的过程,我们通过总线将8或者9发子弹装入弹夹(TDR寄存器),弹夹自动将子弹上膛(移位寄存器)然后发送出去。接收数据就是这个过程的倒放。显然这个过程都要以一帧数据为基础(8bit或者9bit数据),如果弹夹中的子弹还没有完全上膛,这时我们又向弹夹中装8发子弹,肯定会装不下,也就会出现错误,接收数据同理。这里大概有个概念就行,后面讲完SR、CR寄存器之后,相信更便于理解。

3·CR1、SR寄存器

CR1寄存器:

TXEIE:TDR为空中断使能

TCIE:发送完成中断使能

RXNEIE:接收非空中断使能

TX:发送使能

RX:接收使能

还有一些位主要是用来配置串口的参数,例如串口使能、有无奇偶检验位啥的,很容易理解这里就不再赘述了。

对于新手而言,单看CR1寄存器的这几位,可能会觉得云里雾里,与SR寄存器结合起来看可能会好很多。

TXE(SR)、TXEIE(CR1):当TDR(弹夹)中的数据被硬件送到移位寄存器(弹膛)时,TXE会被置1,也就是说TDR寄存器为空,如果此时TXEIE=1,就会进入中断。

TC(SR)、TCIE(CR1):当移位寄存器里面的数据发送完成且TXE=1(TDR为空)时,(弹夹、弹膛都为空),如果此时TCIE=1就会触发中断。

RXNE(SR)、RXNEIE(CR1):RXNE被置1表示接收移位寄存器中的数据已经转移到RDR中了(RDR非空),如果这时RXNEIE=1,就会触发中断。

一般我们在用串口收发数据时,主要就用这几位。

下面单独说一下SR寄存器的ORE位:

该寄存器置1表示过载错误,即当RDR非空时,但是接收移位寄存器又需要向RDR转移数据,就会造成过载错误,即接收数据时(开枪图逆过程),弹夹已满的情况下,弹膛也满了,需要转移到弹夹。这时如果RDR还是没有被用户读取,那么移位寄存器中的数据会被后面接收到的数据覆盖掉,RDR无影响。

这大概就是底层一些常用的知识,还有很多细节没有讲到,大家可以去看ST的官方手册,里面有超详细的讲解。先浅浅总结一下。如下图:

 二、CubeMX工具快速配置

首先梳理一下CubeMX工具、HAL库、寄存器、串口之间的关系。这里还是采用抽象艺术的形式,如下图:

用户通过CubeMX工具图形化的配置串口,然后该工具自动生成基于HAL库初始化UART的代码,其他外设也亦是如此。生成的代码又去操作寄存器完成对串口的配置,这样串口就可以按照我们想要的状态工作了。

接下来看看CubeMX的配置页面:

这里作者采用的是STM32F103RBT6的芯片,可以看到配置需要关注的东西大概分为几个板块

 1)串口通道选择

2)工作模式:同步、异步······

3)串口的参数初始化:波特率、字长······

4)收发模式:只发、只收······

5)对应的引脚图

可以看出来,这些东西实际上就是去配置上面介绍的各种各样的寄存器。当然还有中断的配置等等也是大同小异。本文主要是为了梳理整个过程之间的相互关联以及串口工作原理,具体的代码和配置大家可以根据自己的项目去实践。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值