商务平台网站建设合同,招商网站建设解决方案,上海建筑电工证查询网站,重庆石柱网站设计公司一 stm32 的flash是什么、有什么用、注意事项、如何查看
一 、说明
它主要用于存储代码#xff0c;FLASH 存储器的内容在掉电后不会丢失#xff0c;STM32 芯片在运行的时候#xff0c;也能对自身的内部 FLASH 进行读写#xff0c;因此#xff0c;若内部 FLASH 存储了应用…一 stm32 的flash是什么、有什么用、注意事项、如何查看
一 、说明
它主要用于存储代码FLASH 存储器的内容在掉电后不会丢失STM32 芯片在运行的时候也能对自身的内部 FLASH 进行读写因此若内部 FLASH 存储了应用程序后还有剩余的空间我们可以把它像外部 SPI-FLASH 那样利用起来存储一些程序运行时产生的需要掉电保存的数据。并且访问内部 FLASH 的速度要比外部的 SPI-FLASH 快得多
二、结构
STM32 的内部 FLASH 包含主存储器、系统存储器、 OTP 区域以及选项字节区域它们的地址分布及大小下表
各个存储区域的说明如下
1主存储器 一般我们说 STM32 内部 FLASH 的时候都是指这个主存储器区域它是存储用户应用程序的空间芯片型号说明中的 1M FLASH、 2M FLASH 都是指这个区域的大小。 主存储器分为两块共 2MB每块内分 12 个扇区其中包含 4 个 16KB扇区、 1 个 64KB 扇区和 7 个 128KB 的扇区。如STM32F429IGT6 型号芯片它的主存储区域大小为 1MB所以它只包含有表中的扇区 0-扇区 11。 与其它 FLASH 一样在写入数据前要先按扇区擦除而有的时候我们希望能以小规格操纵存储单元所以 STM32 针对 1MB FLASH 的产品还提供了一种双块的存储格式见下表
通过配置 FLASH 选项控制寄存器 FLASH_OPTCR 的 DB1M 位可以切换这两种格式切换成双块模式后扇区 8-11 的空间被转移到扇区 12-19 中扇区细分了总容量不变。 注意如果您使用的是 STM32F40x 系列的芯片 它没有双块存储格式也不存在扇区 12-23仅 STM32F42x/43x 系列产品才支持扇区 12-23。 2系统存储区 系统存储区是用户不能访问的区域它在芯片出厂时已经固化了启动代码它负责实现串口、 USB 以及 CAN 等 ISP 烧录功能。 3OTP 区域 OTP(One Time Program)指的是只能写入一次的存储区域容量为 512 字节写入后数据就无法再更改 OTP 常用于存储应用程序的加密密钥。 4选项字节 选项字节用于配置 FLASH 的读写保护、电源管理中的 BOR 级别、软件/硬件看门狗等功能这部分共 32 字节。可以通过修改 FLASH 的选项控制寄存器修改。
三、注意事项
32位的M3有4GB的寻址空间STM32的存储器地址映射地址范围为0x0000_0000-0xFFFF_FFFF;其中代码区的地址是从0x0800_0000开始的结束于0x0800_0000芯片的Flash的大小
所以就必须在MDK里设置Flash地址为0x0800 0000 这样就还有一个问题理论上CM3中规定上电后CPU是从0地址开始执行但是这里中断向量表却被烧写在0x0800 0000地址里那启动时不就找不到中断向量表了既然CM3定下的规矩是从0地址启动SMT32当然不能破坏ARM定下的“规矩”所以它做了一个启动映射的过程就是和芯片上总能见到的BOOT0和BOOT1有关了当选择从主Flash启动模式后芯片一上电Flash的0x0800 0000地址被映射到0地址处不影响CM3内核的读取所以这时的CM3既可以在0地址处访问中断向量表也可以在0x0800 0000地址处访问中断向量表而代码还是在0x0800 0000地址处存储的。这就是最难理解的地方其实这是基本上所有ARM芯片采用的启动映射方法。ARM7ARM9没有内部Flash的通常都是这样做的。这个过程出自STM32 referenc manual手册里面是有说明的。 值得注意的是 这个中断向量表是可以在程序中再次被映射的。控制它的就是CM3已经规定的NVIC寄存器SCB-VTOR。在STM32库中给出的启动代码里startup_stm32f10x_hd.s文件里第146行是上电后读取中断向量表中的复位中断位置并执行复位中断处理代码代码如下
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
IMPORT SystemInit
LDR R0, SystemInit
BLX R0
LDR R0, __main
BX R0
ENDP注意复位后第一个被执行的是SystemInit代码这个代码在库目录下的system_stm32f10x.c文件里它初始化了时钟NVIC等一系列操作这里摘要与中断向量有关的代码
void SystemInit (void){…#ifdef VECT_TAB_SRAM
SCB-VTOR SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. /
#else
SCB-VTOR FLASH_BASE | VECT_TAB_OFFSET; / Vector Table Relocation in Internal FLASH. */
#endif
}可以看出中断向量重映射是一个选择性编译通常宏定义VECT_TAB_SRAM都没有被定义所以这里执行结束后SCB-VTOR就是FLASH_BASE了值为0x0800 0000。以后CM3再取中断向量里就会根据SCB-VTOR的设置从这里取向量执行了。中断向量自此终于转正。
四、如何查看
在keil中map文件可以查看对应使用情况 (ROM)flash (CodeRO_DataRW Data),大小为字节 二 stm32的RAM、SRAM、ROM是什么有什么用、注意事项、如何查看
一、说明
RAMRandom Access Memory) 掉电之后就丢失数据读写速度块 ROM (Read Only Memory) 掉电之后仍然可以保持数据 SRAM属于RAM类上面说过的的FLASH存储器又称闪存它结合了ROM和RAM的长处不仅具备电子可擦除可编程的性能还不会断电丢失数据同时可以快速读取数据。
ROM和RAM的分布
RAM的起始地址是0x2000_0000结束于0x2000_0000芯片的RAM大小。 可以发现ROM的起始地址对于刚刚将的的内部flash地址所以stm32的flash就是ROM通常保存着text段、Code、Ro-data、Rw-data 二、作用 那么RAM是什么呢RAM就是运行内存掉电数据就丢失通常保存着堆、栈、bss段、data段、ZI-data、RW-data 在map文件可以查看到RAM大小 RAM RW-data ZI-data text代码段存储在FLASH中 data初始化数据 数据段 bss未初始化数据 数据段 可以发现RW-data 出现在了 RAM和FLASHROM中RW-data为什么会即占用Flash又占用RAM空间 由前文知道RAM掉电数据会丢失RW-data是非0初始化的数据已初始化的数据需要被存储在掉电不会丢失的FLASH中上电后会从FLASH搬移到RAM中。
三、查看与注意事项
下面是stm32f103zet6的配置 我们知道ROMFLASH的起始地址是0x8000000 512k的flash大小512*10240x80000字节 RAM的起始地址为0x20000000 大小为 64*10240x10000字节 1、外扩RAM
那么有个问题要是我的设备现在要带一个GUIRAM不够咋办那就外扩一个SRAM或者DRAM 下面是他们的特性 我们在使用外部SRAM的时候需要配置keill5的RAM大小吗通过图可以发现是不需要的并且外部ram的起始地址改为0x60000000了 如果我们使用的是 BANK1 的区域 3所以HADDR[27:26]10故外部内存的首地址为 0X68000000。