[嵌入式]寄存器方式点亮流水灯

本文介绍了STM32F103系列芯片的存储器映射和寄存器映射原理,详细阐述了GPIO端口的初始化设置,以及如何通过GPIOB、GPIOC、GPIOD控制LED灯轮流闪烁。通过理解存储器的Block0、Block1和Block2功能,以及寄存器映射的概念,读者能够掌握STM32的外设地址映射和C语言对寄存器的封装。文章最后给出了使用STM32F103C8T6搭建的LED流水灯电路和代码实现。
摘要由CSDN通过智能技术生成

一、STM32F103系列芯片的存储器映射和寄存器映射原理

1.存储器映射

存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,给存储器分配地址 的过程就称为存储器映射,具体见下图。如果给存储器再分配一个地址就叫存储器重映射。

img

存储器区域功能划分

在这 4GB 的地址空间中,ARM 已经粗线条的平均分成了 8 个块,每块 512MB,每个 块也都规定了用途,具体分类见表格 6-1。每个块的大小都有 512MB,显然这是非常大的,芯片厂商在每个块的范围内设计各具特色的外设时并不一定都用得完,都是只用了其中的 一部分而已。

存储器功能分类

序号 用途 地址范围
Block0 Code 0x0000 0000 ~ 0x1FFF FFFF(512MB)
Block1 SRAM 0x2000 0000 ~ 0x3FFF FFFF(512MB)
Block2 片上外设 0x4000 0000 ~ 0x5FFF FFFF(512MB)
Block3 FSMC的bank1~bank2 0x6000 0000 ~ 0x7FFF FFFF(512MB)
Block4 FSMC的bank3~bank4 0x8000 0000 ~ 0x9FFF FFFF(512MB)
Block5 FSMC寄存器 0xA000 0000 ~ 0xCFFF FFFF(512MB)
Block6 没有使用 0xD000 0000 ~ 0xDFFF FFFF(512MB)
Block7 Cortex-M3内部外设 0xE000 0000 ~ 0xFFFF FFFF(512MB)

在这 8个 Block里面,有 3个块非常重要,也是我们最关心的三个块。Block0用来设计 成内部 FLASH,Block1 用来设计成内部 RAM,Block2 用来设计成片上的外设,下面我们 简单的介绍下这三个 Block 里面的具体区域的功能划分。

存储器 Block0 内部区域功能划分

Block0 主要用于设计片内的 FLASH,我们使用的 STM32F103ZET6(霸道)和 STM32F103VET6(指南者)的 FLASH 都是 512KB,属于大容量。要在芯片内部集成更大 的 FLASH 或者 SRAM 都意味着芯片成本的增加,往往片内集成的 FLASH 都不会太大,ST 能在追求性价比的同时做到512KB,实乃良心之举。Block内部区域的功能划分具体见下表。

用途说明 地址范围
Block0 预留 0x1FFE C008 ~ 0x1FFF FFFF
Block0 选项字节:用于配置读写保护、 BOR 级别、软件/硬件看门狗以及器 件处于待机或停止模式下的复位。当 芯片不小心被锁住之后,我们可以从 RAM 里面启动来修改这部分相应的 寄存器位。
Block0 系统存储器:里面存的是ST出厂时 烧 写 好 的 isp 自 举 程 序 ( 即 Bootloader),用户无法改动。串口 下载的时候需要用到这部分程序。 0x1FFF F000- 0x1FFF F7FF
Block0 预留 0x0808 0000 ~ 0x1FFF EFFF
Block0 FLASH:我们的程序就放在这里。 0x0800 0000 ~ 0x0807 FFFF (512KB)
Block0 预留 0x0008 0000 ~ 0x07FF FFFF
Block0 取决于 BOOT引脚,为 FLASH、系 统存储器、SRAM 的别名。 0x0000 0000 ~ 0x0007 FFFF

存储器Block1内部区域功能划分

Block1 用 于 设 计 片 内 的 SRAM 。 我 们 使 用 的 STM32F103ZET6 ( 霸 道 ) 和 STM32F103VET6(指南者)的 SRAM 都是 64KB,Block 内部区域的功能划分具体下表。

用途说明 地址范围
Block1 预留 0x2001 0000 ~ 0x3FFF FFFF
Block1 SRAM 64KB 0x2000 0000 ~0x2000 FFFF

Block2 用于设计片内的外设,根据外设的总线速度不同,Block 被分成了 APB 和 AHB 两部分,其中 APB 又被分为 APB1 和 APB2,具体见下表。

用途说明 地址范围
Block2 APB1总线外设 0x4000 0000 ~ 0x4000 77FF
Block2 APB2总线外设 0x4001 0000 ~ 0x4001 3FFF
Block2 AHB总线外设 0x4001 8000 ~ 0x5003 FFFF

2.寄存器映射

我们知道,存储器本身没有地址,给存储器分配地址的过程叫存储器映射,那什么叫 寄存器映射?寄存器到底是什么?

在存储器 Block2 这块区域,设计的是片上外设,它们以四个字节为一个单元,共 32bit, 每一个单元对应不同的功能,当我们控制这些单元时就可以驱动外设工作。我们可以找到 每个单元的起始地址,然后通过 C 语言指针的操作方式来访问这些单元,如果每次都是通 过这种地址的方式来访问,不仅不好记忆还容易出错,这时我们可以根据每个单元功能的 不同,以功能为名给这个内存单元取一个别名,这个别名就是我们经常说的寄存器,这个 给已经分配好地址的有特定功能的内存单元取别名的过程就叫寄存器映射。

比如,我们找到 GPIOB 端口的输出数据寄存器 ODR 的地址是 0x4001 0C0C(至于这 个地址如何找到可以先跳过,后面我们会有详细的讲解),ODR 寄存器是 32bit,低 16bit 有效,对应着 16 个外部 IO,写 0/1 对应的的 IO 则输出低/高电平。现在我们通过 C 语言指 针的操作方式,让 GPIOB 的 16 个 IO 都输出高电平。

通过绝对地址访问内存单元

 // GPIOB 端口全部输出 高电平
 *(unsigned
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值