【stm32】stm32深入思考(2) 之 RAM启动

1. 引言

上一篇做了stm32系统启动流程的整理分析,中间遇到stm32启动模式的选择和原理。中间也遇到一些不理解的地方,于是着手做了实验,在这里记录一下。

2. 三种启动模式

目前stm32支持3种启动模式。

BOOT0BOOT1启动模式启动地址
0xflash0x0800 0000
10系统存储器0x1FF00000
11RAM0x2000 0000

从flash和系统存储器启动,系统都会做一个地址的映射。

STM32把从0x00000000到0x0005FFFF的区域作为启动空间(boot space)的别名区。

比如从flash启动,这种情况下,访问0x0 地址 和 0x0800 0000,是完全一样的。
所以在启动后,cotex-M3从0x0地址取MSP,从0x4取PC,就是从0x8000000和0x08000004取。是等价的。
但是,RAM启动是个例外,
在这里插入图片描述
即使我们选择了RAM启动,我们也无法通过0x0来访问0x2000 0000。
那RAM究竟是怎么启动的?

3. RAM启动

3.1 原理

首先,我们已知的,当boot0 = 1,boot1 = 1时,即RAM启动时,cotex-m3一定是从0x0取msp,从0x4取pc,而且启动之后0x2000 0000和 0x0是没有映射在一起的。
所以,我们可以有两种推测:

  1. 系统没有做0x2000 0000到0x0的映射,而是通过系统的内部方式在启动时把0x2000 0000和0x20000004的值赋给了SP和PC。
  2. 系统在上电时刻做了0x2000 0000到0x0的映射,启动后(取完MSP和PC),断开了这个映射,之后两段空间独立开。

这个我暂时没有找到什么资料说明,但是二者达到的效果是一样的,我个人更倾向于第二种,好记一点。
截个实际的图,可以看出二者确实是不一样的。

在这里插入图片描述

3.2 实验步骤

3.2.1 新建一个RAM的project Item

找一个简单的,可以在flash上稳定运行的工程,新建一个RAM启动使用的project Item。
在这里插入图片描述
建立这个Item的意义在于,在这里修改的配置,全局宏等,不会影响到flash的那个配置,二者是独立是,而且切换十分方便。
在这里插入图片描述
切换之后就会看到左边的工程名不一样了。
在这里插入图片描述
在这里插入图片描述

除了配置相关,所有添加的代码文件都是公用一套。

3.2.2 修改ROM和RAM地址

之前flash下载的配置大家应该都很熟悉了,
在这里插入图片描述
这里我们切换为RAM下载。
先看一下编译文件的大小。
在这里插入图片描述
打开map文件
在这里插入图片描述
可以看出
生成的bin文件是5884字节大小。

所以,我们给ROM分配的空间大于5884即可。
在这里插入图片描述
这里还遇到一个坑,这个最后说。

3.2.3 debug选项卡设置

在这里插入图片描述

去掉Load Application at startup
加载一个CpuRam.ini,这个文件我也是网上找的。

/*----------------------------------------------------------------------------
 * Name:    Dbg_RAM.ini
 * Purpose: RAM Debug Initialization File
 * Note(s):
 *----------------------------------------------------------------------------
 * This file is part of the uVision/ARM development tools.
 * This software may only be used under the terms of a valid, current,
 * end user licence from KEIL for a compatible version of KEIL software
 * development tools. Nothing else gives you the right to use this software.
 *
 * This software is supplied "AS IS" without warranties of any kind.
 *
 * Copyright (c) 2008-2011 Keil - An ARM Company. All rights reserved.
 *----------------------------------------------------------------------------*/

/*----------------------------------------------------------------------------
  Setup()  configure PC & SP for RAM Debug
 *----------------------------------------------------------------------------*/
FUNC void Setup (void) {
  SP = _RDWORD(0x20000000);          // Setup Stack Pointer
  PC = _RDWORD(0x20000004);          // Setup Program Counter
  _WDWORD(0xE000ED08, 0x20000000);   // Setup Vector Table Offset Register
}

FUNC void OnResetExec (void)  {      // executes upon software RESET
  Setup();                           // Setup for Running
}

load %L incremental

Setup();                             // Setup for Running

g, main


3.2.4 添加全局宏VECT_TAB_SRAM

在这里插入图片描述

VECT_TAB_SRAM主要用于在systemInit的时候重设中断向量表。

在这里插入图片描述

3.2.5 配置Utilies选项卡

在这里插入图片描述

3.2.6 修改硬件boot引脚电平

把Boot0和BOOT1接高电平。

3.2.7 debug模式运行

RAM启动没法load flash这样烧写进去,也没法断电重启。
主要就是在debug模式下运行。
在这里插入图片描述
进入debug后可以单步,可以全速,可以reset。
网上有些帖子说他们没法reset我倒是没遇到,都是可以正常跑的。

跑起来有时候会不太稳定,报错从debug模式退出,不过也能用。
在这里插入图片描述
看图跑了挺久都在跑。

4. 遇到的坑

之前做RAM启动的时候,每次一跑进SystemInit就进入硬件异常,弄得我十分郁闷,感觉就是一压栈就异常,但是我跟踪MSP又确实是按我想的变化,就很郁闷,找了大半天发现原因。
之前在 stm32中文手册中看到这一段,
在这里插入图片描述
我测试用的stm32f103,我以为RAM都是64k,即0x2000 0000~0x20010000,所以ROM分的是0x2000 0000~0x2000 8000 ,ram分的是0x2000 8000 ~ 0x 2001 0000。
实际根本不是这样,stm32f103c8t6 ram只有20k,所以一对SP操作就异常,访问了非法地址。
改小之后就正常了。
在这里插入图片描述

5. 参考链接

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32扩展RAM是指将额外的RAM内存连接到STM32微控制器上,以增加嵌入式系统的可用内存空间。 为什么需要扩展RAM?在某些应用中,嵌入式系统可能需要处理大量的数据,如音频或图像数据。由于微控制器自身内存有限,无法满足这些应用的需求,因此需要通过扩展RAM来增加可用的内存空间。扩展RAM不仅可以存储更多的数据,还可以提高系统性能和响应速度。 如何实现扩展RAMSTM32微控制器通常提供外部存储器接口(FSMC或FMC)来连接外部RAM芯片。这些外部RAM芯片可以是SRAM(静态随机存储器)或SDRAM(同步动态随机存储器)。通过在微控制器上设置相应的寄存器和引脚配置,可以轻松地将外部RAMSTM32系统连接起来。 使用扩展RAM的好处是什么?首先,扩展RAM提供了更大的存储容量,使得嵌入式系统可以处理更多的数据。其次,扩展RAM可以减轻微控制器内部内存的负担,使其专注于其他主要任务,提高系统的稳定性和可靠性。此外,扩展RAM还可以提供更快的访问速度,从而加快系统的响应速度。 需要注意的是,在使用扩展RAM时,需要对内存的分配和管理进行适当的规划和配置。开发人员应确保正确初始化和使用扩展RAM,并避免内存泄漏和溢出的问题,以确保系统的正常运行。 总结而言,通过将额外的RAM连接到STM32微控制器上,可以扩展嵌入式系统的内存空间,使其能够处理更多的数据,并提高系统的性能和响应速度。在使用扩展RAM时,需要适当的规划和配置,以确保内存的正确使用和管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值