STM32内核的储存器映射

本文详细介绍了STM32微控制器的存储器结构,包括32位Cortex-M3内核的4GB地址空间划分,STM32的SRAM和Flash特性,以及存储器映射如何影响芯片设计。理解这些概念对于编写高效代码至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

存储器映射是指把芯片中或芯片外的FLASHRAM,外设,BOOTBLOCK等进行统一编址。即用地址来表示对象。这个地址绝大多数是由厂家规定好的,用户只能用而不能改。用户只能在挂外部RAMFLASH的情况下可进行自定义。

Cortex-M332位的内核,因此其PC指针可以指向2^32=4G的地址空间,也就是0x0000_0000——0xFFFF_FFFF这一大块空间。

 

Cortex-M3内核将0x0000_0000——0xFFFF_FFFF这块4G大小的空间分成8大块:代码、SRAM、外设、外部RAM、外部设备、专用外设总线-内部、专用外设总线-外部、特定厂商等。导致了,使用该内核的芯片厂家必须按照这个进行各自芯片的存储器结构设计。

 

STM32的存储器地址空间被划分为大小相等的8块区域,每块区域大小为512MB

STM32存储器知识的掌握,实际上就是对FlashSRAM这两个区域知识的掌握。

STM32SRAM

不同类型的STM32单片机的SRAM大小是不一样的,但是他们的起始地址都是0x2000 0000,终止地址都是0x2000 0000+其固定的容量大小。

SRAM的理解比较简单,其作用是用来存取各种动态的输入输出数据、中间计算结果以及与外部存储器交换的数据和暂存数据。设备断电后,SRAM中存储的数据就会丢失。

STM32Flash

TM32的Flash,严格说,应该是Flash模块。

该Flash模块包括:Flash主存储区(Main memory)、Flash信息区(Information block),以及Flash存储接口寄存器区(Flash memory interface)。

三个组成部分分别在0x0000 0000——0xFFFF FFFF不同的区域

图中淡蓝色就是你需要知道的。

 

Peripherals:外设的存储器映射,对该区域操作,就是对相应的外设进行操作;

SRAM:运行时临时存放代码的地方;

Flash:存放代码的地方;

System Memory:STM32出厂时自带的你只能使用,不能写或擦除;

Option Bytes:可以按照用户的需要进行配置(如配置看门狗为硬件实现还是软件实现);

今后,你的编写代码、程序运行、寄存器设置、ICP、IAP都依靠这些东西。

 

完成STM32存储器知识过程中,一共参考了以下官方文档:

《RM0008 Reference manual》

《Cortex-M3技术参考手册》

《PM0042 Programming manual:STM32F10xxx Flash programming》

《AN2557 Application note:STM32F10x in-application programming using the USART》

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/king-77024128/articles/3463081.html

### 实现STM32F103 USB读卡器功能的关键要素 为了实现基于STM32F103的USB读卡器功能,需要完成以下几个方面的设计与配置: #### 1. **硬件连接** STM32F103支持全速USB设备模式(USB-FS),因此可以通过其内置的USB控制器来实现USB通信。对于SD卡接口部分,通常采用SPI协议进行数据传输。以下是典型的硬件连接方式: - SD卡模块通过SPI总线连接至STM32F103。 - SPI信号包括 `MOSI`、`MISO`、`SCLK` 和 `CS` 引脚。 - 确保电源电压匹配,尤其是SD卡模块的工作电压可能为3.3V。 如果遇到无法正常读取容量或者Windows提示错误的情况,可以尝试调整时钟分频设置以降低频率[^3]。 --- #### 2. **软件架构** 整个系统的软件架构分为多个层次,主要包括以下几部分内容: ##### (a) **USB栈初始化** 在项目中引入官方提供的USB库文件,并按照需求修改USBD_CONFIG下的参数。主要工作包括: - 注册USB内核并启动中断服务程序。 - 配置端点描述符以及相应的回调函数用于处理主机请求的数据包收发操作。 示例代码如下所示: ```c // 初始化USB外设 void MX_USB_DEVICE_Init(void) { USBD_Init(&hUsbDeviceFS, &FS_Desc, DEVICE_FS); USBD_RegisterClass(&hUsbDeviceFS, &USBD_STORAGE); } ``` ##### (b) **存储介质驱动层** 编写针对具体存储媒介(如SD卡或SPI Flash)的支持逻辑,这部分涉及低级命令交互过程。例如,在`usbd_storage.c/h` 文件里定义必要的结构体成员变量及其访问方法;同时还需要调用BSP层API完成实际物理地址映射等功能[^2]。 下面是一个简单的例子展示如何封装基本读写接口: ```c DSTATUS disk_status(BYTE pdrv) { if (!IsCardInserted()) return STA_NODISK; return RES_OK; // 表明当前盘处于就绪状态 } DRESULT disk_read(BYTE pdrv, BYTE *buff, LBA_t sector, UINT count) { for(int i=0;i<count;i++) { ReadSectorFromSD(sector+i,buff+(i*512)); } return RES_OK; } ``` ##### (c) **文件系统管理** 集成FatFs组件以便于更方便地解析目录树节点信息等内容。它允许应用程序像对待常规硬盘那样操作外部储存单元上的各类资源文件夹等等[^1]。 --- #### 3. **调试技巧** 当面对诸如“Micro SD 卡 CSD 寄存器不可达”的问题时,除了检查电气特性之外还应考虑固件版本兼容性和指令序列准确性等方面因素。另外值得注意的是某些特定品牌型号的产品可能存在特殊限制条件需查阅对应规格书获取更多细节说明文档参考资料链接。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值