无网不进  
软硬件开发

为什么要RAM调试?

  1. 相比于FLASH调试,在RAM调试可以很快地装载代码,可以节省将代码下载到Flash的时间。

  2. RAM的擦写次数几乎无限,RAM调试可延长Flash的使用寿命。图1

 

一、准备(这里以STM32F103C8的LED流水灯程序为例)

  1. Keil mdk514

  2. Template模板工程 LED流水灯,V3.5.0版本的固件库

  3. 示例芯片型号:STM32F103C8,芯片的BOOT引脚必须接地

 二、修改工程:打开Keil mdk工程,修改以下设置

   1.添加一个Project target:

   如图1左Project视图中右键Template_Flash选择Manage Project Items…出现工程文件管理界面。

 

                       

图1 :左为project视图,右为工程项管理界面 

   在弹出的工程文件管理界面作图1右图所示的设置:(1)单击添加按钮;(2)输入Target名称,如Template_RAM;(3)单击Set as Current Target按钮,然后按ok保存。

   这样做的好处是:可以使用下载按钮旁边的下拉列表切换用于Flash下载的配置和进行RAM调试的配置,如图2。

 

图2 :编译目标选择下拉框

   2.分配RAM和Flash空间:

     由《STM32数据手册》得知,STM32F103C8的RAM大小为20K,根据自己索要调试的代码分配者20K的空间;

     例如:如图3是流水灯程序编译后的keil输出,流水灯程序占Flash:1352字节,占RAM:268+24+1632,那么可以将STM32F103C8的20K的RAM分10k给ROM,剩下10k作为RAM。

图3:流水灯程序Build Output

    单击keil工具栏中的魔术棒按钮如图4(Options for Target…)弹出工程选项窗口:

图4 :工程选项Options forTarget按钮

     修改工程选项的Target标签的IROM和IRAM如图5。设置IROM的Start=0x20000000,Size=0x2800(0x2800=10k);IRAM的Start=0x20002800,Size=0x2800。

图5 :工程选项-Target标签设置

 

    为何这样设置?

    答:下图来自《Cortex-M3权威指南(中文)》84页,据图5.1知Cortex-M3内核MCU内部RAM起始地址为0x20000000,因为STM32F103C8的内部RAM=20K,因此地址范围是:0x20000000~0x20005000。这样上述设置将10k分给的代码区(IROM),将10k分给了数据区(IRAM)。

  3.修改中间文件和链接文件保存路径:(文件路径跟别的Target不同即可)

     如图6,打开选项的Output标签,将objects文件的保存路径改为工程目录/OBJ/RAM目录下;同理,选项的Listing标签中,将lst文件的保存路径改为工程目录/LIST/RAM目录下;

图6:工程选项-Output标签设置

     目的是:避免二、1步中所示的不同配置的Target产生的中间文件和链接文件混淆。

   4.添加宏定义:

    在选项的C/C++标签的Preprocessor Symbols的define中添加定义:VECT_TAB_SRAM,若有别的定义,则用英文逗号隔开。

图7:工程选项-C/C++标签设置

   5.清除flash编程算法以及添加初始化文件:

  (1)在选项的BEBUG标签中选择右侧的仿真器如Jlink,图8左;

图8 :左 工程选项-Debug标签 ;右 单击左图Setting弹出的仿真器设置界面

     然后单击右边的Settings按钮:弹出如图8右图所示设置页,选择Flash download标签,设置如下:直到将Programming Algorithm中的内容清空。选项的Utilities标签也有一个Setting按钮,里面的设置同理。

  (2)在选项的BEBUG标签中选择右侧的仿真器选择下方有一个Initialization File,添加Dbg_RAM.ini文件;

    说明Dbg_RAM.ini文件来自Keil安装目录\ARM\Pack\Keil\STM32F1xx_DFP\1.1.0\Boards\Keil\MCBSTM32C\Blinky\Dbg_RAM.ini,将其复制到工程目录的USER子目录下;不同版本Keil该文件路径可能不同。该文件可手动创建,内容如下:

 

[cpp] view plain copy
 
  1. FUNC void Setup (void) {  
  2.   SP = _RDWORD(0x20000000);          // Setup Stack Pointer  
  3.   PC = _RDWORD(0x20000004);          // Setup Program Counter  
  4.   _WDWORD(0xE000ED08, 0x20000000);   // Setup Vector Table Offset Register  
  5. }  
  6. FUNC void OnResetExec (void)  {      // executes upon software RESET  
  7.   Setup();                           // Setup for Running  
  8. }  
  9. load %L incremental  
  10. Setup();                             // Setup for Running  
  11. g, main  

 

 

 

 

   6.最后的设置:选项的Utilities标签的 Update Target Before DeBugging项不能选中!

图9:工程选项-Utilities标签

   上述设置完成后,注意单击ok保存设置。

 

三、enjoy程序调试:

    重新编译项目文件,单击keil工具栏中的Bebug按钮就可以在RAM中调试程序。

 注意:

         1.RAM调试Target不能用于下载,因此不能单击下载按钮;

       2.调试过程中复位后必须退出Debug再重新进入Debug。原因是复位后程序回到了芯片flash的起始地址而非RAM起始地址。

      3.若进入debug程序立即运行,可先在main函数或需要的地方加好断点,或者取消图8工程选项-Debug标签所示的Run to main().选项  为什么是取消勾选??不得而知。

RAM调试工程模板下载:

http://download.csdn.net/detail/weboo10000/9085393

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
 
版权声明:本文为博主原创文章,未经博主允许不得转载。
posted on 2017-12-12 21:24  无网不进  阅读(1363)  评论(0)    收藏  举报