在SRAM中调试程序

经过前段时间的学习,我意识到了一些Keil编程调试的技巧,下面主要介绍一些关于Keil如何从SRAM中调试。

首先,为什么要这样做,我在同样的那本书上看到的总结:

1.下载速度快。RAM的写入速度比内部的Flash的写入速度快得多,且么有擦除过程,因此对于在RAM上调试程序时几乎时瞬间下载,而且我在写程序的过程中也发现,有些时候编译下载再运行是一个很慢的过程,需要几秒,遇到BUG总是修改完继续编译下载,尽管有时候修改很小。

2.不改写内部Flash中原有的程序。

3.对于内部Flash被锁定的芯片,可以把解锁程序下载到RAM中进行解锁。

缺点不多说,当然是配置的有点多,需要有一定的熟练度,这也是我写这篇文章的目的。还有就是RAM的空间往往比内部Flash小,所以当程序比较大时,往往放不下,这个时候还是需要原始的方法,下载到Flash上运行。下图就是我的一个移植文件系统时想再SRAM中调试的出错图,笔者没有深究错误的原因,大概就是程序太大的原因,因为FatFs添加了简体中文支持后程序变得很大,当然,遇到这种情况就需要我们采用下载到内部Flash的方式,或者外接更大的Flash存储器或其他存储器。

1.硬件上,需要设置一下BOOT的启动设置:
BOOT设置
BOOT0 BOOT1 启动方式
0 X 用户闪存(内部Flash)
1 0 系统存储器/ISP
1 1 内嵌SRAM
根据上边的启动设置说明,我们需要将BOOT0和BOOT1引脚都使用跳线帽接到3.3V置一。

2.软件配置上,主要步骤:

1》在原工程的基础上创建一个调试版本;

2》修改分散加载文件,使链接器把代码分配给内部的SRAM空间;

3》添加宏修改STM32的向量表地址;

4》修改仿真器和下载器配置,使得程序能通过下载器存储到内部的SRAM中;

5》根据使用情况选择是否需要使用仿真器命令脚本文件*.ini;

6》尝试向SRAM中下载程序或进行软件仿真。

具体操作:

2.1 创建工程的调试版本,并切换到该版本


2.2 配置分散加载文件,手动编辑sct文件进行配置

根据原有的01.sct文件新建一个01Debug.sct文件,并修改01Debug.sct文件。

2.3 配置中断向量表,因为startup_stm32f10x.s文件中的启动代码不是指定到绝对地址的,所以该文件不需要修改。重点时启动文件定义的中断向量表被存储在内部Flash还是被存储在内部SRAM中,内核会根据它的向量表偏移寄存器配置来获取向量表,即中断服务函数的入口。而该寄存器中存放的地址时在启动文件中Reset_Handler中调用的库函数SystemInit配置的。

void SystemInit(void)
{
  /*其他代码略*/
  #ifdef VECT_TAB_SRAM
  SCB->VTOR=SRAM_BASE | VECT_TAB_OFFSET;//向量表存储在SRAM中
  #else
  SCB->VTOR=FLASH_BASE | VECT_TAB_OFFSET;//向量表存储在内部Flash中
  #endif
}
从上面的代码可以分析到,宏VECT_TAB_SRAM是否定义,决定VTOR的配置。默认情况下,代码中没有定义该宏,所以,默认情况下,向量表存储在内部的Flash中。我们当然可以在文件中直接定义该宏。但是为了更灵活,我们需要在编译器的选项中配置,这种情况下,不会影响原来的工程,即等到调试成功后,原来的工程还可以直接下载到内部Flash中。


2.4 修改Flash下载配置,下载到内部SRAM中,不需要在进行数据的擦除(Flash的特殊性质决定其在写之前必须进行数据的擦除)。剩下的就是地址设置,需要和之前*.sct文件中的地址相互一致。


2.5 指定PC和SP指针值的仿真器设置,之所以进行这一步设置,是因为防止调试时单击复位按钮后,程序的SP和PC的指向发生错误,每次希望复位程序时,都需要我们重新点击启动调试按钮。



最后程序PC和SP正常的图,不清楚我的单片机为什么PC值总是0x20000B54,SP总是0x20008420,但是实验过程就是这样,我不是一个太严谨的人大笑如果有人懂,欢迎指教。



猜你喜欢

转载自blog.csdn.net/zyxhangiian123456789/article/details/79100920
今日推荐