下载程序到SRAM中进行调试——STM32F103CBT6
1. 在原工程的基础上创建一个调试版本;
2. 添加宏修改STM32的向量表地址;
VECT_TAB_SRAM
3. 修改分散加载文件,使链接器把代码分配到内部SRAM空间;
\(\color{red}{SRAM.sct}\)
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
LR_IROM1 0x20000000 0x00009000 { ; load region size_region
ER_IROM1 0x20000000 0x00009000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
.ANY (+XO)
}
RW_IRAM1 0x20009000 0x00003000 { ; RW data
.ANY (+RW +ZI)
}
}
设置SRAM的起始地址0x20000000为虚拟ROM的起始地址,然后根据芯片的SRAM大小对其空间进行分配:因为F103RCT6的SRAM为48KB,即0xC000,笔者此次实验将其按3:1分配,即IROM1(虚拟ROM)和IRAM1各自为36KB和12KB,即0x9000和0x3000。
4. 根据使用情况选择是否需要使用仿真器命令脚本文件*.ini;F1系列需要配置
\(\color{red}{Debug\_RAM.ini}\)
/***********************************************************/
/* Debug_RAM.ini: Initialization File for Debugging from Internal RAM */
/******************************************************/
/* This file is part of the uVision/ARM development tools. */
/* Copyright (c) 2005-2014 Keil Software. All rights reserved. */
/* This software may only be used under the terms of a valid, current, */
/* end user licence from KEIL for a compatible version of KEIL software */
/*development tools. Nothing else gives you the right to use this software */
/***************************************************/
FUNC void Setup (void) {
SP = _RDWORD(0x20000000); // 设置栈指针SP,把0x20000000地址中的内容赋值到SP。
PC = _RDWORD(0x20000004); // 设置程序指针PC,把0x20000004地址中的内容赋值到PC。
_WDWORD(0xE000ED08, 0x20000000); // Setup Vector Table Offset Register
}
LOAD %L INCREMENTAL // 下载axf文件到RAM
Setup(); //调用上面定义的setup函数设置运行环境
//g, main //跳转到main函数,本示例调试时不需要从main函数执行,注释掉了,程序从启动代码开始执行
5. 修改仿真器和下载器的配置,使程序能通过下载器存储到内部SRAM;
6.配合Debug进行使用
对于F1系列,因为一些未知的原因,需要通过点击debug按钮来设置SP和PC指针的位置,所以需要进入调试,然后点击全速运行。
注意
- 断点可以提前打好,运行中途打断点可能出现失败的情况
- 切换回FLASH下载程序后,需要rebuild才能正确下载