STM32内部RAM在线调试配置方法及详细说明(基于Keil开发工具)
推荐
分享一个大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来!http://www.captainbed.net/strongerhuang
我的网站:https://www.strongerhuang.com
我的知乎:https://www.zhihu.com/people/strongerHuang.com
Ⅰ、写在前面
本文主要讲述的内容:基于Keil开发工具下,STM32内部RAM在线调试配置方法,以及每一项配置的详细说明。如需要了解更多相关的文章,可以到我博客,或微信公众号查看。
让程序运行在RAM中调试代码有两优点:1.速度快;2.减少对芯片FLASH读写次数,增加芯片寿命。
本文牵涉的知识比较多,如果弄明白所有细节问题,对自己这方面的技能是一种很大的提升。
本文基于ST公司Cortex-M内核的STM32来讲述其配置方法,其实也适用于其他公司(如:TI、NXP等)的Cortex-M芯片,原理都是一样的。
本文内容已经整理成PDF文件,提供给大家下载:
http://pan.baidu.com/s/1dEHFwlF
更多关于STM32的文章,可以进入我博客查看:
http://blog.csdn.net/ybhuangfugui
关于本文的更多详情请往下看。
Ⅱ、本文要点
1.主要内容
由于本文牵涉的内容比较多,我会按章节来讲述各项内容,大体分为:
l 实现STM32内部RAM调试的配置方法
l 每条配置的详细说明
l 网上配置方法说明及存在的不足
2.工程代码下载
为了方便大家学习,我将配置前(一般常用)工程和配置后工程分别打包上传至百度网盘供大家下载参考学习。配置前和配置后工程实现的功能都是一样的。本文以STM32F1系列芯片为例(其他芯片类似)。
配置前工程代码STM32F10x_Demo:
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 Objects\ExecutableFile.axf INCREMENTAL
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 -> 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在线调试配置还有许多未讲述完,请亲自配置并测试验证,你或许会明白更多有用知识。
以上总结仅供参考,若有不对之处,敬请谅解。
Ⅶ、最后
我的网站:https://www.strongerhuang.com
我的微信公众号(ID:strongerHuang)还在分享STM8、STM32、Keil、IAR、FreeRTOS、UCOS、RT-Thread、CANOpen、Modbus…等更多精彩内容,如果想查看更多内容,可以关注我的微信公众号。
STM32内部RAM在线调试配置方法及详细说明(基于Keil开发工具)相关推荐
- mysql如何配置phpmyadmin_如何进行phpmyadmin配置 phpmyadmin快速配置方法【详细介绍】...
phpmyadmin 配置怎么配置?今天提一下如何配置PHPMyAdmin,因为在开发者,是比较普遍用到的.下面是PHPMyAdmin 快速配置方法. 虽然在本机开发.调试系统时或许并不会用到它,但对 ...
- AIR105 基于Keil开发点灯程序配置过程
AIR105 基于Keil开发点灯程序配置过程
- STM32系统时钟及配置方法
什么是时钟 单片机如果要正常运行,时钟信号是必不可少的.作为CPU的脉搏,时钟的快慢决定了CPU的运行速率,执行指令的速度.一般时钟源会被分频器或倍频器分成多种频率的时钟,以满足系统的不同应用. 那么 ...
- pythonqt5安装路径配置_PyQt5 安装与环境配置方法图解详细教程
PyQt5 是用来创建Python GUI应用程序的第三方工具包,它不仅与Python有着良好的兼容性,还可以通过可视化拖拽的方式进行窗体的创建,提高开发人员的工作效率,因此深受开发人员的喜爱.作为一 ...
- 【Groovy】Gradle 构建工具 ( 自动下载并配置构建环境 | 提供 API 扩展与开发工具集成 | 内置 Maven 和 Ivy 依赖管理 | 使用 Groovy 编写构建脚本 )
文章目录 一.Gradle 自动下载并配置构建环境 二.Gradle 提供 API 扩展与开发工具集成 三.Gradle 内置 Maven 和 Ivy 依赖管理 四.Gradle 使用 Groovy ...
- springboot日志配输出路径配置_Spring Boot 日志配置方法(超详细)
默认日志 Logback : 默认情况下,Spring Boot会用Logback来记录日志,并用INFO级别输出到控制台.在运行应用程序和其他例子时,你应该已经看到很多INFO级别的日志了. 从上图 ...
- mysql5.7.14启动教程_mysql5.7.14安装配置方法图文详细教程
mysql 5.7.14安装过程记录如下,希望对大家有帮助. 一.MySQL 5.7.14下载 下载链接:http://dev.mysql.com/downloads/installer/ 具体下载过 ...
- STM32内部CPU温度监测方法及计算。
STM32有一个内部温度监测传感器,它的使用一般情况下不解决什么问题,但是对于日常使用还是有一定的作用. 内部温度传感器通道号16 初始化及配置代码为: USARTSET usartset;/* Sy ...
- Linux网络深入DHCP、FTP原理和配置方法(详细图解)
Linux网络DHCP.FTP原理和配置 一.DHCP服务 1.了解DHCP服务 2.使用DHCP的好处 3.DHCP的分配方式 4.DHCP的租约过程 1.客户机请求IP地址 2.服务器响应 3.客 ...
- 华为计算机笔记本的配置,怎么看笔记本电脑配置 查询笔记本配置方法【详细步骤】...
众所周知,选购电脑除了看品牌之外,另外最重要的就是看电脑的配置,例如什么是CPU,哪种显卡.主板,内存多大,使用的什么类型的 显示器 等等.目前国外的HP.apple. 松下 等等一些 电脑 品牌的配 ...
最新文章
- CUDA硬件架构知识
- 为 GridView 添加一列单选按钮50
- 使用sphinx为python注释生成docAPI文档
- C语言 IP地址合法性判断 去除字符串首尾空格
- 【代码示例】 一个简单的Java死锁
- OpenCV为Halide后端安排网络
- Px4源码框架结构图
- .NET架构小技巧(4)——反射,架构人员法宝II
- 总结mysql的基础语法_mysql 基础sql语法总结 (二)DML
- 双亲委派机制_史上三次破坏ClassLoader双亲委派机制
- lamp 配置mysql_LAMP安装配置超详细讲解
- MySQL查询用户行为,网站用户行为分析
- openlayers2 开发如何判断一个marker所在的点是否在一个多边形内部
- 3dmax人物表情动画、骨骼动画、半透明材质导出FBX文件、导入unity的方法
- 百度文库免费下载含豆丁、道客巴巴等
- 硬盘转速和平均寻道时间
- 域名和IP地址的区别
- 手把手教你制作网页导航栏
- get(obj, “a.b[0].c“, 0)
- 【算法和数据结构】模拟和暴力
热门文章
- python制作雕刻软件_blender for Mac(免费动画制作软件)
- Mal-amido-PEG2-acid,756525-98-1末端羧酸可在活化剂(如EDC或HATU)存在下与伯胺基反应
- android脚本精灵开发,触动精灵脚本开发示例代码
- 突然觉得人类的进化是人类自主意愿…
- 分布式系统——MapReduce:Simplified Data Processing on Large Clusters论文
- 【深度学习】IMDB数据集上电影评论二分类
- PHP即充宝v3.0实例
- ROS2系列知识【5】:从海龟教程开始【1】
- Unity3D场景对象无法显示
- 软件更新(2005.06.04)