STM32F4_SRAM中调试代码

news2024/11/16 12:53:29

目录

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.coloradmin.cn/o/465083.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android类似微信聊天页面教程(Kotlin)四——数据本地化

前提条件 安装并配置好Android Studio Android Studio Electric Eel | 2022.1.1 Patch 2 Build #AI-221.6008.13.2211.9619390, built on February 17, 2023 Runtime version: 11.0.150-b2043.56-9505619 amd64 VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o. Windows 11 …

Flink从入门到精通之-07处理函数

Flink从入门到精通之-07处理函数 之前所介绍的流处理 API,无论是基本的转换、聚合,还是更为复杂的窗口操作,其实都是基于 DataStream 进行转换的;所以可以统称为 DataStream API,这也是 Flink 编程的核心。而我们知道…

同样是测试,你年薪50W,我年薪10W,我哭了...

软件测试可以拿到年薪50万? 开什么玩笑? 我才月薪15K。 小伙伴看到标题是不是一开始的反应是这样的?是的话举一个小爪爪吧! 那软件测试到底能不能拿到年薪50万呢? 没有吃过猪肉还没见过猪跑吗,你自己没…

【云原生-深入理解Kubernetes-1】容器的本质是进程

文章目录 👹 关于作者一、为什么会出现容器?二、容器是什么?三、容器“边界”的实现手段3.1、进程如何运行的?3.2、Namespace 与 Docker 边界容器的本质是一个进程这是怎么做到的呢? 总结✊ 最后参考 👹 关…

践行公益担当|人情如故,爱心依旧

爱心助学 情暖童心 随着改革开放,少数民族地区发生了翻天覆地的变化,城乡经济持续发展,人民生活水平日益提高。但对于很多居住在偏远山区的民族自然村,由于山区的地形限制,自然生存环境恶劣,交通及文化、教…

Android 项目必备(四十五)-->2023 年如何构建 Android 应用程序

Android 是什么 Android 是一种基于 Linux 内核并由 Google 开发的开源操作系统。它用于各种设备包括智能手机、平板电脑、电视和智能手表。 目前,Android 是世界上移动设备使用最多的操作系统; 根据 statcounter 的一份最近 12 个月的样本报告;Android 的市场份额…

C++ 编程笔记(本人出品,必属精品)

文章目录 Part.I IntroductionChap.I 快应用 Part.II C 基础Chap.I 一些待整理的知识点Chap.I 常用的库或类 Part.III 杂记Part.X Others WorkChap.I 大佬的总结Chap.II 大佬的轮子 Part.I Introduction 前言:C 用的人还是比较多的,主要是它比较快并且面…

2023-4-26-C++11新特性之正则表达式

🍿*★,*:.☆( ̄▽ ̄)/$:*.★* 🍿 💥💥💥欢迎来到🤞汤姆🤞的csdn博文💥💥💥 💟💟喜欢的朋友可以关注一下&#xf…

太为难我了,阿里面试了7轮...

前言 今年的大环境非常差,互联网企业裁员的现象比往年更严重了,可今年刚好是我的第一个“五年计划”截止的时间点,说什么也不能够耽搁了,所以早早准备的跳槽也在疫情好转之后开始进行了。但是,不得不说,这…

SOLIDWORKS认证考试流程

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

redis面试题(二)附答案

书接上回,接着分享面试题,最近开发了几个小伙伴的项目,耽误更新了,来点干货,表示歉意。大家有需求也可以找小编。 2、缓存穿击 业务通常会有几个数据会被频繁地访问,比如秒杀活动,这类被频地访…

好程序员:前端JavaScript全解析——Canvas绘制形状(上)

●今天,我们来通过 canvas 提供的方法开绘制一些简单的形状绘制矩形 绘制基础矩形。下面一起看看好程序员老师的讲解吧~ ●语法 : 工具箱.rect( 矩形起点 x 轴坐标, 矩形起点 y 轴坐标, 矩形宽度, 矩形高度 ) // 0. 获取到页面上的 canvas 标签元素节点 const canva…

Camtasia2023简体中文标准版免费更新下载

Camtasia专业的 屏幕录制和视频剪辑软件3000多万专业人士在全球范围内使用Camtasia展示产品,教授课程,培训他人,以更快的速度和更吸引人的方式进行沟通和屏幕分享。使您在Windows和Mac上进行录屏和剪辑创作专业外观的视频变得更为简单。 Camt…

Vue3 element-plus el-select 无法选中,又不报错

html 结构 <el-form :model"conditionForm"ref"conditionForm"label-width"100px" class"demo-ruleForm"><el-selectv-model"conditionForm.personnel"multipleplaceholder"Select"style"width: 2…

知网导入EndNote

首先进入知网&#xff0c;搜索你想要找的期刊论文。 选择EndNote 点击导出 浏览器自动下载以txt为后缀的文件 导入到EndNote中

【C++】异常,你了解了吗?

在之前的C语言处理错误时&#xff0c;会通过assert和错误码的方式来解决&#xff0c;这导致了发生错误就会直接把程序关闭&#xff0c;或者当调用链较长时&#xff0c;就会一层一层的去确定错误码&#xff0c;降低效率&#xff0c;所以c针对处理错误&#xff0c;出现了异常&…

ChatGPT写小论文

ChatGPT写小论文 只是个人对写小论文心得?从知乎,知网自己总结的,有问题,可以留个言我改一下 文章目录 ChatGPT写小论文-1.写论文模仿实战(狗头)0.论文组成1.好论文前提:2.标题3.摘要4.关键词5.概述6.实验数据、公式或者设计7.结论&#xff0c;思考8.参考文献 0.模仿1.喂大纲…

【云原生】Dockerfile制作WordPress镜像,实现Compose + K8s编排部署

文章目录 &#x1f479; 关于作者前言环境准备目录结构 dockerfile制作镜像yum 脚本Dockerfile-mariadb 镜像Dockerfile-service 镜像docker compose 编排 K8s部署svcdeploy ✊ 最后 &#x1f479; 关于作者 大家好&#xff0c;我是秋意零。 &#x1f608; CSDN作者主页 &…

lambda的toMap是不是要注意点,线上事故

异常回顾 先看代码&#xff1a; dbTaxiDrivers.ifPresent((drivers) -> { map.putAll(drivers.stream() .collect(Collectors.toMap(TaxiDriverInfo::getOperationId, item -> item))); }); 相信很多为了减少2层for循环&#xff0c…

✨✨✨ ❃ ♕ ꕥ Xpath解析html获取表情符号,丰富你的文章 ꧁ ꧂꧁ ꧂

✨✨✨ ❃ ♕ ꕥ Xpath解析html获取表情符号&#xff0c;丰富你的文章 ꧁ ꧂꧁ ꧂ 1. 推荐几个好玩的表情符号网站2. xpath解析html获取表情3. xpath解析html源码3.1 parse_li.py3.2 symbol2.html 参考 1. 推荐几个好玩的表情符号网站 &#x1f495; &#x1f9da; &#x1f6…