F28335 学习系列一——FLASH 搬移到 RAM 运行实现方法

 

F28335  学习系列一 

——FLASH 搬移到 RAM 运行实现方法 

本人学习 28335 有一段时间了,每次都有这样的感觉:“讲解 F28335 的资料太少了!”。特别是在使用 F28335 遇到困难时,往往要调动百度,  google 等各大搜索引擎,方能寻觅点零星的资料。店面上出售的 TI C2000 系列 DSP 中文资料以 2407 和 2812 为多,全部讲解的28335  的中文资料没有(不知道是不是我没有发现,有的同志,麻烦您给我留个言啊)。我现手上有一本参考书:<<TMS32x28xxx  原理与开发>>,电子工业出版社,这里面讲到了28335 的几个模块,刚开始学习的同志可以借鉴下。 

学习的方法主要有 2 种,理论学习和实践学习。在正式讲述本节内容之前我先强调下,我写这些文字没有很复杂的理论知识介绍,也没有很详细的原理讲述,我传递的只是一种方法,能够帮你解决问题的方法。当然,我不是强调理论知识不重要,因为这里如果理论也介

绍,方法也介绍,恐怕每个方面都讲不清楚,而且看起来也比较费劲,理论知识总让我想起一串串复杂的公式。本节就是教会你怎样将 F28335 在 FLASH 里面运行的程序搬移到 RAM里面运行。 

使用过 TI  DSP 或正在使用的人都知道,DSP 程序可以放在 RAM 里面运行,也可以放在 FLASH 里面运行。两者有一定的区别: 

(1)前者程序运行时,连接着仿真器,后者脱离仿真器; 

(2)前者断电程序丢失,后者不会; 

(3)前者程序运行速度快,后者慢; 

(4)二者空间大小可能不一样(取决于芯片型号); 

(5)前者没有烧写次数的限制,而后者有; 

所以在 RAM 里面运行适合项目的初期调试,方便快捷,当最终程序全部调试完后,做成产品销售时,将程序烧写到 FLASH 里面(特殊场合,比如在做高压的实验时,可以考虑将程序烧写到 FLASH 里面调试)。 

在上面 5 点当中,第 3 点我加了强调,在一个实际的项目里面,程序的运行速度是很受关注的,我曾对 F28335 在 FLASH 里运行程序和在 RAM 里面运行程序做过对比,相同的代码在 FLASH 和 RAM 里面运行时间如下表: 

表 1    FLASH 和 RAM 里程序运行区别表 

一段程序代码 运行时间 

RAM 里运行  5us 

FLASH 里运行  25us 

        从上表可以看出,RAM 里面运行程序比 FLASH 里面运行程序快近 5 倍(只对 F28335,其它芯片不一定适用),所以寻找一种可以提高程序在 FLASH  里运行速度的方法,对提高程序总体性能很有帮助。 

        通过很多前辈们的努力,终于寻找到一种方法:将程序烧写到 FLASH 里面,上电时将程序搬移到 RAM 里面运行。这即满足了掉电程序不丢失,又满足了程序运行速度高的要求,可谓一箭双雕。 

        本人在遇到这个问题以后,对这种方法很感兴趣,想尝试一下,找了很多资料(包括理论和实践),摸索了一天一点头绪都没有,用 TI FLASH 例程也能够烧进去,但程序执行不对。开始有点灰心了,但又不死心。继续研究了一天,发现 TI 给的例程和网上一些热心网友们给的例程都是将指定的代码搬移到 FLASH 里面,可以通过: 

#pragma CODE_SECTION(函数名, "存储器入口地址");语句完成,感觉很简单,但就是调试不出来。最后,突然想起来,可不可以不这样做,找一个能够将所有程序均搬移到 RAM 里面的方法。 

…… 

中间省略号就是本人奋斗的过程,开始之前就讲了,写这些文字是将一种方法分享给大家,至于研究奋斗的过程就不详细描述,不然恐怕说几十页纸都讲不清楚。接下来就一步步教大家如何建立一个能够将 FLASH 里面程序上电时搬移到 RAM 里面运行的工程。 

1、 建立一个工程;(怎么建立省略) 

 

2、 将工程里面源文件(source)的“DSP2833x_SysCtrl.c”、“DSP2833x_usDelay.asm”和“DSP2833x_CodeStartBranch.asm”文件(如果用的是 TI 提供的文件就是这四个 文 件 ) 分 别 替 换 成 “ DSP28xxx_SysCtrl.c ”、“ DSP28xxx_usDelay.asm ” 和“DSP28xxx_CodeStartBranch.asm”  。 另外,在将“DSP28xxx_SectionCopy_nonBIOS.asm”文件添加到工程里面; 备    注    :  “    DSP28xxx_SysCtrl.c    ”  、  “    DSP28xxx_usDelay.asm    ”  、“DSP28xxx_CodeStartBranch.asm”和“DSP28xxx_SectionCopy_nonBIOS.asm”

我已经放在附件里面上传了。 

 

3、 添加 CMD:“DSP2833x_Headers_nonBIOS.cmd”和“F2833x_nonBIOS_flash.cmd”。

如果工程里面已经有了 CMD,要换成这 2 个。 

备注:“DSP2833x_Headers_nonBIOS.cmd”和“F2833x_nonBIOS_flash.cmd”也

已经放在附件里。 

 

4、 编译烧写。 

 

大功告成了,各位可以试试,做个对比,看下不用这种方法和用这种方法程序分别执行的时间,差别很惊人哦!如果按照以上教你的步骤还是不行,可以给我留言!当然,能够成功烧写也可以留言哈! 

就此搁笔!愿君安好!^_^ 

 

 

作者:程林 

日期:2010-11-3 

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 35
    评论
### 回答1: 在将STM32代码从FlashRAM的过程中,我们首先需要确保芯片的RAM容量足够存储代码。然后,我们需要将代码的链接脚本进行修改,以便将代码从Flash的地址重新定位到RAM的地址。接下来,我们需要进行代码的复制操作,将Flash中的代码复制到RAM中。 为了完成这个过程,我们可以使用如下的步骤: 1. 修改链接脚本:打开链接脚本文件并进行修改,将代码的起始地址和大小重新定义为RAM的地址和大小。 2. 修改代码运行起始位置:检查代码中的启动函数,确保它指向RAM的起始位置,而不是Flash的起始位置。 3. 复制代码到RAM:在代码的启动函数中,我们需要添加复制代码到RAM的操作。可以使用内置的复制函数(如`memcpy()`)或者手动复制方式进行。将Flash中的代码复制到RAM中后,确保更新相关变量的地址。 4. 设置向量表位置:在引导代码的开头,我们需要设置向量表的位置为RAM。这需要根据具体的芯片进行设置,可以通过修改SCB的VTOR寄存器来实现。 5. 更新中断向量表地址:在启动文件中,确保中断向量表的地址已经更新为RAM的地址。这样做可以确保芯片在中断发生时正确地跳转到RAM中的中断处理函数。 6. 验证代码正常运行:重新编译和烧写代码,并确保所有代码正常运行,没有出现异常或错误。 总结起来,将STM32代码从FlashRAM需要修改链接脚本和代码运行起始位置,并进行代码的复制操作。同时,还需要设置向量表的位置,更新中断向量表地址,并验证代码的正常运行。这样做可以提高代码的执行速度,尤其适用于性能要求较高的应用。 ### 回答2: 将STM32代码从FlashRAM的主要目的是为了提高代码的执行效率和响应速度。在Flash中存储的代码是只读的,因此每次执行代码时,MCU都需要从Flash读取指令,这会导致一定的读取延迟和访问速度下降。而将代码RAM中后,可以直接从RAM中读取指令,以极大地减少读取延迟和提高执行效率。 代码的操作一般分为两步:将代码从Flash中复制到RAM,并将复制后的代码重新定位到RAM的起始地址。这样,当代码执行时,MCU会首先从RAM读取指令,而不需要再每次都从Flash中读取。 代码的过程可以通过使用相关函数或指令来完成。在STM32中,可以使用HAL库中的相应函数,如HAL_FLASHEx_DATAEEPROM_Copy()函数来实现Flash中的代码复制到RAM。在复制完成后,还需要根据具体的MCU型号和使用的开发工具,设置复制后代码的起始地址,以便MCU能够正确地访问RAM中的代码。 需要注意的是,将代码RAM中后,需要合理利用RAM的容量和管理RAM的使用,因为RAM的容量一般比Flash有限。在复制代码之前,应该先估计代码的大小,并确保RAM有足够的空间来存储代码。此外,还可以考虑将一些频繁执行的代码块RAM中,以进一步提高执行效率。 总结来说,将STM32代码从FlashRAM是为了提高代码的执行效率和响应速度。通过复制代码到RAM并设置正确的起始地址,可以减少访问延迟,提高读取速度和执行效率。然而,在代码时需要注意RAM的容量限制,并合理管理RAM的使用。 ### 回答3: 将STM32的代码从FlashRAM可以提高代码执行效率和速度。通常情况下,STM32的代码存储在Flash中,当在运行时需要执行部分代码时,会从Flash中读取指令并执行。RAM后,所有代码都存储在RAM中,运行时不再需要从Flash读取指令,而是直接在RAM中执行指令,从而减少了访问存储器的时间。 实现将STM32代码从FlashRAM的步骤如下: 1. 在代码工程中将Flash部分的代码复制到RAM区域的一部分以确保代码可用。可以在代码中声明一个特殊的RAM段,将相关函数和变量放入其中。 2. 通过编译器和链接器设置,将这部分特殊RAM段的起始地址和大小与MCU的RAM进行关联。这样,编译器在生成可执行文件时会将相应的代码放到RAM区域中。 3. 在代码中修改启动向量,使得MCU重启后直接从RAM中启动,而不是从Flash启动。这可以通过设置复位向量表中的复位向量地址为RAM的起始地址来实现。 4. 对于涉及到中断向量表的代码,还需要修改中断向量表,使得中断服务程序能够从RAM中正确地执行。 通过将代码RAM中,可以减少Flash访问的延迟和读取时间,提高代码执行速度和效率。这在对实时性要求较高的应用中特别有用,例如控制任务响应、数据处理和实时通信等。然而,需要注意的是,将大量代码从FlashRAM可能会导致RAM资源紧张,因此需要仔细评估代码规模和RAM容量,以确保RAM能够容纳所需的代码和数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 35
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值