一、 STM32启动配置
在STM32F10xxx里,可以通过BOOT[1:0]引脚选择三种不同启动模式。
在系统复位后,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存。
用户可以通过设置BOOT1和BOOT0引脚的状态,来选择在复位后的启动模式。
在从待机模式退出时,BOOT引脚的值将被被重新锁存;因此,在待机模式下BOOT引脚应保持为需要的启动配置。在启动延迟之后,CPU从地址0x0000 0000获取堆栈顶的地址,并从启动存储器的0x0000 0004指示的地址开始执行代码。
因为固定的存储器映像,代码区始终从地址0x0000 0000开始(通过ICode和DCode总线访问),而数据区 (SRAM) 始终从地址0x2000 0000开始(通过系统总线访问)。Cortex-M3的CPU始终从ICode总线获取复位向量,即启动仅适合于从代码区开始(典型地从Flash启动)。STM32F10xxx微控制器实现了一个特殊的机制,系统可以不仅仅从Flash存储器或系统存储器启动,还可以从内置SRAM启动。
二、 内置SRAM简介
一般情况下,我们在MDK 中编写工程应用后,调试时都是把程序下载到芯片的内部FLASH 运行测试的,代码的CODE 及RW-data 的内容被写入到内部FLASH中存储。但在某些应用场合下却不希望或不能修改内部FLASH 的内容,这时就可以使用RAM 调试功能了,它的本质是把原来存储在内部FLASH 的代码(CODE 及RW-data 的内容)改为存储到SRAM中(内部SRAM或外部SDRAM均可),芯片复位后从SRAM中加载代码并运行。
STM32F10xxx内置64K字节的静态SRAM。它可以以字节、半字(16位)或全字(32位)访问。SRAM的起始地址是0x2000 0000。
把代码下载到RAM中调试有如下优点:
下载程序非常快。RAM 存储器的写入速度比在内部FLASH 中要快得多,且没有擦除过程,因此在RAM上调试程序时程序几乎是秒下的,对于需要频繁改动代码的调试过程,能节约很多时间,省去了烦人的擦除与写入FLASH 过程。另外,STM32 的内部FLASH 可擦除次数为1 万次,虽然一般的调试过程都不会擦除这么多次导致FLASH 失效,但这确实也是一个考虑使用RAM的因素。
不改写内部FLASH 的原有程序。
对于内部FLASH 被锁定的芯片,可以把解锁程序下载到RAM上,进行解锁。
相对地,把代码下载到RAM中调试有如下缺点:
存储在RAM上的程序掉电后会丢失,不能像FLASH 那样保存。
若使用STM32 的内部SRAM 存储程序,程序的执行速度与在FLASH 上执行速度无异,但SRAM空间较小。
若使用外部扩展的SRAM 存储程序,程序空间非常大,但STM32读取外部SRAM 的速度比读取内部FLASH 慢,这会导致程序总执行时间增加,因此在外部SRAM中调试的程序无法完美仿真在内部FLASH 运行时的环境。另外,由于STM32 无法直接从外部SRAM中启动且应用程序复制到外部SRAM的过程比较复杂(下载程序前需要使STM32 能正常控制外部SRAM),所以在很少会在STM32 的外部SRAM中调试程序。
三、 例程验证
具体实验步骤参考《零死角玩转STM32——F103指南者》44.4实验:在内部SRAM 中调试
1、硬件设置
将跳线设置为BOOT[1:1]
2、创建工程调试版本
3、配置分散加载文件
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
LR_IROM1 0x08000000 0x00080000 { ; load region size_region
ER_IROM1 0x08000000 0x00080000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
.ANY (+XO)
}
RW_IRAM1 0x20000000 0x00010000 { ; RW data
.ANY (+RW +ZI)
}
}
4、配置中断向量表
void SystemInit (void)
{
/* ..其它代码部分省略 */
/* 配置向量表添加的偏移地址 ----*/
#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
}
5、修改FLASH 下载配置
6、实验结果