STM32学习日志2020/11/13

STM32学习日志 2020/11/13

  • 学习目标
  • 学习内容
  • 学习时间
  • 学习产出
    • 例程学习套路:
    • usrt相关知识点

学习目标

目标(目的+标准)


学习内容

串口通讯例程
按键开关例程

内容(详细,精准)


学习时间

23:00~24:15 睡觉保命。

学习产出

例程学习套路:

1清楚例程目的

  • 这个例程是用来实现什么功能的,有哪些用途?

2硬件部分

  • 主要看看都有什么硬件资源可以用,以及如何去用(即通过看原理图明白是低电平还是高电平有效)除此之外,还要看有没有上/下拉电阻(怎么判断何时需要拉电阻呢?)

3软件部分:

  • 一、首先研究HARDWARE中的两类文件:.c文件和.h文件,明白里面的代码是什么意思,之后尝试自己去设计代码进行编写。
    .c文件里面往往有初始化函数,用于对某个GIOP的引脚进行初始化, 在这个初始化中一般会有:
    1.开启时钟
    2.配置引脚状态(引脚选择、输入/输出模式、上下拉、速度) 除了初始化函数之外,还会有自定义功能函数,用于设置一些特定的功能。
    二、再对照.c中不太明白的部分看看相应的.h文件,一般可以找到答案。
    三、研究main.c文件。 这里面必有的操作: 1初始化HAL库
    2设置时钟
    3初始化延时函数
    4始化各种所需要的函数(一般再之前的.c文件中已经定义过了,在这里直接调用就行)
    5.while(1)的存在,使这个功能一直持续下去。
    四、小技巧:
    1.按键中,通过不断地返回某个值来设置“长按”。
    2.通过宏定义说明一些数值的功能,便于理解与维护
    3.善用switch函数,清晰易懂。

usrt相关知识点

什么是波特率?什么是分数波特率?

波特率就是调制速率,即单位时间内载波调制状态的变化次数。用来表示单片机在串口通讯时的速度。

上面这句话很难理解波特率是什么。。(什么是调制,什么是载波,什么是调制状态的变化,都有什么状态可以变化?如何进行变化?。。。)
我们避开晦涩难懂的专业词汇,举例子说明波特率是什么。

首先我们先说明一个概念:串口的信息传递速率有时钟频率和波特率共同决定。如何决定呢?举一个例子:

假设系统时钟50MHz,波特率为115200。

①系统时钟50M很好理解,即为时钟周期为1/50M(s)。
同时我们假设:1个时钟周期可以计数1次,那么50M的时钟1s可以计50*10^6个数,这也就是说,每计1个数,需要花费1/50M(s).

②接下来是波特率115200,它的意思是1s传输115200个二进制数,(115200bit)
那么传输1bit需要1/115200 (s) = 8.68 (us)

①+②我们同时考虑时钟频率和波特率:
每传输1bit数据,系统时钟就会数15010^6/115200 = 434个数

也就是说,我们算出了每传输1bit数据,时钟就会计数434次,那么知道这个有什么用呢?

我们先暂且把这个问题放到一边,先看看串口传输是怎么一回事。
③串口传输,先上图:
STM32学习日志2020/11/13_第1张图片

我们在进行串口数据传输时,往往是以一个字符帧为单位进行传输的。
什么是字符帧呢?从图中很好理解,一个字符帧由起始位、有效数据位,奇偶检验位(可以没有)、停止位组成。

在这里,起始位和停止位是必须的(这两个位就像高中生物里mRNA的起始密码子和终止密码子一样)

有效数据位有8个bit,我们敏锐的发现就是1个Byte(字节)
而奇偶检验位是用于在接收数据时判断接受的数据是否正确,至于如何判断,去翻翻数电课本吧。。

到这里,我们知道了一个字符帧会包含10个bit(不含奇偶检验)而在①+②处,我们推出了每传输1bit数据,时钟会计数434次,那么每传输一个Byte(8个bit)的有效数据,时钟就会计数434*10次,所需的时间为8.68 us * 10 = 86.8 us.

而我们知道一般用ASC II码来表示一个字符,这一个Byte就可以用来存储一个字符,这样的一组码(8个bit)也叫码元。注意啦,比特率和波特率的区别就在于此,波特率指每秒钟传送的码元数,而比特率指每秒种传送的bit数。

在这里我们也能够推导出到波特率的计算公式:
A.波特率115200 = 115200 (位/秒)【这里仅考虑单片机里的波特率】

B.如果没有奇偶检验位,就是将10个bit打包位一个Byte
波特率115200 = 115200 (位/秒) = 115200/10 = 11520(字节/秒)

C.再除以1024,就是KB
波特率115200 = 11520 (字节/秒) = 11.25 (KB/秒)

④采样数据
我们需要知道在哪里采样?什么时候取采样?
看到了那个有效数据位么?我们就是在有效数据里的8个bit分别进行采样。为了保证采样得到的数据是准确无误的,一般在每个bit的最中间进行采样(图)
STM32学习日志2020/11/13_第2张图片

STM32学习日志2020/11/13_第3张图片
由上面那张图,我们可以清楚的看到采样的数据为:10101010,化成16进制就是0xAA,这里没有对应ASCII码就是字符 - -||

⑤回答这个问题:
我们算出了每传输1bit数据,时钟就会计数434次,那么知道这个有什么用呢?
其实并没有什么用,我们只想利用这个434来当作一个flag,它用来把控串口通信的进度而已。


# 学习总结 按键和串口通讯的前一部分,发现需要将HAL库和寄存器两本历程结合起来看,不然有很多寄存器的知识不知道,导致没法理解软件层面的内容。

你可能感兴趣的:(学习历程,stm32)