3.什么是寄存器
本文最后更新于61 天前,其中的信息可能已经过时,如有错误请发送邮件到2428505532@qq.com
  • 我在学完这一节后知道了寄存器是我们在使用微处理器时最重要的部分,我们写的程序变量要存放在寄存器,芯片读取也需要它所以今天的这篇是记录一些关于寄存器的常识
  • 话不多说,我们即刻开始吧~
  • 首先STM32的芯片中有着内核与片上外设,这俩部分的关系就像CPU与主板,内存,显卡,硬盘的关系。STM32F103采用的是 Cortex-M3内核,由ARM公司设计,出售芯片技术授权给SOC,例如ST,TI,他们给内核加上片上外设,这才变成一个完整的芯片。整个芯片的两个部分采用总线连接起来。
  • ①ICode总线是指令,存放在flash中。内核要读取指令,就需要通过 ICode总线。
  • ②DCode总线和DM总线 A是数据的传输通道,我们写数据有常量与变量之分,常量被放在内部 flash中,而变量则全部存放在SRAM中,被DCode总线和DMA总线访问,当然僻免访问冲突,在取数时会有一个总线矩阵来判别。
  • ③系统总线主要是访问外设的寄存器,我们常说寄存器编程就是从这里进入内核中的。
  • 说完了主动单元,我们来总结总结被动单元。其实上面也提到了一些
  • ①内部闪存 flash,我们写好的程序就在这。
  • ②内部SRAM,这个很像电脑的运行内存,我们常叫RAM,是用来存储变量的
  • ③FSMC,这个是 STM32F10xx一个很有特色的外设,可以扩展静态内存,(注意这个不是RAM哦~)
  • ④AHB到APB的桥,它连接着芯片与板上外设,这个是我们学习STM32的重点,我们需要编程这些外设驱动外界的各种设备。
  • 关于芯片的介绍到这就万事俱备了,现在只欠东风,如何找到寄存器。
  • 我们的开发板是 32位开发板,总的线性寻址内存有 4GB,这些静态内存被折成 8 个部分,每个部分占 512MB,这每个 512MB又被分成了很多个地址用来代表着我们每一个完整“小硬件”这就是寄存器映射,如果我们有扩展内存,就可以在分配一个新地址,这又叫重映射。
  • 我们找到GPIOB端口的输出数据寄存器ODR的地址是0x40010C0C(至于这个地址如何找到可以先跳过,后面我们会有详细的讲解),ODR寄存器是32bit,低16bit有效,对应着16个外部IO,写0/1对应的的IO则输出低/高电平。现在我们通过C语言指针的操作方式,让GPIOB的16个IO都输出高电平。
       // GPIOB 端口全部输出 高电平
       *(unsigned int*)(0x4001 0C0C) = 0xFFFF
  • 通过绝对地址访问内存单元不好记忆且容易出错,我们可以通过寄存器的方式来操作。

// GPIOB 端口全部输出 高电平
#define GPIOB_ODR
(unsigned int*)(GPIOB_BASE+0x0C)
* GPIOB_ODR = 0xFF;
  • 为了方便操作,我们干脆把指针操作“*”也定义到寄存器别名里面。
// GPIOB 端口全部输出 高电平
#define GPIOB_ODR
*(unsigned int*)(GPIOB_BASE+0x0C)
GPIOB_ODR = 0xFF;
线性寻址地址
  • 序号 用途 地址范围
    Block 0 Code 0x0000 0000 ~ 0x1FFF FFFF (512MB)
    Block 1 SRAM 0x2000 0000 ~ 0x3FFF FFFF (512MB)
    Block 2 片上外设 0x4000 0000 ~ 0x5FFF FFFF (512MB)
    Block 3 FSMC 的 bank1 ~ bank2 0x6000 0000 ~ 0x7FFF FFFF (512MB)
    Block 4 FSMC 的 bank3 ~ bank4 0x8000 0000 ~ 0x9FFF FFFF (512MB)
    Block 5 FSMC 寄存器 0xA000 0000 ~ 0xCFFF FFFF (512MB)
    Block 6 没有使用 0xD000 0000 ~ 0xDFFF FFFF (512MB)
    Block 7 Cortex-M3 内部外设 0xE000 0000 ~ 0xFFFF FFFF (512MB)
  • STM32 的外设地址映射:总线上挂载着各种外设,这些外设也有自己的地址范围,特定外设的首个地址称为“XX外设基地址”,也叫XX外设的边界地址。
外设地址映射

外设名称 外设基地址 相对APB2总线的地址偏移
GPIOA 0x4001 0800 0x0000 0800
GPIOB 0x4001 0C00 0x0000 0C00
GPIOC 0x4001 1000 0x0000 1000
GPIOD 0x4001 1400 0x0000 1400
GPIOE 0x4001 1800 0x0000 1800
GPIOF 0x4001 1C00 0x0000 1C00
GPIOG 0x4001 2000 0x0000 2000

  • 外设寄存器:在XX外设的地址范围内,分布着的就是该外设的寄存器。以GPIO外设为例,GPIO是通用入输出端口的简称,简单来说就是STM32可控制的引脚,基本功能是控制引脚输出高电平或者低电平。最简单的应用就是把GPIO的引脚连接到LED灯的阴极,LED灯的阳极接电源,然后通过STM32控制该引脚的电平,从而实现控制LED灯的亮灭
  • GPIO 有很多个寄存器,每一个都有特定的功能。每个寄存器为32bit,占四个字节,在该外设的基地址上按照顺序排列,寄存器的位置都以相对该外设基地址的偏移地址来描述。这里我们以GPIOB 端口为例,来说明GPIO都有哪些寄存器
GPIOB端口的寄存器地址列表

寄存器名称 寄存器地址 相对GPIOB基址的偏移
GPIOB_CRL 0x4001 0C00 0x00
GPIOB_CRH 0x4001 0C04 0x04
GPIOB_IDR 0x4001 0C08 0x08
GPIOB_ODR 0x4001 0C0C 0x0C
GPIOB_BSRR 0x4001 0C10 0x10
GPIOB_BRR 0x4001 0C14 0x14
GPIOB_LCKR 0x4001 0C18 0x18

今日日期 2026.4.11

文末附加内容
上一篇
下一篇