【Day10】:库函数包装—对於底层暂存器的操纵(上)

什麽是暂存器 register?

暂存器顾名思义就是可以存放资料的地方,那也就是记忆体的一种罗? 记忆体Block2这块区域用来设计单晶片上的外设,他们以4个word为一个单元,共32位(STM32的资料汇流排宽度为32位,因此理当以32位做为一个暂存器),每一个单元对应到不同的功能,只要我们控制这些单元就可以改变外设的行为。
这时就显现C语言的好处了,我们可以直接利用指标的方式操作这些单元,但如果每次都是用指标的方式,不仅程序码难以阅读,每次写程序的时候还要去翻阅资料,看某一个单元的地址为何。因此我们会以功能来命名这些记忆体,这个别名就是我们常说的暂存器,而将已配好地址、有特定功能的记忆体取别名的过程就叫做暂存器映射
https://github.com/Meta-Team/Datasheets/blob/master/STM32F4/STM32F4xx%E4%B8%AD%E6%96%87%E5%8F%82%E8%80%83%E6%89%8B%E5%86%8C.pdf
这里可以下载《STM32F4xx中文参考手册》,里面详细介绍了STM32F4的暂存器每个bit代表什麽以及使用方式。

外设地址映射

单晶片上外设分为4条总线,根据外设速度不同,不同汇流排挂载着不同的外设,APB挂载低速设备,AHB挂载高速设备,每一个汇流排的最低地址被称为该汇流排的基地址。
汇流排上挂载着各种外设,这些外设也有自己的地址范围,特定外设的首个地址称为XX外设机地址,这些在《STM32F4xx中文参考手册》都有详细的介绍,这里我们以GPIO来讲解。

外设名称 外设基地址 相对AHB1汇流排的地址偏移
GPIOA 0x4002 0000 0x0
GPIOB 0x4002 0400 0x0000 0400
GPIOC 0x4002 0800 0x0000 0800
GPIOD 0x4002 0C00 0x0000 0C00
GPIOE 0x4002 1000 0x0000 1000
GPIOF 0x4002 1400 0x0000 1400
GPIOG 0x4002 1800 0x0000 1800
GPIOH 0x4002 1C00 0x0000 1C00

从上表我们可以看到GPIOA的基地址相对於AHB1汇流排的地址偏移为0,也就是AHB1的第一个外设就是GPIOA

处於XX外设的地址范围内的就是该外设的暂存器。以GPIO外设为例,GPIO有很多暂存器,每一个都有特定的功能。每个暂存器为32位,在该外设的基地址上按照顺序排列,暂存器的位置都以相对於外设基地址的偏移来描述。这里以GPIOH端口为例,来了解GPIO实际上到底有那些暂存器。

暂存器名称 暂存器地址 相对GPIOH基地址的偏移
GPIOH_MODER 0x4002 1C00 0x00
GPIOH_OTYPER 0x4002 1C04 0x04
GPIOH_OSPEEDR 0x4002 1C08 0x08
GPIOH_PUPDR 0x4002 1C0C 0x0C
GPIOH_IDR 0x4002 1C10 0x10
GPIOH_ODR 0x4002 1C14 0x14
GPIOH_BSRR 0x4002 1C18 0x18
GPIOH_LCKR 0x4002 1C1C 0x1C
GPIOH_AFRL 0x4002 1C20 0x20
GPIOH_AFRH 0x4002 1C24 0x24

有关各个暂存器的说明都可以在《STM32F4xx中文参考手册》中暂存的部分找到,这里我们以GPIO端口置位/复位暂存器为例(GPIOx_BSRR),介绍如何理解暂存器的说明。
https://ithelp.ithome.com.tw/upload/images/20210911/20141525RfiAbWPqg3.jpg

  1. 名称
    这应该不用多做介绍了吧,就是这个暂存器的名称,x可以适用於英文字母A~I也就是GPIOA、GPIOB、...、GPIOI这些暂存器。
  2. 偏移地址
    偏移地址是指此暂存器相对於这个外设的基地址。例如这个暂存器的偏移地址是0x18,GPIOA外设的基地址是0x4002 0000,於是可以算出GPIOA的GPIOA_BSRR暂存器的位置为:0x4002 0418
  3. 暂存器位表
    位表中列出0~31位的名称和权限。上方的数字为编号,中间为位名称,最下方为读写权限。r代表只读、w代表只写、rw表示可读可写。这个暂存器的权限是w,所以只能写,但你还是可以试着读读看,但并不保证一定读出正确值。
  4. 位功能说明
    这是暂存器说明最重要的一部份。本暂存器有两种暂存器位,BRy及BSy,其中y数值为0~15,如BR0、BS0用於控制GPIOx的第0个脚

小结

上面有关暂存器的内容,只是要帮助大家更好的理解C语言如何控制读写暂存器,我们实际上在使用单晶片的时候当然不会直接去操纵那些暂存器,那样太没有效率了,明天我们会介绍STM32是如何使用C语言来对暂存器做封装。


<<:  ASP.NET MVC 从入门到放弃(Day19)-MVC模型(Model)介绍

>>:  [区块链&DAPP介绍 Day16] Solidity 教学 - libraries

Day 29 : 案例分享(9) 活动 - 线上报名、线上缴费及线上会议

案例说明及适用场景 基本上适用於所有需要活动举办的相关场域 整合网站及线上购物模组,用於广告行销及线...

IKE与ISAKMP

Internet金钥交换(IKE)是IPsec的关键体系结构组件。 它用於执行相互身份验证以及建立...

Day 10-假物件 (Fake) - 虚设常式 (Stub)-2 (核心技术-2)

看程序码说故事 (Stub-2) 前景提要,昨天提到开发者要开发 Email 通知系统,於是他就利用...

执行弱点扫描之後

我们终於完成了主机的弱点扫描 接下来,各系统的管理员该做些什麽呢? 弱点扫描有以下限制 仅能扫描已知...

铁人赛 Day3 -- Div区块到底是什麽 ? 能吃吗 ?

Div 区块式HTML中最最最最最常也是一定会用到的 Div 简单来讲就是一个区域。 假设我们的整个...