STM32内部SRAM调试程序

雨燕双飞 提交于 2019-12-02 08:39:52

目录

你好! 这是你第一次使用 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开始的),关闭调试界面,复位板子,此时运行的程序是之前烧写的(闪两个灯的程序)
在这里插入图片描述

参考链接: 链接.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!