在stm32f407内部SRAM调试程序调试过程
目录
你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。
硬件
本次调试使用的硬件为正点原子STM32F4探索者开发板。
软件环境
软件使用的Keil V5.27.1.0
STM32f407使用的是LL库
调试程序介绍
为了能在FLASH运行和SRAM运行做个对比,写了两个测试程序。
在FLASH中运行的程序有两个LED灯会按照500ms的时间间隔闪烁
在SRAM中运行的程序只有一个LED灯会按照500ms的时间间隔闪烁
//主要代码如下:
int main(void)
{
NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
SystemClock_Config();
LED_GPIO_Config();
while(1)
{
/* 在flash中运行的代码 */
LED0_Toggle();
LL_mDelay(500);
LED1_Toggle();
/* 在sram中运行的代码 */
LED1_Toggle();
LL_mDelay(500);
}
}
RAM调试所需相关配置
1、修改代码存放地址和数据存放地址
点击魔法棒进入目标配置界面
然后将下图两个框框的值进行更改,比如我的芯片是stm32f407ZGT6带的sram有192K字节但是我能操作的只有128K,剩余64k由于只能CPU通过数据总线访问,使得我调试没法打断点。所以我把128K划分了两个部分,第一个部分从0x20000000开始的64K字节存放代码,第二个部分从0x20010000开始的64K用于存放程序运行过程用到的变量和其他临时数据
2、更改向量表
和上面一样点击魔法棒进入到C/C++的界面中,在如下图的框里面增加宏定义VECT_TAB_SRAM,此宏定义的作用是将中断向量表存放地址有默认的falsh改到SRAM上,如果不进行更改将会导致中断无法执行。宏定义在函数里面的实现如下图。位于system_stm32f4xx.c文件的SystemInit函数
3、更改DEBUG配置
要想在线调试需要更改DEBUG的相关配置,具体步骤看下图。
图片里的sram_run_test.ini文件是用来配置PC, SP指针的,让他们指向SRAM。
文件里面的内容如下(官方提供的):
FUNC void Setup (void) {
SP = _RDWORD(0x20000000); // Setup Stack Pointer
PC = _RDWORD(0x20000004); // Setup Program Counter
XPSR = 0x01000000; // Set Thumb bit
_WDWORD(0xE000ED08, 0x20000000); // Setup Vector Table Offset Register
}
LOAD %L INCREMENTAL // Download to RAM
Setup();
g, main
4、取消更新flash程序
在SRAM里面调试时,不更新FLASH里面的程序,配置界面如下:
运行
按照以上步骤设置好之后,就可以点击调试按钮 进入调试了。
在调试之前我先往FLASH中下载,闪两个灯的程序,然后切换到第二个程序下载到SRAM进行调试。
下载进入后能看到开发板上只有一个灯在闪,说明程序已经下载进去了,从调试界面也能出运行的PC指针值位于SRAM的地址范围内了,SP指针所在范围就是一开始设置的范围(0x20010000开始的),关闭调试界面,复位板子,此时运行的程序是之前烧写的(闪两个灯的程序)
参考链接: 链接.
来源:https://blog.csdn.net/qq_27718231/article/details/102739045