IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 【MDK】- STM32内部 SRAM 调试详细配置 -> 正文阅读

[嵌入式]【MDK】- STM32内部 SRAM 调试详细配置

STM32 Keil 内部 SRAM 中在线调试配置

七步配置就可以实现在内部SRAM中调试代码。

一、创建工程的调试版本

SRAM 中运行的代码只是用于调试,调试完毕后,实际仍然使用在内部 FLASH 中运行的代码,因此在调试版和发布版代码之间切换。

MDK的“Manage Project Items”可实现这样的功能,使用它可管理多个不同配置的工程,使用Manage_Project_Items 添加一个工程配置 ,点“Manage Project Items”按钮,在弹出对话框左侧的“Project Target”一栏包含了原工程的名字。

为了便于调试,我们在左侧的“Project Target”一栏添加一个工程名,如图中输入“SRAM_ 调试”,输入后点击 OK 即可,这个“SRAM_ 调试”版本的工程会复制原工程的配置。在下面我们将切换到“SRAM_ 调试”版本的工程,配置出一个代码会被存储到 SRAM的多彩流水灯工程。

在这里插入图片描述
当需要切换工程版本时,点击 MDK 工程名的下拉菜单可选择目标工程,在不同的工程中,所有配置都是独立的,例如芯片型号、下载配置等等

但如果两个工程共用了同一个文件,对该文件的修改会同时影响两个工程,如果两个工程都使用同一个 main 文件,我们在 main 文件修改代码,两个工程都会被修改。

在这里插入图片描述

二、 配置分散加载文件

本工程的分散加载使用手动编辑的 sct 文件配置,不使用 MDK 的对话框选项配置,在“Options for Target->linker”的选项见图使用新建的 SRAM_ 调试 sct 文件。
在这里插入图片描述
为了防止原flash工程的分散加载文件被影响,我们在工程的 Output 路径下新建了一个名为“SRAM
调试.sct”的文件,并在上图中把它配置为“SRAM_ 调试”工程专用的分散加载文件,分散加载文件的使用,请参考: keil STM32中sct 分散加载文件学习.

; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x20000000 0x00010000  {    ; load region size_region
  ER_IROM1 0x20000000 0x00010000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x20010000 0x00010000  {  ; RW data
   .ANY (+RW +ZI)
  }
  RW_IRAM2 0x10000000 0x00010000  {
   .ANY (+RW +ZI)
  }
}

在这里插入图片描述
这里我使用的是STM32F407VET6 内部SRAM为128KB

在分散加载文件配置中,把原本分配到内部 FLASH 空间的加载域和执行域改到了以地址0x20000000 开始的 64KB(0x00010000) 空间,而 RW data 空间改到了以地址 0x20010000 开始的64KB 空间 (0x00010000)。

也就是说,它把 STM32 的内部 SRAM 分成了虚拟 ROM 区域以及 RW
data 数据区域,链接器会根据它的配置给工程中的各种内容分配到 SRAM 地址。在具体的应用中,虚拟 ROM 及 RW 区域的大小可根据自己的程序定制,配置完毕编译工程后可在 map 文件中查看具体的空间地址分配。

三、配置中断向量表

startup_stm32f40xx.s 文件中的启动代码不是指定到绝对地址的,经过它由链接器决定应存储到内部 FLASH 还是 SRAM,所以 SRAM 版本工程中的启动文件不需要作任何修改。

重点在于启动文件定义的中断向量表被存储到内部 FLASH 和内部 SRAM 时,这两种情况对内核的影响是不同的,内核会根据它的“向量表偏移寄存器 VTOR”配置来获取向量表,即中断服务函数的入口。

VTOR 寄存器是由启动文件中 Reset_Handle 中调用的库函数 SystemInit 配置的,根据是否存储宏定义 VECT_TAB_SRAM 来决定 VTOR 的配置,默认情况下代码中没有定义宏 VECT_TAB_SRAM,所以 VTOR 默认情况下指示向量表是存储在内部 FLASH 空间的。

由于本工程的分散加载文件配置,在启动文件中定义的中断向量表会被分配到 SRAM 空间,所以我们要定义这个宏,使得 SystemInit 函数修改 VTOR 寄存器,向内核指示向量表被存储到内部SRAM 空间

编译选项中加入宏 ** VECT_TAB_SRAM** ,在“Options for Target-> c/c+±>Define”框中输入宏 ** VECT_TAB_SRAM ** ,注意它与其它宏之间要使用英文逗号分隔开。配置完成后重新编译工程,即可生成存储到 SRAM 空间地址的代码指令。

在这里插入图片描述

四、修改 FLASH 下载配置

得到 SRAM 版本的代码指令后,为了把它下载到芯片的 SRAM 中,还需要修改下载器的配置 ,修改“Options forTarget->Utilities->Settings”中选项。

在这里插入图片描述

这个配置对话框原本是用于设置芯片内部 FLASH 信息的,正常我们点击 MDK 的下载(LOAD)或(调试)按钮时,它会从此处加载配置然后下载程序到 FLASH 中而在上图中我们把它的配置修改成下载到内部 SRAM 了,各个配置的解释如下:

? “Download Function”中的擦除选项配置为“Do not Erase”。
这是因为数据写入到内部SRAM 中不需要像 FLASH 那样先擦除后写入。在本工程中,如果我们不选择“Do not Erase”的话,会因为擦除过程导致下载出错。

?“RAM for Algorithm”一栏是指“编程算法” (Programming Algorithm) 可使用的 RAM 空间, SRAM调试时RAM 空间是从地址 0x20000000 开始的0x20010000

下载程序到 FLASH 时运行的编程算法需要使用 RAM 空间,在默认配置中它的首地址为0x20000000,即内部 SRAM 的首地址,但由于我们的分散加载文件配置, 0x20000000 地址开始的 64KB 实际为虚拟 ROM 空间,实际的 RAM 空间是从地址 0x20010000 开始的,所以这里把算法 RAM 首地址更改为本工程中实际作为 RAM 使用的地址。
若编程算法使用的 RAM 地址与虚拟 ROM 空间地址重合的话,会导致下载出错。

?“Programming Algorithm”一栏中是设置内部 FLASH 的编程算法,编程算法主要描述了FLASH 的地址、大小以及扇区等信息,SRAM调试时RAM 空间是从地址 0x20000000 开始的

MDK 根据这些信息把程序下载到芯片的 FLASH中,不同的控制器芯片一般会有不同的编程算法。由于 MDK 没有内置 SRAM 的编程算法,所以我们直接在原来的基础上修改它的基地址和空间大小,把它改成虚拟 ROM 的空间信息。
这里的配置是跟我们的分散加载文件的实际 RAM 空间和虚拟 ROM 空间信息是一致的。

五、仿真器配置

上面的下载配置使得程序能够加载到 SRAM 中全速运行,但作为 SRAM 版本的程序,其功能更着重于调试,也就是说我们希望它能支持平时使用按钮 (调试、 debug) 时进行的硬件在线调试、单步运行等功能。要实现调试功能,还要在“Options for Target->Debug->Settings”中进行配置,见图设置仿真前检查代码并下载程序到 FLASH 中 。
在这里插入图片描述
在图中我们需要勾选“Verify Code Download”及“Download to FLASH”选项,也就是说点击调试按钮后,本工程的程序会被下载到内部 SRAM 中,只有勾选了这两个选项才能正常仿真。 (至于为什么 FLASH 版本的程序不需要勾选,不太清楚)。

经过这样的配置后,硬件仿真时与平时内部 FLASH 版本的程序无异,支持软件复位、单步运行、全速运行以及查看各种变量值等。

六、BOOT启动设置

在SRAM调试的时候,需要将MUC的boot模式设置成RAM启动,这里有两种设置方法,一种是软件强制设置SP 指针 (即 MSP) 和 PC 指针。第二是用物理跳线设置从RAM启动,这里选择一种即可。
软件配置比较复杂,但是一次配置就可以一直使用而不用来回切换boot引脚设置,以后使用比较方便。

6-1 软件BOOT设置

在“Options for Target->Debug”对话框中取消勾选“Load Application at startup”选项。点击“Initialization File”文本框右侧的文件浏览按钮,在弹出的对话框中新建一个名为“Debug_RAM.ini”的文件;
在这里插入图片描述在 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。
 XPSR = 0x01000000; // 设置状态寄存器指针 xPSR
 _WDWORD(0xE000ED08, 0x20000000); // Setup Vector Table Offset Register
 }

 LOAD %L INCREMENTAL // 下载 axf 文件到 RAM
 Setup(); //调用上面定义的 setup 函数设置运行环境

 //g, main //跳转到 main 函数,本示例调试时不需要从 main 函数执行,注释掉了,程序从启动代码开始执行

上述配置过程是控制 MDK 执行仿真器的脚本文件 Debug_RAM.ini,而该脚本文件在下载了程序到 SRAM 后,初始化了 SP 指针 (即 MSP) 和 PC 指针分别指向了 0x20000000 和 0x20000004,这样的操作等效于从 SRAM 复位。

有了这样的配置,即使 BOOT0 和 BOOT1 引脚不设置为 SRAM 启动也能正常仿真了

上述 Debug_RAM.ini 文件是从 STM32F4 的 MDK 芯片包里复制过来的,若您感兴趣可到 MDK安装目录搜索该文件名,该文件的语法可以从 MDK 的帮助手册的“μVision User’ s Guide->Debug Commands”章节学习。

6-1 硬件BOOT设置

SRAM 调试相关的硬件配置。在 SRAM 上调试程序,需要修改 STM32 芯片的启动方式,
在这里插入图片描述
使用跳线帽设置它们的电平从而控制芯片的启动方式,它支持从内部 FLASH 启动、系统存储器启动以及内部 SRAM 启动方式。
本实验在 SRAM 中调试代码,因此把 BOOT0 和 BOOT1 引脚都使用跳线帽连接到 3.3V,使芯片从 SRAM 中启动。

七、下载调试

配置完成后点击 MDK 的debug按钮,程序会被下载到 STM32的内部 SRAM 中。这时候需要点击全速运行,程序运行。

如果想要程序复位的话,需要退出debug,然后重新点击debug按钮。SRAM调试中软件复位和物理复位都不可以使用,只能是重新debug复位后程序会复位 。

此外芯片掉电后这个存储在 SRAM 的程序会丢失,想恢复的话必须要重新下载程序。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-05-08 08:17:54  更:2022-05-08 08:18:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 2:20:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码