听说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 的程序会丢失,想恢复的话必须要重新下载程序
上一篇:STM32综合网上讲解的几种读保护措施
下一篇:STM32F412 串口接收不到数据的问题
推荐阅读最新更新时间:2024-11-18 10:16