欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

在SRAM中调试程序

程序员文章站 2022-04-01 16:20:50
...

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

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

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

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

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

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

在SRAM中调试程序

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 创建工程的调试版本,并切换到该版本

在SRAM中调试程序
在SRAM中调试程序
2.2 配置分散加载文件,手动编辑sct文件进行配置
在SRAM中调试程序
根据原有的01.sct文件新建一个01Debug.sct文件,并修改01Debug.sct文件。

在SRAM中调试程序

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中。

在SRAM中调试程序

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

在SRAM中调试程序

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

在SRAM中调试程序

在SRAM中调试程序

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

在SRAM中调试程序


相关标签: SRAM调试