你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32工程模板建立之 RAM 目标(五)

[复制链接]
STMCU小助手 发布时间:2022-11-26 14:00
05
—
RAM 目标

6 m. f) r# U% c

我们都知道,FLASH 下载次数是有限制的,虽然对一个项目来说,一颗芯片的下载次数完全满足项目的开发要求,但有的开发板会进行很多项目的测试,比如我就有一个开发板,将所有的 I/O 引脚都引了出来,很多功能我都可以通过杜邦线连接来进行测试,相当方便。但也正因为如此,所以几年下来可能会在这个开发板上不知烧写多少次,很可能某一天就把 FLASH 给烧坏了,这样一来芯片就没法用了。你可能会说,不怕,我的焊工好,焊一个芯片分分钟的事情,但是你考虑焊盘的感受吗?焊盘经不起你多少次焊接就可能废了,而且也不是随时随地都有芯片和焊接工具给你焊接啊。所以最好的办法就是使用 RAM 下载功能。


& M3 T( C4 K! D7 g6 N

RAM 下载最大的好处就是下载次数无限,所以你可以尽情尝试各种可能,直到成功为止,根本不必考虑烧写次数问题,但是也有一些缺点。

% |7 k# Q" s: V- W. p' {" b( q( ^

我们知道 STM32 分为 FLASH 和 RAM 两部分空间,本来 RAM 专门用来存放数据的,FLASH 用来放代码和不变的数据,现在好了,所有的代码和数据都挤到了 RAM 中,而 RAM 的空间一般来说不是很大,所以一些大的项目就无法使用 RAM 的方法进行调试的,只能对一些小项目或者功能模块进行测试。而且原来分了两条总线对 FLASH 和 RAM 进行分别访问(哈佛结构),效率高,现在只能通过一条总线(应该是一条总线吧,也可能还是有两条总线同时访问)访问一个目标 RAM,效率可能下降。但这些缺点不是很明显,毕竟下载次数无限的诱惑力还是相当大的。所以有必要新增一个专门用来功能测试的目标,这样你就可以尽情的测试了!


3 s9 q+ v$ M& B* F+ X% c) Y8 M" _

和建立 FLASH 目标一样,不过不同的是现在以 FLASH 作为模板创建新的 RAM 目标,这是因为 FLASH 目标已经具有下载功能了。

, e% Q; _! _5 J9 T7 E) K5 b8 n

现在用图说明比较直观一点:


! V, O/ |/ Z3 C, b- Q3 }

微信图片_20221125150055.png


# H" u8 m$ a4 _; G2 A" M5 @  S

之前建立的所有的目标都是将代码下载到 FLASH 中(软件仿真时也是如此,只不过它没有将代码下载到真正的单片机中罢了)。现在我们要改变代码存放的位置,即放在 RAM 中,如下图所示:

2 q& g0 b0 @6 u# R: \( n5 L
微信图片_20221125150050.png

; n0 w7 b) M% A4 O- x

- b3 ?+ y  m" A- K/ p" V- @

这样就将 RAM 空间一分为二,既存放代码,亦存放变量。但是我们知道,放在 RAM 中的数据会在掉电之后消失,所以千万保证单片机在调试过程中一直处于供电状态,不过这个条件还是很好满足的。现在说说另外一点,因为代码存放在 RAM 区中,本质上还是变量,所以在使用指针的时候千万要小心,因为一旦指针指向了存放代码的那一块区域,并修改了数据,那么代码运行过程中必然会出现问题(FLASH 还好,因为 FLASH 中的数据改变需要额外的条件支持才能进行数据的修改,但还是要小心指针的使用,虽然不可能改变代码数据,但是可能会改变其他变量的数据)。


2 A6 m# K) ]: |9 ]$ _3 P; |

那么现在就看如何实现将所有的数据存放在 RAM 中。

) m* R; p. A0 J* \8 q1 n6 U5 U

同样的,以 STM32F103RET6 为例进行说明。这款单片机有 512 K FLASH 空间,64 K RAM。怎么看对应的芯片的大小呢?

* w9 Z9 B/ ?# U- I" G8 y/ T( Q2 o" w

先点击这个图标:


+ D' }% G. h6 l" @$ D

微信图片_20221125150040.jpg

: ]6 [0 z. G4 a

然后就能找到对应的芯片了:

" `; ^7 G' P) D9 h6 |& X' x8 H

微信图片_20221125150037.jpg

0 m) R" W1 d( p3 b5 j7 L$ C

这里的 ROM 就是 FLASH,蓝色字体是一个链接,点击就可以直接进入 ST 官网,里面有这款芯片资源的详细信息。

' `9 G* g' t) _( V: R

现在在 FLASH(debug)的基础上建立一个 RAM 目标。


) ], M) J. z/ r& A

首先设置当前目标为 FLASH(debug):

) E& N( ]& @0 j* N

微信图片_20221125150023.jpg

( F2 ?- X$ p/ ]* {6 n4 x

最后点击 OK 保存该设置,之后再重新打开该界面,新建一个 RAM 目标:

) W' B3 ~9 _  p7 U3 z9 a

微信图片_20221125150016.jpg


1 E! r$ J& L! \7 w- X

这样目标就新建好了。


. T' N5 ~6 |; {) w9 `9 J- X+ b

现在先确定一下空间的分配问题,一般代码空间要比变量空间大,所以可以设置代码空间为 48 K,即 0x0000 C000,这样变量的空间就是 64 – 48 = 16 K,这样的空间分配作为一般的模块测试是没有问题的,当然如果觉得不够,也可以自己去合理安排空间。


0 S* {  y# m; G( F. k$ T, Z. S

目前空间分配如下:

2 t/ j, Z5 c# C2 @' t% \

微信图片_20221125145959.png


7 o5 c, y8 ]- h- B. e1 c
/ o/ _3 W, F# o% ]# P& j7 m: t

现在看如何设置这个目标去改变代码的存放位置。


8 ~! M, w, Q3 `/ W, q( v: c+ `9 G

首先通过下面的配置界面进行配置。


9 z7 o: m& w' b

微信图片_20221125145954.jpg


$ x5 {2 o- q% l5 J' B' o! F1 H

这一步就是告诉编译器编译的时候要该如何进行空间分配。


" t7 \4 d% L4 p1 X. U/ Z

然后再配置这个:


0 e4 B( m  r2 ]$ u( Y) ]

微信图片_20221125145917.jpg


5 O5 D/ e! K5 `; i  L0 y

这里注意,Run to main() 不能勾选,否则程序将不能正常运行,不信的话自己去试试看,加深一下印象。


3 u& t% m$ r( e. G: P

然后需要添加一个文件,文件名可以随意,我这里设置文件名为 RAM.ini,注意后缀为 .ini。文件的内容如下:


/ N& i$ M2 O4 N7 W2 }* d0 P. T

微信图片_20221125145913.jpg

1 B6 p( l  i; j' P

这里稍微解释一下,因为所有的数据都存放在 RAM 中了,所以需要重新定位 PC 和 SP 指针(在 FLASH 下载时,默认是从 0x0800 0000 获得 PC 指针和 SP 指针的,所以不需要额外设置这些,但 RAM 不同),在上面的地址分配下,中断向量表定位到了地址 0x2000 0000 开始处,所以要告诉 KEIL,从这里开始获得所需要的数据;同时需要重新定位你的中断向量表(重新定位中断向量也可以通过程序代码去实现,不必在 .ini 中配置),就是通过修改寄存器 0xE000 ED08 实现的。有关中断向量表的内容可以参考《M3 权威手册》


8 Y! p, D( d( x+ K9 I  y

微信图片_20221125145905.jpg


% b. X  B8 F# t$ ~( ~

最后关键的一点是要根据你的路径和文件名加载你的 .axf 文件,这个文件名可以通过搜索工程路径下的 .axf 文件进行确定,也可以通过以下方式确定:

% m8 k: m9 W5 D* V9 j

微信图片_20221125145900.jpg

& w* `6 O0 |* @5 A9 B7 W- u# _

如果你的路径有问题的话,那么将在输出框输出如下信息:


6 V& @9 R8 n; Y# C# y' P; r& O

微信图片_20221125145841.jpg

6 I; _* R6 Q$ O7 ^& X" J, A

但是发现即使如此还是能进行仿真,后面再好好研究一下为什么吧。

/ Z5 }9 Z9 f- X

然后再进行最后一步:

4 A2 y- z6 M% ~, N

微信图片_20221125145824.jpg


5 X7 F5 e* h8 ~4 u5 }

如果这个勾选了,会出现如下错误:


( N1 i# ~! [( F. ]7 q

微信图片_20221125145813.png

9 b' b! Y- r4 Z0 B

大功告成!现在你可以试试用这个图标下载代码并进入调试模式:

! V" M0 S1 E; B) C5 V; ~" e

微信图片_20221125145810.png


, Z1 ^. Q0 P2 b

注意不能用下载图标进行下载:


+ d' ]7 t) r; [% [3 g

微信图片_20221125145804.png

8 F9 s4 N. z- `- x8 z" ?/ y5 ~

这个下载图标是用来下载到 FLASH 的。而上面的图标既可以下载,也可以进入调试模式,所以如果你要进入调试模式的话,直接点上面的图标就可以了,不必先下载代码之后再进入调试模式。


! X/ {& ]8 n5 W7 |4 Z( o

还有关于网上的一些参考文章,发现有多余的步骤,所以如果你想实现 RAM 下载的话,这篇教程还是比较简单的。


3 Q9 S+ B% A/ }: {" J

需要注意一点的就是,因为所有的代码都是下载在 RAM 中的,所以不能使用复位按钮,因为一旦进行复位,那么程序就会跳转到 FLASH 区(地址 0x0800 0000 开始处)进行执行,导致无法再执行到 RAM 中的程序里面,所以暂时不能使用复位按钮,但是这个问题是可以解决的;还有一点,在使用 uCOS II 操作系统时,发现也会出现问题,但是裸机情况下按照如上配置是没有问题的。

! {, r) t3 p$ w, b# `3 r* k

这两个问题后期会一并处理。


4 J! y! ]/ X: G' j, u! A! u

多目标工程建立的一点补充:

5 I! K5 m( W; q4 d) L" _# ]

之前建立多目标的时候,并没有为每一个目标设置对应的输出文件,所以为了防止多目标之间出现文件冲突,为它们单独设置了输出文件位置(如果不想折腾,还是别增加文件夹了,可能会出现一些问题,比如文件夹改变后文件的路径也要做相应改变)。

  \/ ~3 ?" p' ?3 L

在工程目录新建如下文件夹:


/ j  U! F: u, d7 V2 r: A

微信图片_20221125145759.jpg


# a( \' p- ]+ c/ f

然后为每一个目标设置对应的文件夹,比如设置 RAM 目标的文件输出位置:

% O5 Q  R/ a2 a) N

微信图片_20221125145756.jpg

. e) M; h3 A) e' d# h) f" Y6 z

注意设置时必须进入文件内部才行,如下:

# `. h- h3 N" y+ ?4 |. Q

微信图片_20221125145753.jpg

/ ]; p% ~" j& e# Q

同理设置 Listting 文件的输出路径:


$ M0 B- e' j0 L5 |

微信图片_20221125145750.png


  r' S7 i0 v0 H* S0 F; [8 @# {9 z

最后点击 OK 即可保存设置。

: |9 E" X+ ^' W# D+ r0 _
赞 收藏 评论0 发布时间:2022-11-26 14:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版