STM32芯片存储器映射概述

stm32系统构架当你拿到一款芯片后,怎样可以快速了解到它具有哪些功能?了解单片机的系统架构是使用款芯片的基础,这些信息在芯片手册上都会有详细的说明,并且它们会被安排在最前面的章节,目的就是让用户最开始就能够关注到该款芯片具有哪些功能,特点。
stm32f103系统结构
从上图我们可以了解到stm32f103系列的主要系统组成单元:
cpu核:使用arm cortex-m3内核;存储器:stm32f103系列微控制器采用经典的哈佛架构,程序存储和数据存储采用独立的存储器空间;icode:指令代码,flash存储器用于存储程序;dcode:数据代码,sram用于存储数据;外设:gpio;定时器;adc;通信接口:spi、i2c、usart;其他接口:usb、can、rtc、dma、sdio、fsmc等;总线架构:ahb总线:高速总线,连接核心与部分外设。apb1/apb2总线:连接外设,时钟较ahb低。芯片存储器映射从上面的系统结构图中我们很容易就能看出内核与存储单元的关系,但更多的细节芯片手册上并没有给出。对于51系列单片机单片机,因为其内核和存储单元都比较简单管理起来也非常容易,但stm32芯片内部复杂程度都比51高几个数量级,所以需要对存储单元有特定的划分管理,把它称为存储器映射,这些知识在51单片机中是不会涉及的,这一部分内容在arm公司的内核手册上才会有详细的讲解。我们都知道了stm32f103系列单片机采用的是的arm cortex-m3内核,所以要了解这部分知识需要查看cortex-m3内核资料。
上图是cortex-m3内核资料中对给内核芯片预定义的存储器映射说明,接下来我们通过stm32f103系列单片机来逐步学习。
stm32单片机存储器映射stm32单片机存储空间包含了用于程序代码和数据存储的系统存储器区域,以及用于外设控制的外设寄存器区域。为了能够直观而有效地操作这些内存资源,stm32采用存储器映射的方式进行内存管理。什么是存储器映射?其基本思想是将不同的内存区域按逻辑功能映射到单片机的线性地址空间,从而实现通过访问地址来操作存储单元的目的。
要高效地使用stm32单片机,正确理解和使用其存储器映射方式是必要的。以下详细介绍stm32内存映射的组成结构、典型布局以及编程方法,帮助初学者建立对存储器映射的整体认知,为后续stm32编程开发奠定基础。
stm32存储器映射概述stm32单片机的内存映射可以分为两大部分:系统存储器映射区域和外设寄存器映射区域。
系统存储器区域主要包括:
sram:用于存放数据,包括全局变量、堆栈等flash:用于存放程序代码外设寄存器区域则映射了各外设控制需要的寄存器,通过访问这些寄存器可以配置外设工作模式或者获取其工作状态。
整个内存映射采用线性连续的地址从低向高排布,从0x00000000开始,每个内存区按照功能和大小顺序映射。stm32内存空间的总大小依型号不同有所区别,较大的可以达到gb级别。
典型存储器映射布局下面我们以stm32f103系列为例,介绍其典型的存储器映射布局。
flash memory: 0x08000000 ~ 0x0807ffff (512kb)该区域存储了程序代码。起始地址固定为0x08000000,大小根据芯片容量不同而不同。
sram: 0x20000000 ~ 0x2000ffff (64kb)该区域用于存储运行时的数据,如全局变量、堆栈等。起始地址固定为0x20000000。
外设寄存器: 0x40000000 ~ 0x4000ffff用于映射控制外设的各种控制寄存器,可以通过访问这些地址来配置外设。
ahb外设: 0x40020000 ~ 0x4002ffff包含了连接在ahb总线上的外设,如gpio、dma等的控制寄存器。
apb1外设: 0x40000000 ~ 0x4000ffff包含连接在apb1总线上的外设,如timer2、uart2等。
apb2外设: 0x40010000 ~ 0x400fffff包含连接在apb2总线上的外设,如timer1、spi1等。
通过上述内存布局可知,stm32内存映射有明确的逻辑划分,不同区域存放不同的数据或寄存器,各外设也按照所在总线分组排布。用户可以通过编程手册找到每个外设寄存器的确切地址。
基于存储器映射的外设寄存器编程知道了各外设寄存器的地址映射后,我们就可以通过直接读写地址来操作外设,例如:
gpioa_crh = 0x40010800; //gpioa控制寄存器地址*(volatile uint32_t *)gpioa_crh |= 0x01; //配置pa8为输出模式但是直接地址操作不够优雅和灵活,更好的方法是利用硬件抽象层(hal)提供的函数来访问寄存器,例如:
gpio_inittypedef gpio_initstruct; gpio_initstruct.pin = gpio_pin_8;gpio_initstruct.mode = gpio_mode_output;hal_gpio_init(gpioa, &gpio_initstruct);hal库会根据传入的gpio端口和引脚参数,自动计算出对应的寄存器地址,从而实现配置gpio的功能。
这种基于内存映射的编程方式,为用户屏蔽了底层寄存器操作的细节,提供了简单易用的外设驱动接口。
存储器映射工作原理那么stm32是如何实现内存映射,将不同区域的存储单元映射到连续的线性地址空间中的呢?
主要是通过地址译码器根据地址某些bit位的组合,对地址进行解码,选通出需要访问的目标存储区域的信号,从而将访问请求导向到正确的目的地。
例如,地址的31-24bit用于区分代码区域和外设区域,0-15bit含有偏移量;地址译码器根据地址bit位组合,将访问请求定向到与之对应的存储单元上。
内存保护机制为了数据安全,stm32还增加了存储区域写入保护机制。
主要手段是利用内存保护单元(mpu)进行存储区域访问控制。mpu可以进行区域划分,配置每个区域的访问权限,从而实现对区域读写操作的保护,防止程序异常修改关键存储内容。
结语本文介绍了stm32存储器映射的基本结构、典型布局及相关原理,并讲解了基于存储器映射访问外设寄存器的编程方法。存储器映射方式抽象并简化了stm32的庞大内存空间,有助于用户直观而高效地使用这块“位带区”。希望本文能帮助读者建立stm32存储器映射的概念框架,并为后续编程项目提供基础理论支持。关于“位带”操作,我将会在以后的文章中做单独进行介绍。使用“位带”操作可以让我们的代码更高效,这也是每一位stm32单片机开发者不可或缺的技能。

特斯拉Cybertruck玻璃被砸裂的原因是什么?
高效可靠的电源连接:源自凌科的紫外线杀菌灯专业连接方案
如何利用高斯过程回归模型建立燃料电池电堆功率预测模型?
关于工业物联网安全措施如何布置的分析介绍
2018款12.9寸iPad Pro的拆解:Apple Pencil的无线充电设计
STM32芯片存储器映射概述
什么是浮地测试?如何进行浮地测试?
配电线路中并联电容器的配置技术
通信网组网结构
一文解析从数字PWM信号获得准确、快速稳定的模拟电压
SK电讯预计今年年内将完成1000个建筑的5G室内网络部署
智慧空调插座:智控生活好伴侣,节能降耗好帮手
2021世界移动大会(MWC)上海展即将举办
高速分布式存储引擎,可有效解决性能的瓶颈
华为回归或使iPhone出货量减少1000万
研发BAW和TC-SAW滤波器,新声半导体完成逾3亿元融资
电子产业基地深圳改名粤港澳大湾区之后将更具发展动力
CEVA和香港应科院宣布推出Dragonfly NB1
摩托罗拉中国裁员补偿“N+2”:传德国补偿N+6
深度分析Mini/Micro LED显示技术的机会与挑战