USART串口初始化源码解析
- [1. 源码解析---USART初始化](#1. 源码解析—USART初始化)
-
- [1.1 Usart1物理地址](#1.1 Usart1物理地址)
- [1.2 结构体初始化](#1.2 结构体初始化)
- [1.3 标志位选项设置](#1.3 标志位选项设置)
- [1.4 USART1时钟使能](#1.4 USART1时钟使能)
1. 源码解析---USART初始化
1.1 Usart1物理地址
找到 USART1 的定义



把地址相加得到USART1_BASE 等于 0x 4001 3800 和存储器映像里的usart1起始地址相同。
然后把USART1_BASE 强制类型转换为结构体类型。

这样就可以通过访问结构体成员变量来访问USART1里的各个寄存器 。
1.2 结构体初始化

得到串口初始化函数,可以理解和GPIO初始化相似,把我们设置的数据 赋给结构体变量。
那么huart1是什么呢 转定义得到

huart1是一个全局变量,将类型转定义得到

表明huart1是一个结构体变量,其中 第一个成员变量为 一个结构体指针,正是和USART1相同类型的结构体指针。

第二个成员是一个结构体,方便存放初始化信息

这些是与我们发送数据相关的变量

上面是与我们接收数据相关的变量

所以就不难看懂这个初始化内容了,第一行是把USART1地址给到Instance。下面就是将初始化信息存入结构体。
该结构体成员变量如下

1.3 标志位选项设置
找到相关源码转定义分析

转定义得到

找一两个查看理解即可,例如设置CR2寄存器

转定义得到

这个宏,先分析一下参数
第一个参数

就是CR2寄存器的地址,
第二个参数,

转定义得到 
就是把无符号的长整数 3左移12个比特位
简写为00...0011 0000 0000 0000 0000 ;
第三个参数就是 我们初始化设定的停止位


就是0x00000000;
然后来理解这个宏的作用
其实就是把CR2上对应的与停止位相关的比特位清零,然后再把参数三写入到对应位


这个宏就是把val赋给 reg ,

即先把第二个参数也就是 00...0011 0000 0000 0000 0000 按位取反得到 11...1100 1111 1111 1111
然后再与CR2按位与 把与停止位 对应的比特位清0
查询参考手册可得

左移12位后正好对应的就是位12 和位 13
然后再与 我们要写入的数据 也就是 0x 00000000
按位或 得到 位 12 和 位 13 都是0 ,即 00 ,然后再整体写入 CR2,查看参考手册得到 位 12 和位 13 都为0 表示 ,停止位为 1个比特位宽

这样就通过配置寄存器 完成了对停止位的配置,其他的配置也是如此。
1.4 USART1时钟使能
在我们进行USART1的配置前,只有先使能了USART1才可以对其进行初始化。所以在初始化函数前面 一定可以找到使能USART1的函数
如下

但是我们转定义发现没有具体实现

其实是在
这个文件里面

第一个为 USART1使能 ,第二个为USART1复用GPIO对应针脚的使能。


同理也是通过配置寄存器 使能 应为USART1由APB2总线使能,所以去找相关APB2使能外设寄存器如下


所以我们预测要想让USART1 使能,应该把APB2 外设时钟使能寄存器 的 位14置为1

关键代码

可以得到确实与我们预测的一样。 成功使能USART1
同理其他片上外设的使能也是如此。