北京中科昊芯科技有限公司

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 501|回复: 0

FLASH区指定地址 存储参数

[复制链接]

2

主题

0

回帖

22

积分

新手上路

积分
22
发表于 2023-10-10 14:41:47 | 显示全部楼层 |阅读模式
本帖最后由 Dheevara 于 2023-10-10 16:07 编辑

本例程仅针对HX280025C-ECD本版,
如需移植到28027/28034/28035/280049等平台,需要注意.ld文件(FLASH地址)的地址及FLASH_API差异。
FLASH API可参考官网的gitee。


1:建立280025空白工程;



2:修改xxFlash.ld文件,以下红色内容为修改部分,新增PARA_AREA,其起始地址为0x630000;



OUTPUT_ARCH( "riscv" )
ENTRY(_start)


MEMORY
{
  /*PAGE 0:*/
  BOOT_RSVD(rwx)   :  ORIGIN = 0x0     ,    LENGTH = 0x200
  PRAMM0 (rwx)     :  ORIGIN = 0x200   ,    LENGTH = 0x600                              /* RAM M0*/
  PRAMM1 (rwx)     :  ORIGIN = 0x800   ,    LENGTH = 0x800                              /* RAM M1*/
  
  PRAMLS4567(rwx)  :  ORIGIN = 0x10000 ,    LENGTH = 0x8000
  RAMGS0(rwx)      :  ORIGIN = 0x20000 ,    LENGTH = 0x2000  

  FlashRegs_FILE (rwx)    :  ORIGIN  = 0x7AF800 ,    LENGTH = 0x400
  BEGIN(rwx)              :  ORIGIN = 0x600000  ,    LENGTH = 0x10   
  FLASH  (rwx)            :  ORIGIN = 0x600010  ,    LENGTH = 0x30000
  PARA_AREA(rwx)                 :  ORIGIN = 0x630000  ,    LENGTH = 0x0FFF0                   /* FLASH*/   

  USER_OTP_FILE(rw)              :  ORIGIN  = 0x7A0000 ,    LENGTH = 0x800                      /* on-chip UserOTP */
  BootRom_FILE (rx)       :  ORIGIN  = 0x7E0000 ,    LENGTH = 0x20000                    /* on-chip Bootrom */

  IER_REGISTER_FILE(rw)   :  ORIGIN  = 0x100C10 ,    LENGTH = 0x04
  IFR_REGISTER_FILE(rw)   :  ORIGIN  = 0x100D10 ,    LENGTH = 0x04
}


新增以下红色部分,指定 .parameters在PARA_AREA区域内。


/* text: test code section */
  . = 0x00600000;
  .codestart : { *(codestart) } > BEGIN
  
  . =  0x00630000;
  .parameters : {KEEP(*(.parameters)) } > PARA_AREA
  
  . =  0x00600010;
  .text.init : {  *(.text.init)  }  > FLASH


3:在main.c  指定数组或结构体在需要设定的地址;
1)const CODE_SECTION(".parameters") int Para_array[4]={5,6,3,4};

2)const CODE_SECTION(".parameters") struct paras saved;


以下测试 在 0x630000地址(即扇区96开始的FLASH空间)存放 一些典型参数(整形+浮点+数组 组合),在扇区96的内容被FLASH_API修改后,读出的参数被修改。

在main.c添加结构体

union vars
{
        uint32 i_value;
        float f_value;
};
union vars test_var;


struct paras
{
        int32 para1;
        union vars var1;
        int32 buff[10];
};


在ROM_Flash_API_test1中修改0x630000起始 区域的内容

void CODE_SECTION("ramfuncs")
ROM_Flash_API_test1()
{
        // 初始化Flash API, DSP的运行频率为160MHz
        (*  Fapi_initializeAPI)(160);

        /*   擦除第120扇区
         *  HXS320F280025C总共有128个Sector,每个Sector的大小是2048 Byte
         *  Flash Addr的范围为0x600000~0x63FFFF
         * */

        Erase_result = (* Flash280025_SectorErase)(96,0,NULL);
        if(Erase_result != 0)
        {
                Fail();
        }

        for(i=0;i<8;i++)
        {
                program_buffer = i;
        }

        //修改program_buffer[1]参数
        test_var.f_value = 1.2345f;
        program_buffer[1] = test_var.i_value;

        /*  写Buffer[LEN]到第120扇区,
         * Flash280025_Program()写入的时候,地址需要32 Byte对齐,一次写入32个Byte
         * 因此,写满一个2k Byte大小的Sector,需要调用64次Flash280025_Program()
         * 120扇区的偏移地址是120 * 2048 = 245760(0x3C000)
         * Flash280025_Program
         *  */

        for(j=0; j<64; j++)//64x8
        {
           Program_result = (* Flash280025_Program)                 \
                           ((uint32 *)(0x630000 + 32*j),program_buffer,8,NULL);
           if(Program_result != 0)
           {
                  Fail();
           }
        }
    Success();
}



int main(void)
{
    char i;

    Device_init();

    ROM_Flash_API_test1();


    while(1)
    {

    }
    return 0;
}

在Device_init(); 处打断点


下载调试可见:


运行到while(1)




以上已完成了参数的修改与读取,
实际应用中一般在通讯或人机界面中修改参数值,调用ROM_Flash_API_test1()即可。

受上传大小限制,此处只提供 main.c、FlashApi.h、.ld文件,添加到空白工程覆盖同名文件即可:



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|北京中科昊芯科技有限公司 ( 京ICP备19023330号-3 )

GMT+8, 2024-4-29 09:30 , Processed in 0.250098 second(s), 29 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表