0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32内部RAM在线调试配置方法及详细说明 (基于Keil开发工具)

黄工的嵌入式技术圈 来源:黄工的嵌入式技术圈 2020-03-24 14:01 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Ⅰ、写在前面

本文主要讲述的内容:基于Keil开发工具下,STM32内部RAM在线调试配置方法,以及每一项配置的详细说明。如需要了解更多相关的文章,可以到我博客,或微信公众号查看。

让程序运行在RAM中调试代码有两优点:1.速度快;2.减少对芯片FLASH读写次数,增加芯片寿命。

本文牵涉的知识比较多,如果弄明白所有细节问题,对自己这方面的技能是一种很大的提升。

本文基于ST公司Cortex-M内核的STM32来讲述其配置方法,其实也适用于其他公司(如:TINXP等)的Cortex-M芯片,原理都是一样的。

本文PDF文章可以在我360云盘下载:

https://yunpan.cn/ckvUU7t8vuWbn访问密码 42b3

关于本文的更多详情请往下看。

Ⅱ、本文要点

1.主要内容

由于本文牵涉的内容比较多,我会按章节来讲述各项内容,大体分为:

l实现STM32内部RAM调试的配置方法

l每条配置的详细说明

l网上配置方法说明及存在的不足

2.工程代码下载

为了方便大家学习,我将配置前(一般常用)工程和配置后工程分别打包上传至360云盘供大家下载参考学习。配置前和配置后工程实现的功能都是一样的。

配置前工程代码STM32F10x_Demo:

https://yunpan.cn/ckvVFJi5e9r26访问密码 8ffb

配置后工程代码STM32F10x_Demo(RAM调试):

https://yunpan.cn/ckvVYAMWBqNjX访问密码 418b

3.代码功能描述

上面提供下载的代码实现的功能是一样的,具体如下两点:

l间隔500ms LED亮灭变化一次,串口打印数据“Demo..”一次。

l串口中断接收数据,会将收到数据通过串口发送出去。

第一点是为了有一个状态显示,知道程序在运行。

第二点在本文中的作用也很大,就是使用了中断功能。由于RAM调试会牵涉到向量表,中断功能就会使用到向量表,如果没有配置正确,这里就不会响应中断,或者出错。

4.验证配置成功方法

本文提供的“STM32F10x_Demo”是断电后重新上电会继续运行代码;而“STM32F10x_Demo(RAM调试)”是断点之后程序丢掉了,也就是不能运行了【请更加LED及串口打印现象来判断】。

注意:使用RAM调试之前请将FLASH里面的数据擦除掉,否则使用RAM调试断电再上电,程序会从FLASH运行,会认为程序依然在运行,从而影响判断。

Ⅲ、RAM调试配置方法

本节主要讲述配置方法的过程,为什么这么配置,以及配置的原理将会在下一章节讲述。

1.修改内存地址

打开目标配置:Project -> Options for Target -> Target 或“工程目标配置”点击快捷按钮。

ROM和RAM地址映射到如下图地址。 我们使用STM32F103ZE芯片,该芯片的RAM大小为0x10000 即64KB,我们这里平分RAM,即各自的大小为0x5000。

注意:配置的地址范围不能超过芯片实际的大小。

2.配置向量表

同上,打开目标配置:Project -> Options for Target -> C/C++,使用宏定义VECT_TAB_SRAM。如下图:


这里的宏定义是为了让向量表指向RAM(我们默认是指向ROM),重要的一个目的就是让中断向量表指向RAM,上面“代码功能”中断的意义就是为了验证向量表的正确性。

注意:这里的宏定义是在工具链中配置的,多个宏定义之间需要有“逗号”隔离开来。

其实这里的宏定义配置也可以在源代码中实现,打开system_stm32f10x.c文件下第127行的“VECT_TAB_SRAM”宏定义,如下图:

【个人建议:调试和非调试代码最好一致,也就是源代码不变】

3.调试配置

同上:Project -> Options for Target -> Debug,这里是关于调试的配置。

第一步:去掉“Load Application at Startup”前面的勾选项

第二步:导入RAM初始化文件。


RAM初始化文件里面内容如下:

FUNC void Setup (void) {

SP = _RDWORD(0x20000000);

PC = _RDWORD(0x20000004);

_WDWORD(0xE000ED08, 0x20000000);

}

LOADObjects\ExecutableFile.axfINCREMENTAL

Setup();

g, main

每一条语句具体意思请见源代码注释,这里提示的是Objects\ExecutableFile.axf

也就是输出路径和输出文件名,它的路径与文件名与你工程配置需对应。

4.调试不更新目标程序

同上:Project -> Options for Target -> Utilities,不勾选“更新”。意思就是在线调试时,不更新芯片(下载FLASH)程序。

至此,STM32内部RAM在线调试配置方法就完成了,连接开发板就可以使用RAM在线调试代码了。

网上相关的问题还有其他无关的配置,我会在下面单独说明一下为什么不用配置那些。

Ⅳ、配置说明

上面配置过程已经知道了,这一节讲述一下为什么这样配置,以及这么配置的意思。

1.修改内存地址说明


内存地址为什么ROM设置为0x20000000,RAM设置为0x20005000。原因在于芯片的RAM其实地址就是0x20000000(没有猜错的话Cortex-M那芯片RAM起止地址都是0x20000000)。

至于大小嘛,就是看芯片型号了,我们这里平分大小,也可以不用平分大小。

这里分配的地址会直接影响输出的文件“ExecutableFile.sct”,也就是我们链接的时候需要使用到的“ExecutableFile.sct”文件。

查看“ExecutableFile.sct”文件的方法:Project -> Options for Target -> Linker,如下图。【需要编译之后才能输出“ExecutableFile.sct”文件,即编译后才能查看】

对比没有配置RAM调试(也就是没有修改地址)的工程如下图:

网上配置教程说要修改Linker下的地址,其实是多余的,详情请见下一章节。

2.配置向量表说明

爱思考(或者会寻到问题)的朋友可能会发现,我不宏定义VECT_TAB_SRAM这个参数,程序照常可以运行(LED变化、串口打印数据)。

其实这里的配置主要是针对“向量表”,比如中断向量表。如果当我们不宏定义VECT_TAB_SRAM这个参数,测试串口中断的时候,程序就会跑死,(暂停)程序会指向一个非法的地址,如下图:

3.调试配置说明


这个地方的配置很好理解,就是我们要将程序指针指向我们特定的地址(RAM)区域,这样好让程序执行我们指定地址里面的程序。

我们加载文件“CpuRAM.ini”,因此不需要勾选“Load Application at Startup”这个选项。

加载文件的名称“CpuRAM.ini”和网上一些教程命名一样,可以自己命名,只要后缀名一样就行。

4.调试不更新目标程序说明


这个地方其实就是在调试的时候更新(下载)芯片FLASH的代码,由于我们没有修改FLASH的烧写算法,这里就不勾选次选项。

当我们修改了FLASH的烧写算法(程序指向RAM),这里可以勾选上。

相比两者,我们选择不勾选该选项简单一点,因此这里选择不勾选。

Ⅴ、网上配置说明

笔者开始学习RAM调试的内容时,也是参考网上很多的教程,但是经过笔者亲自,并且多次测试发现网上的有些教程存在不足之处。本节主要是提出网上某些教程存在的不足或者多余之处。【若有不对之处敬请谅解】

1.修改Linker地址

Project -> Optionsfor Target -> Linker


网上的配置,这里的地址基本上都是修改了的。

1.去掉勾选; 2.再次修改地址。

我刚开始学习配置时也是修改了的,但后面我再次配置时发现一个问题:地址前面为勾选。什么意思呢,就是没有使用这个配置的地址。

于是我就不配置(不修改)这里的地址进行验证,结果还是可以在RAM中调试,大量测试也没发现什么问题。

我再次查看Scatter File文件ExecutableFile.sct,发现不修改地址也是一样的。其实“ExecutableFile.sct”文件的地址是我上一章节里面说的,由Target里面的地址决定的。

因此,网上所配置的这里其实是多余的配置。

2.配置向量表

有很多教程使用了在main函数开始配置向量表,也就是在main函数开始出增加一条语句:NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);

这条语句其实是system_stm32f10x.c文件里面第265行的:SCB -> VTOR = SRAM_BASE | VECT_TAB_OFFSET;一样的意思。

因此,我个人觉得,项目中的调试代码和真正运行的源代码不能有差异。定义了VECT_TAB_SRAM这个宏定义,就没必要还在main函数里面增加一条语句。

细心的朋友可能会发现,我在“Ⅲ、RAM调试配置方法”这一章节中没有修改源代码,只是修改了配置。这样就保证了代码的一致性。

3.修改编程地址

网上有很多教程是修改了下图中编程的地址,也就是修改了编程算法。

作为调试,本来就是运行在RAM中,再在这里配置,我觉得是多次一举。因此我们上面讲述的是没有勾选:Update Target Before Debugging.

Ⅵ、说明

STM32内部RAM调试代码时,复位不起作用,需要复位请重新链接运行。关于RAM在线调试配置还有许多未讲述完,请亲自配置并测试验证,你或许会明白更多有用知识。

以上总结仅供参考,若有不对之处,敬请谅解。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • RAM
    RAM
    +关注

    关注

    8

    文章

    1398

    浏览量

    119822
  • STM32
    +关注

    关注

    2305

    文章

    11120

    浏览量

    371134
  • keil
    +关注

    关注

    69

    文章

    1224

    浏览量

    171807
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    华大电子支持的主流开发工具有哪些

    华大电子支持的主流开发工具
    的头像 发表于 09-28 10:43 316次阅读
    华大电子支持的主流<b class='flag-5'>开发工具</b>有哪些

    三种开发工具的功能和优势

    您喜欢捣鼓电子设备并自己动手制作项目吗?如果是,您可能会对Raspberry Pi、Arduino、ROCK及其他能帮助实现DIY目标的开发工具感兴趣。Raspberry Pi在全球已售出约3000万台,这一令人瞩目的成绩说明这类开发工
    的头像 发表于 09-25 16:45 682次阅读

    硬件调试:JLink 驱动配置调试技巧

    摘要: 本文深入探讨了 JLink 调试器在嵌入式系统硬件调试中的应用,详细阐述了 JLink 驱动配置方法以及硬件
    的头像 发表于 06-12 23:20 1267次阅读
    硬件<b class='flag-5'>调试</b>:JLink 驱动<b class='flag-5'>配置</b>与<b class='flag-5'>调试</b>技巧

    STM32H745XIH6不能进行双核调试,CM4不能进行在线调试怎么解决?

    你好, 问题: STM32H745XIH6不能进行双核调试,CM4不能进行在线调试软件:KEIL 5.41
    发表于 06-09 06:58

    【RA4L1-SENSOR】开箱+Keil环境搭建+点灯

    E2 Studio、Keil、IAR 等开发工具 这里使用 Keil 开发 需要安装瑞萨 RASC (RA Smart Configurator)软件进行
    发表于 06-08 11:06

    【RA-Eco-RA4M2开发板评测】开箱+Keil环境搭建+点灯

    、蓝色LED灯x3、 【开发工具和环境】 支持 Keil、E2 Studio 开发工具 使用 Keil 开发, 建议安装瑞萨 RASC (R
    发表于 05-05 09:37

    调试变频器详细说明

    调试变频器是一个复杂但至关重要的过程,它涉及多个参数的设定和调整,以确保变频器能够正常运行并满足特定应用需求。以下是对变频器调试详细说明。 一、准备工作 1. 选择合适的电机功率:根据实际需求选择
    的头像 发表于 04-25 15:32 1449次阅读

    rk3568开发工具

    rk3568开发工具
    发表于 04-16 17:03 7次下载

    AI开发工具分类与功能

    当下,AI开发工具不仅简化了AI开发的复杂流程,还提高了开发效率,推动了AI技术的广泛应用。下面,AI部落小编为大家介绍AI开发工具的分类及其功能。
    的头像 发表于 04-12 10:12 1042次阅读

    鸿蒙北向开发OpenHarmony5.0 DevEco Studio开发工具安装与配置

    本文介绍OpenHarmony5.0 DevEco Studio开发工具安装与配置,鸿蒙北向开发入门必备!由触觉智能Purple Pi OH鸿蒙开发板演示。搭载了瑞芯微RK3566四核
    的头像 发表于 03-28 18:05 1335次阅读
    鸿蒙北向<b class='flag-5'>开发</b>OpenHarmony5.0 DevEco Studio<b class='flag-5'>开发工具</b>安装与<b class='flag-5'>配置</b>

    e²studio和Keil简介及如何安装e²studio开发环境

    (简称为e2或e2s)是瑞萨电子的一款包含代码开发、构建和调试开发工具。e²studio基于开源EclipseIDE和与之相关的C/C++开发工具(CDT)。e²studio托管了瑞
    的头像 发表于 03-13 17:27 2252次阅读
    e²studio和<b class='flag-5'>Keil</b>简介及如何安装e²studio<b class='flag-5'>开发</b>环境

    STM32CubeIDE在线调试时,如何配置擦除Flash的部分Page?

    STM32CubeIDE在线调试时,如何配置擦除Flash的部分Page
    发表于 03-13 08:02

    鸿蒙北向开发OpenHarmony4.1 DevEco Studio开发工具安装与配置

    OpenHarmony4.1 DevEco Studio开发工具安装与配置,鸿蒙北向开发入门必备!
    的头像 发表于 02-07 17:35 1338次阅读
    鸿蒙北向<b class='flag-5'>开发</b>OpenHarmony4.1 DevEco Studio<b class='flag-5'>开发工具</b>安装与<b class='flag-5'>配置</b>

    盘点工程师常用的嵌入式开发工具

    嵌入式开发涉及硬件与软件的紧密结合,开发工具的选择对效率和质量至关重要。以下是嵌入式开发中常用的工具分类及代表性工具,涵盖
    的头像 发表于 02-07 10:06 3741次阅读

    嵌入式工程师常用的开发工具有哪些?

    。 一、集成开发环境(IDE) IDE是嵌入式开发的核心工具之一。例如 Keil MDK,它支持多种微控制器架构,提供了强大的代码编辑、编译、
    发表于 12-20 15:29