STM32F4_SRAM中调试代码

news/2024/5/6 2:40:38/文章来源:https://blog.csdn.net/light_2025/article/details/128694287

目录

1. 在RAM中调试代码

2. STM32的三种存储方式

3. STM32的启动方式

4. 实验过程


        通过上一节的学习,我们已经了解了SRAM静态存储器

1. 在RAM中调试代码

        一般情况下,我们在MDK中编写工程应用后,调试时都是把程序下载到芯片内部FLASH运行测试的,代码的CODE及RW-data的内容被写入到内部FLASH中存储。但是某些应用场合下却不希望或者不能修改内部FLASH的内容,这时就可以使用RAM调试功能,它的本质是把原来存储在内部FLASH的代码(CODE及RW-data的内容)改为存储到SRAM中(内部SRAM或者外部SDRAM均可),芯片复位后从SRAM中加载代码并运行。                

在RAM中调试程序有以下的优势

        我们通常都是使用 MDK 的 Build 和 DownLoad 来下载程序到 Flash,但是通过这种方式下载到 FLASH 中是有擦除和写入的过程,当代码比较长时,这种方式是比较费时间的。

        写入到 RAM 存储器中,下载速度比内部 FLASH 要快的多,而且没有擦除过程,因此在 RAM 中调试程序时程序几乎是秒下的,对于那些大型程序,并且需要频繁更改的程序,能节省很多时间。并且通过 RAM 不会改写内部 FLASH 的原有程序。对于内部 FLASH 被锁定的芯片,可以把解锁程序下载到 RAM 上,进行解锁。

在RAM中调试程序最大的缺点是:        

        RAM中存储程序会掉电丢失。不能像FLASH那样保存。      

        RAM中存储空间比较小,不像FLASH那样存储空间比较大。  

2. STM32的三种存储方式

BOOT 引脚:

可以去仔细的看自己的开发板:

        开发板在出厂的时候:对于上述的 BOOT 3*2插针 ,默认是通过跳线帽将 BOOT0 和 GND连接;将 BOOT1 和 GND连接;默认就是将 MDK编译好的程序下载到Flash 中;

        开发板在设计的时候,对于 BOOT插针 的设置,是有 3.3V 高电平1 的,也就是说设计师在设计开发板的时候,不仅仅是希望我们只是将程序下载到Flash中看看现象的;更多的是希望我们通过跳线帽灵活的配置程序下载到三种不同的存储方式中。

3. STM32的启动方式

        M4内核在离开复位状态后会从映射的地址中取值给栈指针MSP以及程序指针PC,然后执行指令,一般以存储器的类型来区分自举过程,例如内部FLASH启动方式、内部SRAM启动方式以及系统存储器启动方式。

内部Flash启动过程

        当芯片被上电采样BOOT0引脚为低电平时,0x00000000和0x00000004的地址会被映射到内部Flash的0x08000000和0x08000004地址。当M4内核离开系统复位命令以后,读取0x08000000地址的内容会被赋值给栈指针MSP,作为栈顶地址。读取0x08000004地址的内容赋值给程序指针PC,作为将要执行的第一个指令所在的地址。

具备这两个条件以后,M4内核就可以开始从PC指向的地址中读取指令执行了。

内部SRAM启动方法

        类似的,当芯片被上电采样到BOOT0和BOOT1引脚均为高电平时,0x00000000和0x000000004地址会被映射到内部SRAM的首地址0x200000000和0x20000004,内核从SRAM空间获取内容进行自举。

        在实际的应用中,由启动文件startup_stm32f40_41xxx.s决定了0x00000000和0x00000004地址中存储了什么内容,链接时,由分散加载文件(sct)决定这些内容的绝对地址,也就是分配到内部Flash还是内部SRAM;

系统存储器启动方式

        当芯片上电后采样到BOOT0引脚为高电平,BOOT1引脚为低电平时,内核将从系统存储器的0x1FFFF000及0x1FFFF004获取MSP及PC值进行自举。系统存储器是一段特殊的空间,用户是不能访问的。ST公司在芯片出厂前就在系统存储器中固化了一段代码。因此使用系统存储器启动方式时,内核会执行该代码,该代码运行时,会为ISP提供支持(In System Program),如检测USART1/3、CAN2及USB通讯接口传输过来的信息,并根据这些信息更新自己内部Flash的内容,达到升级产品应用程序的目的,因此这种启动方式也称为ISP启动方式。

系统存储器的存储方式等同于使用FlyMcu  APP进行下载程序到芯片内部Flash。

4. 实验过程

        本实验将会程序写入到内部SRAM中;

        有两种方式可以验证程序的正确性,一种是直接下载到 Flash 中,一种是在 SRAM 中跑。但是要注意程序在 SRAM 中运行掉电会消失,不过他也有他的优点,避免了每次擦写 FALSH,毕竟 FLASH的擦写次数是有限的,在 SRAM 中验证程序没有问题后,可以再烧录在 FLASH 中。   

给 SRAM 分区

        M4 处理器的 Flash 的初始地址为 0x80000000,而 SRAM 的起始地址为 0x20000000。首先将 SRAM 空间均分,一部分构造成 ROM,一部分构造成 RAM。注意ROM的地址是紧跟着RAM的。这里构造的目的是假装从 ROM 启动,这样不需要在硬件上变更 BOOT0、BOOT1 的值

增加 SRAM 向量表

        对应的还要在 main 文件中加入 NVIC_SetVectorTable(NVIC_VectTab_RAM,0x0);这样才能找到 SRAM 的入口地址。否则入口地址总是在 0x00000000

int main(void)
{NVIC_SetVectorTable(NVIC_VectorTab_RAM,0x0);}

增加初始化文件

//ini文档的地址为:PACK\Keil\STM32F4xx_DFP\2.15.0\MDK\Boards\ST\32F469IDISCOVERY\Blinky\Debug_RAM.ini/*
FUNC void Setup (void) {
SP = _RDWORD(0x20000000); // Setup Stack Pointer
PC = _RDWORD(0x20000004); // Setup Program Counter//这里注意SP指针和PC指针的指向;
//关于这两个指针在上述已经进行了清楚的介绍XPSR = 0x01000000; // Set Thumb bit
_WDWORD(0xE000ED08, 0x20000000); // Setup Vector Table Offset Register
}LOAD %L INCREMENTAL // Download to RAM
Setup();
*/

选择不擦出 FLASH

不要勾选 updata target before debugging ,简单来说就是不下载到 Flash 中;

运行 SRAM

点击按键,进入调试模式,就可以进入 SRAM 中调试代码啦,然后退出 debug 的界面,在 MDK 中运行程序仍然是 SRAM 的程序。

​​​​​​​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_104020.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java_异常

Java_异常 1.什么是异常 ​ 生活中的异常:感冒发烧、电脑蓝屏、手机死机等。 ​ 程序中的异常:磁盘空间不足、网络连接中断、被加载的资源不存在等。 ​ 程序异常解决办法:针对程序中非正常情况,Java语言引入了异常&#xff0…

注意力机制:基于Yolov5/Yolov7的Triplet注意力模块,即插即用,效果优于cbam、se,涨点明显

论文:https://arxiv.org/pdf/2010.03045.pdf 本文提出了可以有效解决跨维度交互的triplet attention。相较于以往的注意力方法,主要有两个优点: 1.可以忽略的计算开销 2.强调了多维交互而不降低维度的重要性,因此消除了通道和权…

日撸 Java 三百行day38

文章目录 说明day381.Dijkstra 算法思路分析2.Prim 算法思路分析3.对比4.代码 说明 闵老师的文章链接: 日撸 Java 三百行(总述)_minfanphd的博客-CSDN博客 自己也把手敲的代码放在了github上维护:https://github.com/fulisha-ok/…

VR全景图片,探究VR全景图片为何如此受欢迎?

随着科技的不断进步,虚拟现实技术逐渐渗透到我们的日常生活中,为我们带来了许多前所未有的体验和乐趣。而其中,VR全景图片作为一种基于虚拟现实技术的图片展示形式,不仅在旅游、房地产、教育等领域得到了广泛的应用,也…

c++强制类型转换:

强制类型转换:1. const属性用const_cast。 案例: 说明:该变量可以将变量的const 的属性去掉。如该案例,转换后修改x的值是合法的。2. 基本类型转换用static_cast。 案例: 说明:一般用在(1)基本类型&#xf…

学系统集成项目管理工程师(中项)系列10_立项管理

1. 系统集成项目管理至关重要的一个环节 2. 重点在于是否要启动一个项目,并为其提供相应的预算支持 3. 项目建议 3.1. Request for Proposal, RFP 3.2. 立项申请 3.3. 项目建设单位向上级主管部门提交的项目申请文件,是对拟建项目提出的总体设想 3…

基于centos7:Harbor-2.7.2部署和安装教程

基于centos7:Harbor-2.7.2部署和安装教程 1、软件资源介绍 Harbor是VMware公司开源的企业级DockerRegistry项目,项目地址为https://github.com/vmware/harbor。其目标是帮助用户迅速搭建一个企业级的Dockerregistry服务。它以Docker公司开源的registry…

WPF学习

一、了解WPF的框架结构 (第一小节随便看下就可以,简单练习就行) 1、新建WPF项目 xmlns:XML的命名空间 Margin外边距:左上右下 HorizontalAlignment:水平位置 VerticalAlignment:垂直位置 2…

Timer0/1设置时钟计算中断时间

时钟一般分为外部晶振时钟和内部时钟,相对而说,外部晶振时钟的精准度比内部系统时钟高,时间计算的更准。除非产品需要一般都不会用外部晶振时钟,因为好的东西贵啊,成本高。 本文主要介绍如何利用时钟设置Timer0/1&…

厨电新十年,不可逆的行业分化与老板电器的数字进化

“人生就像滚雪球,最重要之事是发现湿雪和长长的山坡。”股神巴菲特的这句名言,让坡是否长、雪是否厚成为人们评价一个行业、一家公司的标准之一。 家电行业,厨电曾是最后一块“坡长雪厚”之地,投资者也对相关企业给出了相当的热…

MySQL根据中文姓名排序查询

在MySQL中当说到进行排序查询时,大家的第一反应就是使用 ORDER BY 方法指定列进行排序,但是如果要指定列为中文数据按照首字母排序时,就会发现 ORDER BY 方法排序的顺序其实是有问题的。 我们先来测试下正常使用 ORDER BY 排序: 指…

35岁程序员被裁赔偿27万,公司又涨薪让我回去,前提是退还补偿金,能回吗?

在大多数人眼里,35岁似乎都是一道槛,互联网界一直都有着“程序员是吃青春饭”的说法,。 如果在35岁的时候被裁能获得27万的赔偿,公司又涨薪请你回去上班,你会怎么选? 最近,就有一位朋友在网上…

剑指 Offer 42. 连续子数组的最大和:C语言解法

剑指 Offer 42. 连续子数组的最大和 - 力扣(Leetcode) 输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。 要求时间复杂度为O(n)。 实例: 输入: nums [-2,1,-3,4,-1,2,1,-5,4] 输出: …

SOLIDWORKS认证考试流程

一、SOLIDWORKS认证考试前的准备工作 1、检查电脑硬件设备是否可以正常使用,如键盘鼠标等。 2、检查Solidworks软件是否可以正常使用。 3、关闭电脑所有杀毒软件。 4、检查电脑网络(外网)是否正常。 5.请联系我们获取考试系统软件安装包。…

Maven 下载及配置详细步骤

1、Maven 下载 Maven 官网地址:https://maven.apache.org/download.cgi(opens new window) 进入 Maven 官网,点击 archives 下载版本 3.6.2 找到下载的压缩包并解压

ByteHouse云数仓版查询性能优化和MySQL生态完善

ByteHouse云数仓版是字节跳动数据平台团队在复用开源 ClickHouse runtime 的基础上,基于云原生架构重构设计,并新增和优化了大量功能。在字节内部,ByteHouse被广泛用于各类实时分析领域,最大的一个集群规模大于2400节点&#xff0…

workerman开发者必须知道的几个问题

1、windows环境限制 windows系统下workerman单个进程仅支持200个连接。 windows系统下无法使用count参数设置多进程。 windows系统下无法使用status、stop、reload、restart等命令。 windows系统下无法守护进程,cmd窗口关掉后服务即停止。 windows系统下无法在一个…

初识Spring(普通方式Bean的读取过程)

1.SpringBoot 相⽐于 Servlet 的优点总结 1. 添加外部 jar 更容易,不易出错(版本问题⽆需关注); 2. 调试项⽬更加⽅便,⽆需配置 Tomcat; 3. 发布项⽬更加⽅便,⽆需配置 Tomcat; 4. …

Redis学习笔记大全

文章目录 1、redis概述和安装1.1、安装redis1.2、启动redis方式1:前台启动(不推荐)方式2:后端启动(推荐) 1.3、关闭redis1.4、进入redis命令窗口1.5、redis命令大全1.6、redis介绍相关知识 2、redis 5大数据…

C#:如何用分部类将一个大文件改为多个小文件?

很多时候我们会发现,写来写去,一个文件慢慢就变得很大了,行数过千基本上就维护比较困难。 将公共代码模块化,可以减少一些代码,也是非常有效的。 那还有其它办法吗? 用 分部类 可以解决。 下面是简单的…