KEIL 配置STM32 SRAM启动,调试

发布者:暮烟微雨最新更新时间:2022-06-01 来源: eefocus关键字:KEIL  配置  STM32  SRAM启动  调试 手机看文章 扫描二维码
随时随地手机看文章

听说STM32的FLASH只能擦写10000次,一个开发板就算1天擦写10次 10000/10/365=2.73972602739726,那岂不是一个开发板用两年之后芯片就废了,好方啊,有没有(其实如果你能做到10000次擦写,估计这个开发板你已经玩透了,把芯片刷过flash寿命,菜鸟也变成老鸟了)。如果你实在担心擦写10000次,那就可以试试在RAM中调试代码。


一、STM32的自举配置:
在这里插入图片描述
主flash:即从内部flash启动,keil下载程序默认就是下载到这里的,10000次擦写指的也是这里,发布版本的程序也是这种启动模式
SRAM:即从RAM中启动程序,调试的时候可以从RAM中启动
系统存储器:一般用于ISP(in system program)


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


把代码下载到 RAM 中调试有如下优点:
1、下载程序速度非常快。 RAM 存储器的写入速度比在内部 FLASH 中要快得多,且没有擦除过程,因此在 RAM 上调试程序时程序几乎是秒下的,对于需要频繁改动代码的调试过程,能节约很多时间,省去了烦人的擦除与写入 FLASH 过程。
2、不改写内部 FLASH 的原有程序。
3、对于内部 FLASH 被锁定的芯片,可以把解锁程序下载到 RAM 上,进行解锁。


把代码下载到 RAM 中调试有如下缺点:
1、存储在 RAM 上的程序掉电后会丢失,不能像 FLASH 那样保存。
2、若使用STM32的内部SRAM存储程序,程序的执行速度与在FLASH上执行速度无异,但SRAM空间较小。
3、若使用外部扩展的 SDRAM 存储程序,程序空间非常大,但 STM32 读取SDRAM 的速度比读取内部 FLASH 慢,这会导致程序总执行时间增加,因此在SDRAM 中调试的程序无法完美仿真在内部 FLASH 运行时的环境。另外,由于STM32 无法直接从 SDRAM 中启动且应用程序复制到 SDRAM 的过程比较复杂(下载程序前需要使 STM32 能正常控制 SDRAM),所以在很少会在 STM32 的SDRAM 中调试程序


三、在内部SRAM中调试代码:
1、创建工程的调试版本
由于在 SRAM 中运行的代码一般只是用于调试,调试完毕后,在实际生产环境中仍然使用在内部FLASH中运行的代码,因此我们希望能够便捷地在调试版和发布版代码之间切换。 MDK 的“ Manage Project Items”可实现这样的功能,使用它可管理多个不同配置的工程,点击“ Manage Project Items”按钮,在弹出对话框左侧的“ Project Target”一栏包含了原工程的名字,如图中的原工程名为“LED_TEST”,右侧是该工程包含的文件。为了便于调试,我们在左侧的“ Project Target”一栏添加一个工程名,如图中输入“LED_TEST_DEBUG”,输入后点击 OK 即可,这个“LED_TEST_DEBUG”版本的工程会复制原“LED_TEST”工程的配置,后面我们再进行修改。
当需要切换工程版本时,点击 MDK 工程名的下拉菜单可选择目标工程,在不同的工程中,所有配置都是独立的,例如芯片型号、下载配置等等,但如果两个工程共用了同一个文件,对该文件的修改会同时影响两个工程,例如这两个工程都使用同一个 main 文件,我们在 main 文件修改代码,两个工程都会被修改。


2、配置分散加载文件:
在原来工程的.sct文件的工程目录下新建一个LED_TEST_DEBUG.sct文件,在“ Options for Target->linker”的选项中取消勾选第一个√,自己把刚刚新建的分散加载文件添加进来并 edit


LR_IROM1 0x20000000 0x00010000 { ; load region size_region  虚拟的flash

ER_IROM1 0x20000000 0x00010000 { ; load address = execution address 虚拟的flash地址和大小

*.o (RESET, +First)

*(InRoot$$Sections)

.ANY (+RO)

}

RW_IRAM1 0x20010000 0x00020000 { ; RW data 虚拟SRAM地址和大小

.ANY (+RW +ZI)

}

}  


在这个分散加载文件配置中,把原本分配到内部 FLASH 空间的加载域和执行域改到了以地址 0x20000000 开始的 64KB(0x00010000)空间, 而 RW data 空间改到了以地址0x20010000 开始的 128KB 空间 (0x00020000)。也就是说,它把 STM32 的内部 SRAM 分成了虚拟 ROM 区域以及 RW data 数据区域,链接器会根据它的配置给工程中的各种内容分配到 SRAM 地址。


3、配置中断向量表
在system_stm32f4xx.c 文件中SystemInit()函数中有如下定义:


#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 来决定 VTOR 的配置,默认情况下代码中没有定义宏 VECT_TAB_SRAM,所以 VTOR 默认情况下指示向量表是存储在内部FLASH 空间的。由于本工程的分散加载文件配置,在启动文件中定义的中断向量表会被分配到 SRAM空间,所以我们要定义这个宏,使得 SystemInit 函数修改 VTOR 寄存器,向内核指示向量表被存储到内部 SRAM 空间了,
Options for Target-> c/c++ ->Define”框中输入宏 VECT_TAB_SRAM,注意它与其它宏之间要使用英文逗号分隔开。注意不要在在system_stm32f4xx.c文件中定义这个宏,因为在system_stm32f4xx.c文件修改后下载到flash的代码也是使用这个宏了,所以在工程选项卡中定义


4、修改flash的下载配置:
得到 SRAM 版本的代码指令后,为了把它下载到芯片的 SRAM 中,还需要修改下载器的配置
Options for Target->Utilities->Settings:
1、do not erase
2、RAM for Algorithm即程序的RAM空间 指“编程算法” (Programming Algorithm)可使用的RAM 空间, 下载程序到 FLASH 时运行的编程算法需要使用 RAM 空间,在默认配置中它的首地址为 0x20000000,即内部 SRAM 的首地址,但由于我们的分散加载文件配置, 0x20000000 地址开始的 64KB 实际为虚拟 ROM 空间,实际的 RAM空间是从地址 0x20010000 开始的,所以这里把算法 RAM 首地址更改为本工程中实际作为 RAM 使用的地址。若编程算法使用的 RAM 地址与虚拟 ROM 空间地址重合的话,会导致下载出错。

3、Programming Algorithm即flash的地址和大小 设置内部 FLASH 的编程算法,编程算法主要描述了 FLASH 的地址、大小以及扇区等信息, MDK 根据这些信息把程序下载到芯片的 FLASH 中,不同的控制器芯片一般会有不同的编程算法。由于 MDK 没有内置 SRAM 的编程算法,所以我们直接在原来的基础上修改它的基地址和空间大小,把它改成虚拟 ROM 的空间信息。


四、下载程序
BOOT0和BOOT1设置为SRAM启动,芯片掉电后这个存储在 SRAM 的程序会丢失,想恢复的话必须要重新下载程序

关键字:KEIL  配置  STM32  SRAM启动  调试 引用地址:KEIL 配置STM32 SRAM启动,调试

上一篇:STM32综合网上讲解的几种读保护措施
下一篇:STM32F412 串口接收不到数据的问题

推荐阅读最新更新时间:2024-11-18 10:16

keil编程环境中遇到几种常见警告分析
keil中常见的几种警告,固然,相对于错误的,警告的程度不及错误的严重性,有时候忽略,会出现意想不到的错误。先看看常见的几种错误,分析出来现的原因。 1. Warning 280: i :unreferenced local variable 说明 局部变量 i 在函数中未作任何的存取操作 解决方法 消除函数中 i变量的宣告 2 Warning 206: Music3 :missing function-prototype 说明 Music3( )函数未作宣告 或未作外部宣告 所以无法给其他函数调用 解决方法 将叙述void Music3(void)写在程序的最前端作宣告 如果是其他文件的函数则要写成 extern void
[单片机]
keil中C51关键字code用法
keil中关键字code说明 关键字code是51单片机特有关键字,用unsigned int 或signed char等定义的变量都存储在单片机的RAM中,程序中可以随意更改这些变量的值。而运用code关键字修饰下定义的变量,比如unsigned char code i;,它们则存储在单片机程序存储空间FLASH中,节省单片机RAM资源,但在程序中不能更改这些变量的值。
[单片机]
低成本ARM系列LM3S101微控制器的结构与应用
LM3S101是美国Luminary公司生产的、基于ARMCortex-M内核的32位微控制器芯片,它的销售价格在1美元以下,在构建同等性价格比的应用系统时成本很低。广州周立功单片机发展有限公司推出了以学习和评估该芯片为目的的开发套件EasyArm101。该套件由H-JTAG调试器、开发板、KeilμVision开发工具包、各类驱动程序库、文档以及与实例程序配套的相关元器件等组成。 1 LM3S101芯片的架构与特点 1.1 架 构 图1是LM3S101 芯片电路图和EasyArm101开发套件实物图。 LM3S101采用哈佛架构、Thumb-2指令集。芯片内部集成了8 KB单周期的Flash ROM,2 KB单
[工业控制]
STM32中GPIO的8种工作模式
最近在看数据手册的时候,发现在Cortex-M3里,对于GPIO的配置种类有8种之多: (1)GPIO_Mode_AIN 模拟输入 (2)GPIO_Mode_IN_FLOATING 浮空输入 (3)GPIO_Mode_IPD 下拉输入 (4)GPIO_Mode_IPU 上拉输入 (5)GPIO_Mode_Out_OD 开漏输出 (6)GPIO_Mode_Out_PP 推挽输出 (7)GPIO_Mode_AF_OD 复用开漏输出 (8)GPIO_Mode_AF_PP 复用推挽输出 对于刚入门的新手,我想这几个概念是必须得搞清楚的,平时接触的最多的也就是推挽输出、开漏输出、上拉输入这三种,但一直未曾对这些做过归纳。因此,在这里做一个总
[单片机]
<font color='red'>STM32</font>中GPIO的8种工作模式
STM32区别 SYSCLK和HCLK和PCLK1和PCLK2(system_stm32f10x.c中PCLK1才进行2分频设置)
system_stm32f10x.c system_stm32f10x.cstatic void SetSysClockTo72(void) { __IO uint32_t StartUpCounter = 0, HSEStatus = 0; /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/ /* Enable HSE */ RCC- CR |= ((uint32_t)RCC_CR_HSEON); /* Wait till HSE is ready and if Time out is reach
[单片机]
<font color='red'>STM32</font>区别 SYSCLK和HCLK和PCLK1和PCLK2(system_stm32f10x.c中PCLK1才进行2分频设置)
基于NiosII的SOPC多处理器系统设计方法
两个或多个微处理器一起工作来完成某个任务的系统称为“多处理器系统”。传统基于单片机的多处理器系统结构复杂,可靠性差;而基于32位的嵌入式软核处理器NiosII的SOPC(可编程片上系统)多处理器系统解决方案,从根本上改变了多处理器系统的设计理念和方法。使用Altera公司的NiosII软核处理器和SOPC Builder工具,可以快速地设计和建立共享资源的多处理器系统。多处理器系统一般用于工作站和使用分载(load-sharing)的复杂算法(称为“对称多处理器SMP”)的高端PC计算。对于大部分嵌入式系统,当SMP的开销太大时,使用多个处理器执行不同的任务,实现不同的功能正引起越来越多的关注。Altera公司的FPGA为开发非对
[工业控制]
STM32 在温度监控系统中的应用
引言 现代工业控制领域通常要测量很多信号,将其转化为计算机可以识别的二进制信号,并利用计算机监视和记录各种测量的信号。这个过程就要涉及到信号的采集和处理。CAN 总线是一种串行多主总线,它卓越的特性、极高的可靠性和独特的设计,特别适合工业过程监控设备的互连,因此,越来越受到工业界的重视,并已公认为最有前途的 现场总线 之一。本文介绍了基于 STM32 和 CAN 总线的温度监控系统的设计,通过上位机与下位机的通信,实现对温度数据的监控,并经初步实验达到了设计的要求。 1 系统总体方案概述 系统总体框图如图 1 所示,本系统采用主站+从站的结构,CAN 主站主要实现温度数据的存储以及 CAN 总线协议和串口协议之间的 桥接 ,CA
[单片机]
在arm linux Qt下编译配置libusb-1.0
一、配置环境 1.安装arm-linux-gcc编译器 2.编译qt-everywhere并安装 3.安装qt creator 具体参考:http://www.cnblogs.com/oceanking/archive/2012/09/04/2671150.html 二、编译安装libusb-1.0 到libusb网站下载libusb www.libusb.org 1.解压后cd进入该文件夹,顺序执行如下命令:(需要确保已经将arm-linux-gcc所在路径加入PATH中) ./configure CC=arm-linux-gcc CXX=arm-linux-g++ --build=i686-linux --host
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved