【STM32】MDK中寄存器地址名称映射分析

发布者:梦想学院最新更新时间:2019-03-13 来源: eefocus关键字:STM32  MDK  寄存器地址  名称映射 手机看文章 扫描二维码
随时随地手机看文章

对于MCU,一切底层配置,最终都是在配置寄存器。


STM32F1xx官方资料:

《STM32中文参考手册V10》-第8章通用和复用功能IO(GPIO和AFIO)


51单片机访问地址

51单片机经常会引用一个reg51.h的头文件。下面看看它是怎么把名字和寄存器联系在一起的:


sfr p0=0x80;

p0=0x00;

sfr是一种扩充数据类型,点用一个内存单位,值域为0-255.利用它可以访问51单片机内部所有的特殊功能寄存器。前一句“sfr p0=0x80”就是将P0映射到地址0x80。后一句“p0=0x00”就是往p0地址(0x80)代表的寄存器写值。


STM32访问地址

寄存器地址名称映射

STM32肯定也是可以这样来设置寄存器的。但是由于STM32的寄存器数目太多了,如果以这样的方式列出来,需要很大的篇幅,而且也不方便开发。所以,MDK采用的方式是通过结构体来将寄存器组织在一起。


下面就介绍MDK如何把结构体和地址对应起来的,为什么修改结构体成员变量的值就可以达到操作寄存器的值?这些事情都是在stm32f10x.h文件中完成的。


注:stm32f10x.h文件在STM32固件库下的目录是:


STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x文件夹下。


GPIOA的寄存器地址名称映射

我们通过GPIOA的寄存器为例来进行介绍。


GPIOA->ODR=0x00000000;

首先,我们需要看一下GPIOA是个什么东西?通过宏定义我们可以看到:


#define GPIOA               ((GPIO_TypeDef *) GPIOA_BASE)

#define GPIOB               ((GPIO_TypeDef *) GPIOB_BASE)

#define GPIOC               ((GPIO_TypeDef *) GPIOC_BASE)

#define GPIOD               ((GPIO_TypeDef *) GPIOD_BASE)

#define GPIOE               ((GPIO_TypeDef *) GPIOE_BASE)

#define GPIOF               ((GPIO_TypeDef *) GPIOF_BASE)

#define GPIOG               ((GPIO_TypeDef *) GPIOG_BASE)

GPIOA是一个将GPIOA_BASE强制转换成GPIO_TypeDef的指针。这句话的意思就是,GPIOA指向地址GPIOA_BASE,而GPIOA_BASE存放的数据类型是GPIO_TypeDef。再看一下结构体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;

结构体里面声明了7个变量,这个时候就明白了“GPIOA->ODR”就是指:GPIOA结构体下的ODR变量。


其实结构体的7个变量就是GPIOA的7个寄存器。我们需要知道GPIOA下的ODR寄存器的地址,首先需要知道的是GPIOA的基地址是怎么计算的呢?


#define GPIOA_BASE            (APB2PERIPH_BASE + 0x0800)

#define GPIOB_BASE            (APB2PERIPH_BASE + 0x0C00)

#define GPIOC_BASE            (APB2PERIPH_BASE + 0x1000)

#define GPIOD_BASE            (APB2PERIPH_BASE + 0x1400)

#define GPIOE_BASE            (APB2PERIPH_BASE + 0x1800)

#define GPIOF_BASE            (APB2PERIPH_BASE + 0x1C00)

#define GPIOG_BASE            (APB2PERIPH_BASE + 0x2000)

因为GPIO都是挂载在APB2总线之上的,所以它的基地址是由APB2总线的基地址+GPIO在APB2总线上的偏移地址决定的。那么APB2总线的基地址是怎么计算的呢?


#define PERIPH_BASE           ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */

#define APB2PERIPH_BASE       (PERIPH_BASE + 0x10000)

原理都是一样的,APB2总线的基地址也是从其他地址进行地址偏移得到的。


所以到这个时候,就可以算出GPIOA的基地址位了:


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


这上面就已经知道了GPIOA的基地址,那么那些GPIOA的7个寄存器的地址又是怎么计算出来的呢?


GPIOA的寄存器的地址=GPIOA基地址+寄存器相对GPIOA基地址的偏移值


寄存器相对于GPIOA基地址的偏移值可以在上面的寄存器地址映射表中查到。稍微解释一下:GPIO的每个寄存器都是32位的,所以每个寄存器是占用4个地址,也就是说一共占用28个地址。地址偏移范围为(000h-01Bh)。这个地址偏移是相对于GPIOA的基地址而言的。


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


 


总结与分析

对于STM32而言,使用“GPIOA->ODR=0x00000000;”来对寄存器赋值的原理,也就是将GPIO下的所有寄存器放在一个结构体内,通过基地址和在基地址上的偏移地址不断转化,最终找到准确的寄存器实际地址来进行赋值。也就是说,和51单片机最大的不同就是:由于STM32的寄存器数目太多,就将其中控制同一外设的寄存器设置成一个结构体(如GPIO、DMA等),通过对结构体的地址和寄存器相对于结构体的偏移地址,来确定某个特定的寄存器。


关键字:STM32  MDK  寄存器地址  名称映射 引用地址:【STM32】MDK中寄存器地址名称映射分析

上一篇:【STM32】STM32时钟系统和SystemInit函数解读
下一篇:【STM32】MDK5打开MDK4项目工程时出现的不兼容及解决方法

推荐阅读最新更新时间:2024-03-16 16:25

STM32学习日志——光敏传感器实验
一、光敏二极管简介 光敏传感器是一种将光信号转换成电信号的传感器,光敏二极管的管芯是一个具有光敏特征的PN结,具有单向导电性,因此工作需加反向电压。当光照弱的时候,反向漏电流较小,当光照强的时候,反向漏电流较大。利用这个变化,串接一个电阻,就可转化成电压的变化,从而根据ADC读取的电压值判断光照强弱。 本次,将通过ADC3的通道6(PF8),来读取光敏二极管的强弱。 二、库函数编写 1)ADC3配置,与之前的ADC1配置一样,换个引脚而已,不再详细介绍; 2)获取光照强度,用0~100来表示,0代表光照最弱,即电流最小时,此时引脚电压最大;100代表光照最强,即电流最大时,此时引脚电压最小; 3)OLED显示 三
[单片机]
第二节: 外部中断学习(用CubeMX学习STM32)
前言: 关于中断简单介绍 中断的流程: 中断流程图: 中断方式传送数据具有可以有效提高单片机工作效率, 适合于实时控制系统等优点, 相对于查询方式更为常用。 当CPU处理某件事情的时候, 外部发生的某一事件(如电平的改变、脉冲边沿跳变、定时器/计数器溢出等)请求CPU迅速处理, 于是CPU暂时中断当前的工作, 转去处理发生的事件。 处理完该事件后, 再回到原来中断处, 继续工作。 这样的过程称为中断 上图为中断流程图 这个中断的概念是不是有点晦涩难懂? 主要是这个是书上的内容, 所以不是很形象. 我再解释一遍:想象一个场景, 1、当有一天你正在和川建国同志吃饭(你和他吃饭这个事情就是主程序); 2、突然有个电话打给
[单片机]
第二节: 外部中断学习(用CubeMX学习<font color='red'>STM32</font>)
STM32的IO口灌入电流和输出驱动电流最大是多少?
最大可以输出8mA,灌入20mA,但要保证所有进入芯片VDD的电流不能超过150mA,同样所有从VSS流出的电流也不能超过150mA。 详细请看STM32的数据手册中的相关内容。 例如,STM32F103中容量产品,需要看5.2节和5.3.12节,里面有更详细的数据: http://www.st.com/stonline/products/literature/ds/13587.pdf STM32F103X8B
[单片机]
<font color='red'>STM32</font>的IO口灌入电流和输出驱动电流最大是多少?
STM32学习笔记3——stm32系统时钟树
①HSI 是内部高速时钟, RC 振荡器, 频率为 8MHz。 可作为系统时钟或 PLL 锁相环的输入。 ②HSE 是外部高速时钟。 可通过外接一个频率范围是 4-16MHz 的时钟或者晶振。 HSE 可以作为系统时钟和 PLL 锁相环输入, 还可以经过 128 分频后输入给 RTC。 ③LSI 是内部低速时钟, RC 振荡器, 频率大约为 40K, 可供独立看门狗和 RTC 使用, 并且独立看门狗只能使用 LSI 时钟。 ④LSE 是外部低速时钟,芯片上有相应的外部低速时钟管脚。 通常在此管脚上外接一个 32.768KHz 的晶振, 供 RTC使用。 ⑤PLL 是锁相环, 用于倍频输出。
[单片机]
<font color='red'>STM32</font>学习笔记3——<font color='red'>stm32</font>系统时钟树
STM32的IO口灌入电流和输出驱动电流最大是多少?
最大可以输出8mA,灌入20mA,但要保证所有进入芯片VDD的电流不能超过150mA,同样所有从VSS流出的电流也不能超过150mA。 详细请看STM32的数据手册中的相关内容。 例如,STM32F103中容量产品,需要看5.2节和5.3.12节,里面有更详细的数据: http://www.st.com/stonline/products/literature/ds/13587.pdf STM32F103X8B
[单片机]
<font color='red'>STM32</font>的IO口灌入电流和输出驱动电流最大是多少?
STM32 F101系列的程序怎么转化为STM F103出现编译错误!
以下为解决办法(实验环境KEIL5 版本号:5.25) 第一步: 以改为F103C8T6 小容量为例(MD代表中等容量64K或者128K),HD代表(大容量的256K或者512K) 更改完毕之后,编译一下!如何还是编译出现很多错误请往下看,没问题的话就不用看了! 第二步:找到启动文件夹,然后找到启动文件。 我找到啦,你们呢?一般都在你们的工程文件夹里面,很容易找到。 n 可以把不需要的删除(建议事先备份),以F103C8T6,你就可以只留下startup_stm32f10x_md.s。(如果是大容量的话,第二步都不用做,直接编译就没问题。因为都是HD所以就没事啦) 其实不删除原则上也
[单片机]
<font color='red'>STM32</font> F101系列的程序怎么转化为STM F103出现编译错误!
STM32JTAG调试接口PB3、PB4复用问题
JTAG 接口:主要用于芯片内部测试。现在多数的高级器件都支持JTAG协议,标准接线是4根线 TMS:JTAG接口模式选择 TCK:JTAG接口时钟 TDI:JTAG接口数据输入 TDO:JTAG接口数据输出 TRST:JTAG可选引脚,功能为 测试复位、输入引脚、低电平有效 SWD接口:串行调试(Serial Wire Debug),应该可以算是一种和JTAG不同的调试模式,使用的调试协议也应该不一样,所以最直接的体现在调试接口上。标准接线为2线 SWDIO:SWD数据线 SWDCLK:SWD时钟线 SWD与JTAG相比有许多优点: 1. SWD接口相比于JTAG更加可靠 2. 使用更少的GPIO,直
[单片机]
IAR Systems发布最新开发工具 支持ST STM32系列微控制器
2007年7月31日,瑞典乌普萨拉市,IAR Systems发布最新的开发工具IAR Embedded Workbench 4.42,支持意法半导体(ST)最新的基于ARM Cortex-M3内核的STM32系列微控制器。STM32具有很好的性能,特别适用于有高性能、低功耗、低成本需求的嵌入式应用。IAR Systems公司与意法半导体紧密合作,即时发布相应的开发工具。 支持ARM Cortex-M3控制器的IAR Embedded Workbench是一个完全集成的开发环境,它包含C/C++编译器、项目管理器、编辑器、链接器以及C-SPY调试器。这款开发工具借鉴了 IAR Systems多年对ARM、Thumb 以及 Thumb
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved