1、设置硬件。让BOOT1与BOOT0引脚都为高电平,即BOOT1和BOOT0都为1。设置STM32程序启动方式为SRAM。
2、新建一个文件夹作为程序编译时的输出。这个是为将SRAM编译输出的文件集中在一起。最好不要使用之前的输出文件夹。
3、新建一个文件。这是SRAM模式的Debug文件。保存着一些调试信息。
文件的内容如下,自己新建的文件,可以直接复制内容过去进行简单修改:
/******************************************************************************/
/* Dbg_SRAM.ini:用于SRAM调试*/
/******************************************************************************/
FUNC void Setup(void)
{
SP = _RDWORD(0x20000000); //设置堆栈指针
PC = _RDWORD(0x20000004); //设置PC指针
_WDWORD(0xE000ED08, 0x20000000); //设置中断向量表地址
}
/*这条语句需要修改为当前axf文件位置,这个axf文件是编译后生成的,可以在初次编译前不设置,到编译后再设置*/
LOAD .\SRAMOutput\Test.axf INCREMENTAL //装载代码到CPU的SRAM,工程选择就不能再选择Load Application are Startup
Setup(); //调用Setup函数进行设置
g, main //运行到main函数
4、设置target Options...。这里要设置的比较多,直接截图了。
4.1、首先是设置Target选项
从上面可以看出,我的芯片是STM32F103C8芯片,因此有关寄存器地址段可以按照自己芯片的相关信息进行设置。
从上面可以看出需要设置代码和数据放在什么地址域里,可以根据自己的代码和数据量适当调整。
4.2、下面设置Output选项,选择输出位置为刚才新建的文件夹,一样需要输出.hex文件,名字随自己改或不改。
4.3、继续设置C/C++选项。主要是在原有基础上添加VECT_TAB_SRAM。这是为了设置SRAM运行的中断向量。在
system_stm32f10x.c文件中有相关VECT_TAB_SRAM的定义。应该去找找如果有,设置这里就这样就可以,如果没有
则需要手动在main函数中设置中断语句。
如果在system_stm32f10x.c中没有如下语句,则需要在main函数中输入如下语句
输入如下语句:
#ifdef VECT_TAB_RAM
/* Set the Vector Table base location at 0x20000000 */
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else /* VECT_TAB_FLASH */
/* Set the Vector Table base location at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
或者直接加
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
4.4、设置Debug选项。原本的JLink下载选项不变,但原本的Load Application...不在选上。添加刚刚新建的.ini文件到这里。
这里第一项的JLink后面的Setting需要设置
向上面一样,首先能够获取JLink仿真器和设备的信息。然后设置Flash Download。
从上面可以看到有些信息跟刚才设置是一一对应的,所以需要按照你先前设置的来。设置好就可以OK这里了一项了。
4.5、设置Utilities选项,这里的调试器选择跟Debug选项一样,勾选Update...。在设置Setting。
如果刚才的Flash Download设置正确,那么这里的Setting选项也会跟着变化。
这样就完成了基本设置。
5、进行程序调试。
为了判断是否设置正确,首先设置BOOT0为低电平,即为0,下载一个简单的,像闪烁LED,或者流水灯一样的程序到Flash中。这时上电会有一个闪烁的灯,就能知道是从Flash运行的。
下一步将BOOT0再改回高电平,即为1,开始测试SRAM设置。
5.1、编译,下载。有的讲,可以不下载,直接点调试。我测试时是不可以不下载的。
5.2、调试。我已经开始运行了,说明程序运行时可以的。如果不能运行,很有可能没下进去,或没设置对。
调试时现象也正确。
5.3、最后一步,为了证明是在SRAM中,直接给开发板断电重启,发现不执行任何程序,说明SRAM里数据丢失,没有程序了。
然后把BOOT0接低电平,即为0,在重启开发板,LED正常闪烁。
表示,刚刚程序调试时是下载到SRAM中的,Flash没有被擦除,由此保护了Flash。
谢谢各位阅读。