分享

基于固件库的STM32F10x程序在Keil v5 MDK 下的RAM调试方法

 旭日东升4k165w 2019-09-07

为什么要RAM调试?

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

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

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

  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.分配RAMFlash空间:

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

     例如:如图3是流水灯程序编译后的keil输出,流水灯程序占Flash1352字节,占RAM268+24+1632,那么可以将STM32F103C820KRAM10kROM,剩下10k作为RAM

图3:流水灯程序Build Output

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

图4 :工程选项Options forTarget按钮

     修改工程选项的Target标签的IROMIRAM如图5。设置IROMStart=0x20000000Size=0x28000x2800=10k);IRAMStart=0x20002800Size=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 Symbolsdefine中添加定义: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该文件路径可能不同。该文件可手动创建,容如下:

  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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多