STM32运行存储在外部SPI FLASH中的代码

STM32的代码是保存在内部FLASH中,执行也在内部FLASH中。那有没有设想一下,如果代码保存在外部SPI FLASH,执行在内部RAM该怎么做?

实现步骤:

  1. 我使用的是STM32F103RCT6,板载SPI FLASH,并且PA4(CS),PA5(SCK),PA6(MISO),PA7(MOSI)连到W25Q32FV上,PA2接到LED上。

  2. 使用STMCubeMX新建工程,定义SPI4根线、配置SPI相关参数、定义LED端口,生成工程,然后加入SPI FLASH的驱动。

  3. 修改总工程属性Option for File Target

    • 勾选并定义ROM1:0xC0000000, 0x100,由于测试代码较小,这里只分配256个字节。
    • IRAM字段由于要放一部分用来执行代码,则将原先长度0xC000缩小为0x8000
    • 如图:
      在这里插入图片描述
  4. 新建test.c文件,该文件用于保存在SPI FLASH、执行在RAM的代码
    修改test.c文件属性Option for File Target,如图:在这里插入图片描述

  5. 编辑test.c,加入翻转LED灯代码:

#include "main.h"
#include "stm32f1xx_hal.h"

void led_test(void)
{
    while(1)
    {
        HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
        HAL_Delay(1000);
    }
}
  1. 编译没问题后,重新修改总工程属性Option for File Target,切换到Link选项,取消勾选Use Memory Layout from Target Dialog,并点击Edit编辑sct文件。
    如图 :
    在这里插入图片描述
    sct编辑内容如下:
LR_IROM1 0x08000000 0x00020000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00020000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x20000000 0x00008000  {  ; RW data
   .ANY (+RW +ZI)
  }
}

LR_ROM1 0xC0000000 0x00000100  {
  ER_ROM1 0x20008000 0x00000100  {  ; load address = execution address
    test.o (+RO)
   .ANY (+RO)
  }
}
  1. 编辑main.c,添加以下代码:
//由于代码存在外部的SPI FLASH,因此代码搬移工作必须手动完成,即加载域到执行域的拷贝工作必须自己完成。
W25QXX_Read((uint8_t*)0x20008000,0x0, 100);//注释该语句将进入HardFault_Handler
led_test();
  1. 重新完全编译,然后烧录选项添加SPI FLASH的烧录算法。
    参考:Keil(MDK)下用仿真器烧程序的同时烧写附加数据到SPI FLASH
    烧录后上电,点灯间隔1秒闪烁成功,大功告成!

http://www.armbbs.cn/forum.php?mod=viewthread&tid=82274&highlight=FLASH

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值