USART串口初始化源码解析

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

同理其他片上外设的使能也是如此。

相关推荐
磁场转动100万匹2 分钟前
Hive 学习第一天:搞懂它是什么,并搭好可用的环境
hive·hadoop·学习
黑妹天下第一乖4 分钟前
小智改造实战解读-首 token 延迟去哪了:云端与端侧大模型的分段对照
开发语言·人工智能·python·嵌入式硬件·自然语言处理·iot
dadaobusi28 分钟前
RDMA最新进展
学习
我命由我1234532 分钟前
金融租赁极简理解
经验分享·学习·职场和发展·金融·求职招聘·职场发展·学习方法
辣知1 小时前
辣知·化智75 道德经带给现代人的智慧
学习
小黄人软件1 小时前
aipy 智能体学习2:源码运行执行轨径主干
学习
JWASX1 小时前
Java 转 go 学习 - dubbo-go(1)
学习·golang
磁场转动100万匹1 小时前
Hive 学习第三天:HQL 查询精讲与内置函数实战
hive·hadoop·学习
JWASX1 小时前
go 学习 - prometheus 指标学习
学习·golang·prometheus
myy-learn1 小时前
ARM-I2C 驱动优化与 LM75 温度传感器读取实践
arm开发·单片机·嵌入式硬件