zoukankan      html  css  js  c++  java
  • [STM32F4xx 学习] 如何在RAM中调试程序

    在RAM中调试程序指的是将程序下载到RAM里面(而不是Flash里面),然后在RAM中执行程序、调试。

    为什么要在RAM中调试程序?总结起来有以下两点原因:

    1. Flash 擦写次数有限,STM32F4xx的Flash擦写次数只有上万次,见图1 Flash规格描述

    图1. STM32F4xx Flash 寿命与保存时间

    2. 程序下载到RAM里面要比下载到Flash里面快很多,在需要反复调试的时候,能省下不少时间(像调试GUI的时候)。

    当然,在RAM调试也有一些不足的,比如:

    1. 需要占用部分RAM用来存放程序

    2. 不能使用软件复位功能,即每次运行程序前都要重新下载程序

    3. 程序在RAM中调试成功,在Flash中不保证100%成功

    4. 断电后程序会丢失

     

    设置过程如下:

    Step 1. 在uVision 中新建一种配置,命名为“RAM”

     

    Step 1. 新建配置

    Step 2. 选中新建的“RAM” 配置,配置新建的"RAM"配置

    Step 2. 配置“RAM”

    Step 3. 根据STM32F4xx RAM地址范围,在Target中配置代码段地址(IROM),数据段地址(IRAM)

    Step 3. 配置地址范围

    STM32F4xx的RAM大小为192KB(112+16+64):

    • 112KB和16KB的起始地址为0x2000 0000,通过AHB总线访问
    • 64KB的起始地址为0x1000 0000,只能通过CPU直接访问,关于这64KB RAM有何用途,请参考以下博文:

    http://blog.sina.com.cn/s/blog_61332ec601016hj6.html

     

     

    图2. STM32F4xx RAM 地址映射

     

    Step 4. 在Linker中确保使用的是Target中设置的映射方式

    Step 4. 地址映射选择

     

    Step 5. 添加初始化文件(如果没有,复制以下代码到文本编辑器中,保存为.ini,并保存到工程所在目录中)

     1 FUNC void Setup (void) {
     2   SP = _RDWORD(0x20000000);          // 堆栈指针
     3   PC = _RDWORD(0x20000004);          // PC
     4   _WDWORD(0xE000ED08, 0x20000000);   // 中断向量偏移地址
     5 }
     6 
     7 LOAD %L INCREMENTAL                  // 载入axf文件 
     8 
     9 Setup();                             // 调用Setup();
    10 
    11 g, main                              //跳转到main

    清单1. 初始化代码

    Step 5. 添加初始化文件

     

    Step 6. 仿真器下载地址的配置

     

    Step 6. 仿真器下载地址配置

    方框②中的起始地址和大小就是Step 3中配置的代码存放范围(IROM),方框③中的起始地址和Step 3中的数据存放地址(IRAM)的起始地址相同,大小默认为0x0800。最后把方框④选上,这样每次进入仿真状态前,都会重新下载代码到RAM里面。

     

    现在重新编译源文件,编译完成后,打开.map文件,是不是发现ROM和RAM已从新分配了?现在,享受Debug带来的乐趣吧!

     

     

    More~

    1. STM32F4xx Datasheet中描述,若要从RAM中启动,Boot0, Boot1引脚必须置高电平,如图3所示。实际测试,不管Boot0, Boot1为何值,都能从RAM中启动代     码。

    图3. 启动模式选择

    2. 若需要使用中断,也要将NVIC中断向量表重新映射到RAM里面。具体操作是在system_stm32f4xx.c源文件中,去掉#define VECT_TAB_SRAM前面的注释,如

        图4所示

    图4. 

     

    /×××××××××××××××××××××××××××××××××××××××× THE END××××××××××××××××××××××××××××××××××××××××××××/

  • 相关阅读:
    CentOS7 linux下yum安装redis以及使用
    nssm 在windows上部署服务
    netcore 2.2 封装 AutoMapper
    git pull/push免密输入
    缓存常见问题
    批量维护关系数据
    测试跨域html
    ODBC配置
    spring boot监控之prometheus配置
    REST Client
  • 原文地址:https://www.cnblogs.com/mr-bike/p/3518783.html
Copyright © 2011-2022 走看看