历史上的今天
返回首页

历史上的今天

今天是:2025年01月21日(星期二)

正在发生

2021年01月21日 | STM32内部RAM在线调试配置方法及详细说明

2021-01-21 来源:eefocus

http://pan.baidu.com/s/1dEHFwlF

 

更多关于STM32的文章,可以进入我博客查看:

http://blog.csdn.net/ybhuangfugui

 

 

http://pan.baidu.com/s/1gfx8J6b

 

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

http://pan.baidu.com/s/1cDXYQM

 

注意:由于许多网盘近年来受到影响都相继停止服务或关闭了,如果网盘链接失效,可以微信公众号查看更新链接,或微信联系作者。

 

 

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);

}

 

LOAD ObjectsExecutableFile.axf INCREMENTAL

Setup();

g, main

 

每一条语句具体意思请见源代码注释,这里提示的是ObjectsExecutableFile.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 -> Options for 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在线调试配置还有许多未讲述完,请亲自配置并测试验证,你或许会明白更多有用知识。

 

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


推荐阅读

史海拾趣

ARCOL公司的发展小趣事

品质是ARCOL公司的核心竞争力。公司始终坚持以质量为核心,建立了严格的质量管理体系。从原材料的采购到产品的出厂,每一个环节都经过严格把关,确保产品的质量和性能达到最高标准。同时,ARCOL还注重品牌建设,通过不断提升产品质量和服务水平,树立了良好的企业形象和口碑。

Belden Wire and Cable公司的发展小趣事

为了满足不断增长的市场需求,1928年,Belden在印第安纳州里士满开设了一家专为制造电线而设计的新工厂。这家工厂的建立极大地提升了公司的产能和效率,为公司的进一步发展提供了有力保障。在随后的几十年里,随着第二次世界大战的爆发和战后经济的复苏,里士满工厂经历了多次扩建和升级,逐渐成为百通最大的制造工厂之一。

Elektron公司的发展小趣事

随着环保意识的不断提高和可持续发展理念的普及,Elektron公司开始注重环保和可持续发展方面的工作。公司积极采用环保材料和节能技术,降低产品制造过程中的能耗和排放。同时,Elektron还加强了对废弃物的处理和回收工作,努力实现资源的循环利用和环境的可持续发展。这些措施不仅有助于公司降低成本和提高效率,也符合社会和消费者对环保和可持续发展的期望和要求。

以上五个故事分别从不同角度概述了Elektron公司的发展过程,包括创立与初期发展、技术创新与产品多样化、全球扩张与市场领导地位、技术突破与行业引领以及环保理念与可持续发展等方面。这些故事共同构成了Elektron公司丰富多彩的发展历程和辉煌成就。

高博(GBG)公司的发展小趣事

谷峰电子有限公司的故事始于1995年,当时公司在香港成立,标志着其半导体元器件研发与销售的起点。初期,面对激烈的市场竞争和技术挑战,谷峰团队凭借对半导体技术的深刻理解和对市场需求的敏锐洞察,逐步确立了以功率MOSFET为核心产品的战略方向。2000年,谷峰在深圳设立分公司,进一步扩大了其研发和销售网络,为公司的快速发展奠定了坚实基础。

Etco Inc公司的发展小趣事

在环保意识日益增强的今天,Etco Inc公司积极响应环保号召,将环保理念融入企业发展中。公司采用环保材料和生产工艺,减少了对环境的污染和破坏。同时,Etco还积极参与环保公益活动,推动行业的可持续发展。这些举措不仅提升了企业的社会形象,也为电子行业的绿色发展树立了榜样。

FCT Electronics公司的发展小趣事

近年来,智能制造成为电子行业的新趋势。FCT Electronics紧跟时代步伐,开始探索智能制造领域。公司引进了先进的自动化生产线和检测设备,提高了生产效率和产品质量。同时,FCT Electronics还积极开发智能测试系统,为客户提供更加便捷、高效的服务。这一转型不仅提升了公司的市场竞争力,也为未来的发展打开了新的空间。

上述五个故事,仅基于公开信息和电子行业的一般发展趋势构建,并非FCT Electronics公司的真实历史事件。如需了解FCT Electronics公司的真实发展情况,请查阅相关官方资料。

问答坊 | AI 解惑

【求助高手】Sdram“刷新”是否会中断读、写操作和预充电?

求高手赐教,不胜感激: sdram正在进行读操作的过程中,进行刷新操作,这样会不会使读操作中断(而导致读出的数据出现错误),刷新结束后,该读操作是否仍然继续执行? 写操作,预充电面临同样的问题? 刷新的优先级是不是最高! 谢谢各位! ...…

查看全部问答>

啤酒瓶电话机

如果你看到有人抱着酒瓶口若悬河地自言自语,千万不要认为这是个走火入魔的酒鬼,也许他只是在打电话。…

查看全部问答>

新奇创意 音响电子秤

我真的很佩服设计者的创意,竟能将iPod音箱和电子秤结合在一起。这样经常身处厨房的你就可以边做饭边听音乐了(看起来这个创意很雷)。…

查看全部问答>

OPA656高速运放

应用用于低压差的模拟放大中,也是我用于的光电仪表中一款芯片。我将不断把我的使用心得共享给大家…

查看全部问答>

求助!!8086汇编 8255芯片 8X8LED显示数字

行线高电平且列线低电平时控制灯亮 如何在逐行显示中使不同行的灯亮之间没有干扰啊 逐行显示 第二行的代码实现时是否会覆盖第一行的啊 也就是说如何在屏幕中实现多行同时显示 (使用8255控制8X8LED) 8086的汇编语言!!!! 能说明白的说一 ...…

查看全部问答>

关于在显示驱动中无法引用背光驱动函数的问题

具体情况如下,我在显示驱动代码实现中调用背光驱动,显示驱动代码中导入了背光驱动的H文件,后面具体调用过程省略。 #include \"VGAoutpch.h\" #include \"CH702X.h\" #include \"bsp_backlight.h\" //#pragma comment(lib,\"backlight.li ...…

查看全部问答>

[linux]如何实现两台蓝牙设备间的音频传输?

我手上有几片一模一样的linux操作系统的板子 带有蓝牙芯片,支持bluez 请问如何在两台之间实时pcm传输音频?(不是传输文件) 我在网络上找到的例子都是linux主机与蓝牙耳机之间的解决方案 所以所有的例子都没有给出接收方的代码或者脚本,而只 ...…

查看全部问答>

gprs步骤

   我做一个GPS采集数据,让GPRS来传输数据,用单片机来实现。    前几天我做好了GPS采集,并用无线传输模块实现了传输,但距离但短了,现在换GPRS来传输,就传输一些经纬数据而已。    我应该怎么来做呢?GPRS的 ...…

查看全部问答>

学习NIOS 2 的问题

 学习NIOS2 需要哪些方面的重要的基础?…

查看全部问答>

飞凌的ARM开发板怎样把开发的应用程序在开发板上运行?

想请教一下,怎么把在VS2005下开发的应用程序放到飞凌ARM开发板上运行,不是在电脑上同步调试!要转换成什么格式的文件啊?…

查看全部问答>