28335将flash中的代码复制到RAM中运行的方法

网上看了很多关于这方面的操作,都不是很满意。第一,操作麻烦;第二,不通用,使用平台有限。下面总结了一个更简单通用的方法以供参考。

在MCU的使用过程中,偶尔会遇到将flash中的代码复制到RAM中运行的情况,下面就来说一下具体的方法,以28335的flash初始化为例:
1,编写函数,该函数处于flash中,就是我们即将要复制的代码。

void FlashInitCode(void)

{

   EALLOW;

   //Enable Flash Pipeline mode to improve performance

   //of code executed from Flash.

   FlashRegs.FOPT.bit.ENPIPE = 1;

 

   //                CAUTION

   //Minimum waitstates required for the flash operating

   //at a given CPU rate must be characterized by TI.

   //Refer to the datasheet for the latest information.

#if CPU_FRQ_150MHZ

   //Set the Paged Waitstate for the Flash

   FlashRegs.FBANKWAIT.bit.PAGEWAIT = 5;

 

   //Set the Random Waitstate for the Flash

   FlashRegs.FBANKWAIT.bit.RANDWAIT = 5;

 

   //Set the Waitstate for the OTP

   FlashRegs.FOTPWAIT.bit.OTPWAIT = 8;

#endif

 

#if CPU_FRQ_100MHZ

   //Set the Paged Waitstate for the Flash

   FlashRegs.FBANKWAIT.bit.PAGEWAIT = 3;

 

   //Set the Random Waitstate for the Flash

   FlashRegs.FBANKWAIT.bit.RANDWAIT = 3;

 

   //Set the Waitstate for the OTP

   FlashRegs.FOTPWAIT.bit.OTPWAIT = 5;

#endif

   //                CAUTION

   //ONLY THE DEFAULT VALUE FOR THESE 2 REGISTERS SHOULD BE USED

   FlashRegs.FSTDBYWAIT.bit.STDBYWAIT = 0x01FF;

   FlashRegs.FACTIVEWAIT.bit.ACTIVEWAIT = 0x01FF;

   EDIS;

 

   //Force a pipeline flush to ensure that the write to

   //the last register configured occurs before returning.

 

   asm(" RPT #7 || NOP");

}


2,在RAM中分配空间,用于copy代码的RAM中运行,这里直接定义一个数组,数组的大小要大于上面代码的空间,具体数字可查看MAP文件确定,这个空间可以大点,留有一些余量。
static Uint16 InitFlashCodeInRam[INIT_FLASH_CODE_MAX_SIZE];

3,定义函数指针类型,后面会用到
typedef void (*pInitFlashInRam)(void);

4,代码执行操作
(1),定义函数指针,指向上面分配的RAM空间,后面就是通过这个函数指针来调用程序运行的。
(2),将flash中的代码复制到RAM中
(3),通过函数指针的方式运行代码
代码如下:

void InitFlash(void)

{

pInitFlashInRam p=(pInitFlashInRam)InitFlashCodeInRam;

 

memcpy(InitFlashCodeInRam,FlashInitCode,INIT_FLASH_CODE_MAX_SIZE);

(*p)();

}

 

5,以上操作方式通用性强,操作简单,支持c语言开发的平台均可使用。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在将STM32代码Flash搬移到RAM的过程,我们首先需要确保芯片的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代码Flash搬移到RAM需要修改链接脚本和代码运行起始位置,并进行代码复制操作。同时,还需要设置向量表的位置,更新断向量表地址,并验证代码的正常运行。这样做可以提高代码的执行速度,尤其适用于性能要求较高的应用。 ### 回答2: 将STM32代码Flash搬移到RAM的主要目的是为了提高代码的执行效率和响应速度。在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代码Flash搬移到RAM是为了提高代码的执行效率和响应速度。通过复制代码RAM并设置正确的起始地址,可以减少访问延迟,提高读取速度和执行效率。然而,在搬移代码时需要注意RAM的容量限制,并合理管理RAM的使用。 ### 回答3: 将STM32的代码Flash搬移到RAM可以提高代码执行效率和速度。通常情况下,STM32的代码存储在Flash,当在运行时需要执行部分代码时,会从Flash读取指令并执行。搬移到RAM后,所有代码都存储在RAM运行时不再需要从Flash读取指令,而是直接在RAM执行指令,从而减少了访问存储器的时间。 实现将STM32代码Flash搬移到RAM的步骤如下: 1. 在代码工程Flash部分的代码复制RAM区域的一部分以确保代码可用。可以在代码声明一个特殊的RAM段,将相关函数和变量放入其。 2. 通过编译器和链接器设置,将这部分特殊RAM段的起始地址和大小与MCU的RAM进行关联。这样,编译器在生成可执行文件时会将相应的代码放到RAM区域。 3. 在代码修改启动向量,使得MCU重启后直接从RAM启动,而不是从Flash启动。这可以通过设置复位向量表的复位向量地址为RAM的起始地址来实现。 4. 对于涉及到断向量表的代码,还需要修改断向量表,使得断服务程序能够从RAM正确地执行。 通过将代码搬移到RAM,可以减少Flash访问的延迟和读取时间,提高代码执行速度和效率。这在对实时性要求较高的应用特别有用,例如控制任务响应、数据处理和实时通信等。然而,需要注意的是,将大量代码Flash搬移到RAM可能会导致RAM资源紧张,因此需要仔细评估代码规模和RAM容量,以确保RAM能够容纳所需的代码和数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值