在51单片机中:
首先我们看看 51 中是怎么做的。51 单片机开发中经常会引用一个 reg51.h 的头文件,下面我们看看他是怎么把名字和寄存器联系起来的:

sfr P0 =0x80;

sfr 也是一种扩充数据类型,点用一个内存单元,值域为 0~255。利用它可以访问 51 单片
机内部的所有特殊功能寄存器。如用 sfr P1 = 0x90 这一句定义 P1 为 P1 端口在片内的寄存
器。然后我们往地址为 0x80 的寄存器设值的方法是:P0=value;
在STM32中:
在 STM32 中,同样也可以这样做,但是 STM32 因为寄存器太多太多,如果以这样的方式一一列出来,那要好大的篇幅,既不方便开发,也显得太杂乱无序的感觉。所以 MDK 采用的方式是通过结构体来将寄存器组织在一起。下面我们就讲解 MDK 是怎么把结构体和地址对应起来的,为什么我们修改结构体成员变量的值就可以达到操作对应寄存器的值。这些事情都是在stm32f10x.h文件中完成的。我们通过 GPIOA 的几个寄存器的地址来讲解。
(1)寄存器地址映射表
从这个表我们可以看出,GPIOA 的 7 个寄存器都是 32 位的,所以每个寄存器占有 4个地址,一共占用 28 个地址,地址偏移范围为(000h~01Bh)。这个地址偏移是相对 GPIOA的基地址而言的。GPIOA 的基地址是怎么算出来的呢?因为 GPIO 都是挂载在 APB2 总线之上,所以它的基地址是由 APB2 总线的基地址+GPIOA 在 APB2 总线上的偏移地址决定的。同理依次类推,我们便可以算出 GPIOA 基地址了。下面我们打开 stm32f10x.h 定位到 GPIO_TypeDef 定义处:

typedef struct
{__IO uint32_t CRL;__IO uint32_t CRH;__IO uint32_t IDR;__IO uint32_t ODR;__IO uint32_t BSRR;__IO uint32_t BRR;__IO uint32_t LCKR;
} GPIO_TypeDef;

然后定义到:

#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)

GPIOA 是将 GPIOA_BASE 强制转换为 GPIO_TypeDef 指针,这句话的意思是,GPIOA 指向地址GPIOA_BASE,GPIOA_BASE 存放的数据类型为 GPIO_TypeDef。

然后查看 GPIOA_BASE的宏定义:

#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)

可知GPIOA 的基地址是 APB2 总线的基地址+GPIOA 在 APB2 总线上的偏移地址

依次类推,可以找到最顶层:

#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
#define PERIPH_BASE ((uint32_t)0x40000000)

所以我们便可以算出 GPIOA 的基地址位:

GPIOA_BASE= 0x40000000+0x10000+0x0800=0x40010800

(2)GPIOA 的 7 个寄存器的地址如何计算:

GPIOA 的寄存器的地址=GPIOA 基地址+寄存器相对 GPIOA 基地址的偏移值这个偏移值在上面的寄存器地址映像表中可以查到。

(3)结构体里面这些寄存器又是怎么与地址一一对应的:
这里就涉及到结构体的一个特征,那就是结构体存储的成员他们的地址是连续的。上面讲到 GPIOA 是指向GPIO_TypeDef 类型的指针,又由于 GPIO_TypeDef 是结构体,所以自然而然我们就可以算出 GPIOA 指向的结构体成员变量对应地址了。

我们可以把 GPIO_TypeDef 的定义中的成员变量的顺序和 GPIOx 寄存器地址映像对比可以发现,他们的顺序是一致的,如果不一致,就会导致地址混乱了。这就是为什么固件库里面:GPIOA->BRR=value;就是设置地址为 0x40010800+0x014(BRR 偏移量)=0x40010814 的寄存器 BRR 的值了。它和 51 里面 P0=value 是设置地址为 0x80 的 P0 寄存器的值是一样的道理。

MDK寄存器地址映射分析相关推荐

  1. (四)STM32F407总线架构、时钟系统配置相关的函数,IO 引脚复用器和映射,NVIC中断管理,寄存器地址映射

    基础知识 一.GPIO输入输出各种模式 二.STM32F407总线架构 三.STM32F407时钟系统 (1) STM32F4 时钟树概述 (2)STM32F4 时钟初始化配置 (3)STM32F4 ...

  2. 寄存器地址映射+寄存器各位定义+中断号定义

    如何实现: 一.寄存器地址映射 二.寄存器各位定义 三.中断号定义 关于一,怎么说呢,可以参考一下<STM32F4开发指南--库函数版本>里边的4.6小节"MDK中寄存器地址名称 ...

  3. 【Windows 逆向】OD 调试器工具 ( 分析 OD 硬件断点处的关键代码 | 添加硬件断点 | 关键代码 | MOV 指令 | EAX 寄存器值分析 | 使用命令查看 esi+0cc 地址 )

    文章目录 一.添加硬件断点 二.关键代码 三.MOV 汇编指令格式 四.EAX 寄存器值分析 五.使用命令查看 esi+0cc 地址 一.添加硬件断点 在上一篇博客中 , 在子弹个数数据内存地址 07 ...

  4. 笔记--STM32寄存器地址映射

    C语言回顾:指向结构体变量的指针 例如:struct student *p //p可以指向struct student 类型的变量或数组元素: 例题: main() { struct student ...

  5. keil MDK启动文件分析---基于LPC2100系列(其实都是相通的)

    转用MDK有一段时间了,越来越觉得MDK的强大,因为我之前都是用ADS1.2开发产品,所以更能体会到MDK的强大与易用性.MDK编译出来的代码与ADS1.2相比,代码量减少了很多,我的一个工程用ADS ...

  6. 寄存器山分析——CSAPP discuss

    解读所附 mountain 程序,并将该 mountain 程序在本组内不同(品牌/配置)PC 的 linux 系统上运行它.尝试绘制自己的存储器 山三维图(或两张二维图),并解读该存储器山,根据结果 ...

  7. 嵌入式C语言的寄存器地址映射

    对于微处理器,一切的底层配置,最终都是配置寄存器 库函数的本质就是对寄存器的封装 映射文件: stm32f10x.h 根据Datasheet,STM32F1系列的GPIO共有7个寄存器,对应的结构体定 ...

  8. Linux arm9 设置中断向量表,STM32学习笔记之中断向量表,MDK程序启动分析

    ;// Stack Configuration ;// Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> ;// Stack_Size EQU 0x0000 ...

  9. 以太网PHY寄存器分析

    以太网PHY寄存器分析    1 1.以太网PHY标准寄存器分析    2 1.1 Control Register    2 1.2 Status register    5 1.3 PHY Ide ...

最新文章

  1. 运动目标检测ViBe算法
  2. Python 之 matplotlib (十五)主次坐标轴
  3. sharepoint 2010 如何使用sharepoint多媒体视频播放media webpart功能
  4. 使用TextRank算法为文本生成关键字和摘要
  5. 人工智能时代将至,教育或将发生大改变,未来教育会人工智能化?
  6. 追随自己的价值观:用研经理 Anne Diaz 职业探索之路
  7. 哨兵模式原理_Redis哨兵、复制、集群的设计原理,以及区别
  8. 计算机的教学中作用是什么,发挥计算机在教学中应有的作用
  9. [bzoj3625][Codeforces 250 E]The Child and Binary Tree(生成函数+多项式运算+FFT)
  10. python安装包找不到setup_如何安装没有setup.py的Python模块?
  11. Linux 系统应用编程——网络编程(常用命令解析)
  12. LeetCode 2200. 找出数组中的所有 K 近邻下标
  13. sqlserver查看索引_SQL Server页中行物理存储
  14. python filter函数 字符串_Python实现filter函数实现字符串切分
  15. BZOJ 1024: [SCOI2009]生日快乐
  16. 推理集 —— 特殊与差异
  17. 吴恩达教授机器学习课程笔记【六】- Part 6 学习理论
  18. springboot禁止使用事务_springboot 中使用事务
  19. sql 删除重复数据 只留一条
  20. [RK3288][Android7.1][Camera] IMX307 mclk 37.125M补丁

热门文章

  1. java date dateformat_java中Date与DateFormat的格式输出
  2. python中if else语句用法_Python中if-else语句的多种写法
  3. mysql数据库操作手册
  4. Content-Disposition 响应头,设置文件在浏览器打开还是下载
  5. POJ 1836 Alignment
  6. WebSocket-nodejs实现
  7. mysql那些事(6) WHERE条件 字符串的引号
  8. UOJ59 WC2013 小Q运动季
  9. 什么原因接触接触impala的
  10. 跨域(三)——JSONP