历史上的今天
返回首页

历史上的今天

今天是:2025年03月13日(星期四)

正在发生

2019年03月13日 | 【STM32】MDK中寄存器地址名称映射分析

2019-03-13 来源:eefocus

对于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等),通过对结构体的地址和寄存器相对于结构体的偏移地址,来确定某个特定的寄存器。


推荐阅读

史海拾趣

Hsuan Mao Technology Co公司的发展小趣事

Hong Kong X'Tals Ltd在电子行业的发展故事

故事一:精密时间与频率产品的创新之路

Hong Kong X'Tals Ltd(简称HKC)自1991年成立以来,一直致力于精密时间和频率产品的研发与生产。公司最引人注目的成就是其KSTAR系列全球导航卫星系统(GNSS)驯服振荡器(GNSSDO)的推出。这款新产品不仅接收来自北斗、GPS、GLONASS和GALILEO等多卫星系统的信号,还具备高灵敏度和低噪声的特点,长期频率稳定性优于1E-12。KSTAR系列GNSSDO的推出,标志着HKC在通讯、自动驾驶、能源和金融等领域的时间同步解决方案上达到了国际领先水平。这一创新不仅增强了公司在全球市场的竞争力,也为众多行业客户提供了更加精准和可靠的时间同步服务。

故事二:从石英晶体到国际市场的跨越

HKC的母公司Kolinker Industrial Equipments Ltd拥有超过13年的中国晶体行业经验,并在深圳设立了首家中国本地的晶体工厂,该工厂荣获QS9000和ISO/TS16949认证。这一成就不仅体现了HKC在晶体制造领域的专业实力,也为其产品打入国际市场奠定了坚实的基础。HKC凭借其高质量的石英晶体产品,成功进入东欧、日本、韩国、中国大陆、北美、台湾和西欧等市场,成为国际市场上备受瞩目的晶体产品供应商。

故事三:技术研发与产品多元化的并行发展

HKC深知技术研发对于企业发展的重要性,因此不断加大在研发领域的投入。公司不仅专注于晶体、谐振器和振荡器的研发与生产,还积极拓展产品线,推出了一系列满足不同行业需求的电子产品。例如,在工业自动化领域,HKC设计并制造了多款机电一体化设备,赢得了国内外众多知名家电制造商的青睐。此外,公司还涉足新能源行业,通过投资组建益阳晶鑫新能源科技实业有限公司,致力于多晶硅产业链的建设与发展。

故事四:品质管理与国际认证的双重保障

HKC始终将品质管理视为企业发展的生命线。公司早在2000年和2003年就分别通过了ISO9002 1994及ISO9001 2000质量管理体系认证,成为同行业中最具实力的公司之一。这一系列的国际认证不仅证明了HKC在品质管理方面的卓越表现,也为其赢得了国内外客户的广泛信赖。HKC始终坚持以客户为中心,不断提升产品品质和服务水平,努力成为电子行业的佼佼者。

故事五:全球化战略与本土化运营的有机结合

随着全球市场的不断扩大,HKC积极实施全球化战略,在全球多个地区设立分公司和生产基地。同时,公司也注重本土化运营,根据不同地区的市场特点和客户需求,提供定制化的产品和服务。例如,HKC在中国内地市场就设立了多家子公司和生产基地,通过深入了解本地市场需求和客户需求,不断优化产品结构和服务模式,赢得了中国市场的广泛认可。这种全球化战略与本土化运营的有机结合,为HKC的可持续发展提供了强有力的支撑。

HTSEMI( Jin Yu Semiconductor )公司的发展小趣事

金宇半导体成立于2005年,由一群来自国内外顶尖高校的半导体专家共同创立。在成立初期,公司面临着资金短缺和技术瓶颈的双重挑战。创始人团队凭借在微处理器设计领域的深厚积累,成功研发出了一款低功耗、高性能的嵌入式处理器芯片,迅速获得了市场的关注。这款芯片不仅在国内智能手机市场占据了一席之地,还成功打入国际市场,为公司的后续发展奠定了坚实基础。

Antenova公司的发展小趣事

Antenova公司在天线设计领域的创新是其迅速发展的关键因素之一。公司专注于研发高效率、低能耗、高可靠性的天线产品,以满足快速增长的物联网市场需求。通过不断的技术创新和产品升级,Antenova成功在智能家居、汽车、可穿戴设备等多个领域取得了显著的市场份额增长。

Eastman Kodak Company公司的发展小趣事

随着技术的不断进步,伊士曼柯达公司不断推出新的产品和服务,以满足市场的多样化需求。在20世纪初,柯达已成为全球最大的胶卷供应商,并占据了美国摄影市场的绝大部分份额。此外,公司还积极向国际市场扩张,通过设立分支机构和办事处,将产品销往全球各地。这一时期,柯达不仅凭借其优质的产品赢得了广泛的客户基础,还树立了良好的品牌形象。

静芯微电子(ElecSuper)公司的发展小趣事

随着技术的不断进步和市场需求的不断变化,静芯微电子开始拓展产品线。公司不仅继续深耕ESD/TVS领域,还逐渐涉足了RS485、HALL、电源、接口等芯片的研发和生产。这些新产品的推出不仅丰富了公司的产品线,还进一步扩大了静芯微电子在电子行业的应用范围。目前,静芯微电子的产品已经广泛应用于汽车电子、工业控制、消费电子等领域,并与多家知名品牌建立了深度合作。

Belden Wire and Cable公司的发展小趣事

为了满足不断增长的市场需求,1928年,Belden在印第安纳州里士满开设了一家专为制造电线而设计的新工厂。这家工厂的建立极大地提升了公司的产能和效率,为公司的进一步发展提供了有力保障。在随后的几十年里,随着第二次世界大战的爆发和战后经济的复苏,里士满工厂经历了多次扩建和升级,逐渐成为百通最大的制造工厂之一。

问答坊 | AI 解惑

诚聘射频研发工程师从事红外、射频智能遥控系列,控制系统等产品

诚聘射频研发工程师我司招聘射频研发工程师一名.主要从事红外、射频智能遥控系列,控制系统等产品. 岗位要求:精通无线射频产品的设计、研发工作,一年以上射频电路(315,433HMZ)的独立设计经验.能够熟练使用射频电路仿真工具、测试仪器等相关器件 ...…

查看全部问答>

转载:60年后的电梯,祖国叫你一定要节能!!

本帖最后由 paulhyde 于 2014-9-15 09:11 编辑 如果让你来设计未来的电梯,你会从什么角度入手?酷炫的外观、创意的结构、非凡的体验还是绿色环保的特性? 我一直在关注“60年后的电梯”网络创意设计大赛,是快速电梯和视觉同盟合办的。最近发现 ...…

查看全部问答>

关于蓝牙U盘。

学校创新项目,我想出的一个项目。不过老师说这个不太适合我们这种层次的开发,个人觉得应该可以弄出来。注:老师是搞DSP的,对于蓝牙、USB等不太了解。希望坛友能给点建议。 附:考虑到U盘对电脑的依赖性很强,大多数情况下,人们希望可以实现不 ...…

查看全部问答>

求一个wince下的调试工具,像windbg那样的

如题 ,最好有成熟的教程或文档,如果有办法让windbg调试wince程序,感激赐教…

查看全部问答>

请问我会vb ,c# 可以学习plc吗?

windows和web的程序都做过,但不懂plc(完全不懂),请问能学吗?难度有多大?如何开始?谢谢!…

查看全部问答>

STM32的ADC测试还算不错,可惜没有差分通道(附图)

图片是实际的采集数据板子是英蓓特的DEMO板;程序是随机的ADC目录下的程序,硬件设置没动,修改了输出方式,增加了过采样设置,连续累加4096次ADC结果,但是除以256,相当于扩展了16倍,使输出数据打到了16位,而不是原来的12位。由于每秒256 ...…

查看全部问答>

altera注册问题

为什么我在altera中国官网上注册了账号,每次都显示“您的进程已经过期。请重新登录”,…

查看全部问答>

大家分享一下拿LaunchPad经验啊

还没能拿到LaunchPad,请大家分享一下得到LaunchPad的经验啊…

查看全部问答>

说说手机电池电路保护常用的三种元件

手机上用的电池都是锂电池,在高温下有可能会发生爆炸,事实上也发生过和产生了严重的后果。所以大多数的电池生产厂商都会采用保护措施。除了结构设计、IC的过流保护和MOS管的保护以外,还会采用二级保护元件来加强保护措施。      ...…

查看全部问答>

通过Altera SoC 的TCPIP远程调试硬件

这里是我今天花了半天时间翻译的altera官方网站上的一个应用笔记,附英文原版。通过Altera SoC 的TCPIP远程调试硬件…

查看全部问答>