新唐MCU技术
直播中

北上北京

9年用户 939经验值
擅长:嵌入式技术
私信 关注
[问答]

如何在 Keil rvmdk 开发环境中启用可配置的数据闪存并设置大小?

如何在 Keil rvmdk 开发环境中启用可配置的数据闪存并设置大小?

回帖(2)

李祥芝

2025-8-26 17:00:35
在NuMicro®系列中,如果数据闪存大小是可配置的,则其大小将与APROM共享。要配置数据闪存,请按照以下步骤作:
In Keil µVision4/5, open the Option for target form (Flash->Configure Flash Tools)


1. 选择“实用程序”
2. 点击“设置”按钮
3. 点击“配置”按钮
4. 启用“数据闪存”;
5. 设置数据闪存大小;
举报

足球上篮

2025-8-29 17:29:34

在Keil MDK (μVision) 中启用可配置的数据闪存(Data Flash)并设置其大小,需要通过分散加载文件(Scatter File, .sct) 手动配置内存布局。以下是详细步骤:




1. 理解数据闪存



  • 数据闪存是Flash中用于存储非易失性数据(如参数、校准值)的区域,与程序代码分离。

  • 在嵌入式系统中,数据闪存通常由链接器脚本控制,确保编译后的数据段映射到正确的地址。




2. 步骤概览



  1. 创建/修改分散加载文件(.sct)

  2. 在工程中指定自定义的.sct文件

  3. 在代码中声明数据闪存变量(使用 __attribute__#pragma

  4. 编译并验证




3. 详细步骤


(1) 创建/修改分散加载文件(.sct)




  • 在工程目录下新建文件(如 flash_layout.sct),输入以下内容(以ARM Cortex-M为例):


    ; 定义内存区域
    LR_IROM1 0x08000000 0x000F0000  {  ; 主程序区域(起始地址+大小)
    ER_IROM1 0x08000000 0x000F0000  { ; 程序代码段
      *.o (RESET, +First)       ; 中断向量表
      *(.text*)                 ; 代码
      *(.rodata*)               ; 只读数据
    }
    ; ... 其他程序段(如.data、.bss)可放在RAM
    }

    ; 定义数据闪存区域(起始地址 = 主程序结束地址)
    LR_DATA_FLASH 0x080F0000 0x00010000  {  ; 数据闪存(64KB)
    ER_DATA_FLASH 0x080F0000 0x00010000  {
      *(.data_flash*)           ; 匹配特定段名的数据
    }
    }

    ; RAM配置
    RW_IRAM1 0x20000000 0x00020000  {  
    .ANY (+RW +ZI)             ; 所有RW/ZI数据
    }

    关键说明



    • 0x080F0000:数据闪存起始地址(需根据芯片Flash大小调整)。

    • 0x00010000:数据闪存大小(示例为64KB)。

    • *(.data_flash*):将所有标记为.data_flash的段放入此区域。




(2) 在Keil中配置.sct文件



  1. 打开工程 → Options for TargetLinker 标签页。

  2. 取消勾选 Use Memory Layout from Target Dialog

  3. Scatter File 字段指定自定义.sct文件路径:
     .flash_layout.sct

    Keil Scatter File配置



(3) 在代码中声明数据闪存变量




  • 使用GCC扩展语法(Keil AC6编译器):


    // 定义常量数据(只读)
    const uint32_t __attribute__((section(".data_flash"))) config_data[] = {0x1234, 0x5678};

    // 定义非初始化数据(需通过Flash API擦写)
    uint32_t __attribute__((section(".data_flash"))) eeprom_buffer[1024];


  • 或使用ARMCC(Keil AC5)语法:
    #pragma arm section rodata = ".data_flash"
    const uint32_t config_data[] = {0x1234, 0x5678};
    #pragma arm section rodata  // 恢复默认段


(4) 擦写数据闪存



  • 硬件访问:通过芯片的Flash驱动API操作数据区域(需先擦除后写入)。

  • 地址获取:直接使用变量地址或通过分散文件定义的符号:
    extern uint32_t Image$$ER_DATA_FLASH$$Base;  // 数据闪存起始地址(符号由链接器生成)




4. 验证配置



  1. 编译工程:确保无链接错误。

  2. 查看Map文件

    • 打开生成的 .map 文件(在Objects目录下)。

    • 搜索 ER_DATA_FLASH,确认变量地址在0x080F0000附近:
      Execution Region ER_DATA_FLASH (Base: 0x080f0000, Size: 0x00001000)
      config_data        0x080f0000   Data    8  main.o(.data_flash)


  3. 硬件调试:通过Keil调试器查看Flash内容。




常见问题解决



  1. 链接错误

    • 地址重叠:调整.sct文件中各区域大小/起始地址。

    • 未找到符号:检查变量是否正确定义在 .data_flash 段。


  2. 数据无法写入

    • 未启用写保护:调用Flash解锁函数(如HAL_FLASH_Unlock())。

    • 地址越界:确保擦写地址在 ER_DATA_FLASH 范围内。



通过以上步骤,即可在Keil中启用并配置数据闪存区域。具体地址和API需根据芯片手册调整(如STM32的Flash操作库)。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分