内部flash 的配置

公告

大中华汽车电子生态圈社区并入开发者社区- 更多资讯点击此

Tip / 登入 to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
CaLi_4592466
Level 4
Level 4
25 replies posted 10 replies posted 5 replies posted

DevicePreset "20706A2 Serial Flash kb"

{

ConfigFSOffset = 0

DLReadWriteMode = "Cortex M3 HCI"

DLWriteVerifyMode = "Write and verify"

DLMaxWriteSize = 249

DLSectorEraseMode = "Chip erase"

DLDTRReset = 0

DLPostResetDelay_ms = 100

DLAutobaud = 0

DLAutobaudRepeat = 1

DLAutobaudRepeatDelay_ms = 200

DLWaitForLaunchAnnounce = 0

DLConfigReprogramIF_PLL = 0

DLUsbBulkPipe = 0

DLMinidriver = 0

DLMinidriverPathUSB = "[MINIDRIVERS]\20706\usb_legacy_ramcfg_only.hex"

DLMinidriverPathNET = "[MINIDRIVERS]\20706\INVALID.hex"

DLMinidriverPathSDIO = "[MINIDRIVERS]\20706\INVALID.hex"

DLMinidriverPathUPRX = "[MINIDRIVERS]\20706\uart_legacy_ramcfg_only.hex"

DLMinidriverPathUART = "[MINIDRIVERS]\20706\uart_legacy_ramcfg_only.hex"

DLFirmware = 0

DLFirmwareTargeting = "Standard"

DLConfig = 1

DLConfigTargeting = "EEPROM"

ConfigPath = "A_20706A2-generic.cgs"

DLConfigFixedHeader = 1

DLConfigFixedHeaderFromBurnImage = 0

DLConfigOmitRF_PLL = 1

DLConfigIncludeChargerConfig = 0

DLConfigDFUKey = 4294967295

DLConfigCrystalFreqMHzX10000 = 240000

DLConfigOutputPowerAdjust = 40

DLConfigImpedanceMatchTuning = 31

DLConfigSerialControlBaudRate = 115200

DLConfigEEPROMAccessSpeed = 100

DLConfigVSOffset = 0

ConfigDSLocation = 12288

DLConfigSSLocation = 0

DLConfigIncludeBTWSecurityKey = 0

DLConfigVSLocation = 4096

DLConfigVSLength = 4096

DLConfigRemoteDeviceCount = 0

DLConfigBD_ADDRBase = "88888888****"

DLConfigFixedBD_ADDRFlag = "Can change"

OTAFWUAckAllRecords = 0

OTAFWUUpdateFirmware = 1

OTAFWUUpdateConfig = 1

}

我在WICED-Studio-6.2\20706-A2_Bluetooth\platforms\CYBT_343026_EVAL 目录下看到CYBT_343026_EVAL_SFLASH.btp 这个文件,是否可以通过 这个文件对VS的大小进行配置 满足我对存储数据在内部flash的需求?能否配置到20K ?怎么配置?

1 解答
Owen_Zhang123
Moderator
Moderator
Moderator
5 questions asked 500 solutions authored 250 sign-ins
  1. flash分块介绍

如之前所述,sFlash被分为如下区域,ss, vs1, vs2, ds1, ds2

其中ss被芯片底层使用,vs用来存储用户数据,ds用来存储FW

343026中,flash各个区块的分配如下(libraries/fw_upgrade_lib/fw_upgrade.c):

    // 4 MB Serial flash offsets for firmware upgrade.

    nv_loc_len.ss_loc   = 0x0000;

    nv_loc_len.vs1_loc  = (FLASH_SECTOR_SIZE + FLASH_SECTOR_SIZE); // one sector after SS for fail safe

    nv_loc_len.vs1_len  = FLASH_SECTOR_SIZE;

    nv_loc_len.vs2_loc  = nv_loc_len.vs1_loc + nv_loc_len.vs1_len;

    nv_loc_len.vs2_len  = FLASH_SECTOR_SIZE;

    nv_loc_len.ds1_loc  = nv_loc_len.vs2_loc + nv_loc_len.vs2_len;

#if defined(USE_256K_SECTOR_SIZE)

    nv_loc_len.ds1_len  = FLASH_SECTOR_SIZE;

    nv_loc_len.ds2_loc  = nv_loc_len.ds1_loc + nv_loc_len.ds1_len;

    nv_loc_len.ds2_len  = FLASH_SECTOR_SIZE;

#else

    {

        uint32_t ds1_ds2_length = (FW_UPGRADE_FLASH_SIZE - nv_loc_len.ds1_loc);

        nv_loc_len.ds1_len = ds1_ds2_length/2;

        nv_loc_len.ds2_loc  = nv_loc_len.ds1_loc + nv_loc_len.ds1_len;

        nv_loc_len.ds2_len = ds1_ds2_length/2;

    }

#endif

由此可见,各个区块大小ss(8k), vs1(4k), vs2(4k), ds1(248k), ds2(248k)VS区域无法满足储存20k数据的需求。所以建议将数据存储在FW区域,即DS1区域。根据你发过来的编译信息,application大小在80k左右,理论上有160k左右可供使用。但是,请注意flash的最大读写次数为10w次,请根据你的应用来评估是否可以满足。如果不能满足,则需要在程序中做一个循环写入的逻辑,例如,将可用空间分为两块,循坏使用,这样可用空间就只有80k

2. 如何向flash固定区块写入数据

首先,需要根据编译出来的hex文件确定应用程序在flash中占用的大小以及具体的位置。下面以ota demo为例,在编译出来的hex文件,或者download.log中可以看到总共占用了多少空间:

A total of 2 contiguous memory areas were filled:

[FF000000..FF000080] DATA (129 bytes)

[FF004000..FF0154D1] DATA (70866 bytes)

Total execution time: 11.60 seconds     Net downloading time: 11.60 seconds

理论上来讲,从0154D1之后的区域,都可以用来存储数据。但是请注意,flash4k sector的,也就是说,每次在擦除的时候是以4k为单位进行的,所以在写入用户数据的时候请注意以4k为单位对齐。在这个例子中,可用区域应该从016000开始。

3.写入数据时使用的API

请参考libraries/fw_upgrade_lib/fw_upgrade.c中的function wiced_firmware_upgrade_store_to_nv

在这个函数中调用了fw_upgrade_write_mem,这个函数底层使用的是

wiced_hal_sflash_write(write_to, len, data)

在使用的过程中,可以根据应用程序的需要在这个API的基础上封装自己需要的function

4. 其他注意事项

由于类似的应用之前并没有其他客户使用过,我们这边只有在测试flash性能的时候使用相关的函数进行过flash的读写测试。因此需要你那边进行测试。

另外,在OTA的时候,是在DS1DS2之间相互切换,即第一次烧写存储在DS1OTA的代码放在DS2。下一次OTA的代码会放在DS1。相关的函数为

fw_upgrade_switch_active_ds

所以,在存放用户数据的时候,需要考虑到OTA代码写入的时候,如果OTA代码比较大,可能会擦除掉用户数据。OTA的在擦除的时候也是按照sector来进行的,并不是整个flash擦除,可以参考libraries/fw_upgrade_lib/fw_upgrade.c中的代码。

在写入数据之后,建议对设备多次进行OTA,然后读取用户数据,测试数据是否被擦除。

在原帖中查看解决方案

0 点赞
4 回复数
Owen_Zhang123
Moderator
Moderator
Moderator
5 questions asked 500 solutions authored 250 sign-ins

建议将数据存储到DS区域中,FW之外的部分,直接调用写flash的API。

具体操作起来比较复杂,我这边明天整理一下再回复你。

另外,请问一下,这个问题和Cary在case中问的问题是同一个吗?编译的代码一样,大概占用80k,需要OTA?

0 点赞

是的,是同一个问题。请尽快出一个修改说明,谢谢!

0 点赞
Owen_Zhang123
Moderator
Moderator
Moderator
5 questions asked 500 solutions authored 250 sign-ins
  1. flash分块介绍

如之前所述,sFlash被分为如下区域,ss, vs1, vs2, ds1, ds2

其中ss被芯片底层使用,vs用来存储用户数据,ds用来存储FW

343026中,flash各个区块的分配如下(libraries/fw_upgrade_lib/fw_upgrade.c):

    // 4 MB Serial flash offsets for firmware upgrade.

    nv_loc_len.ss_loc   = 0x0000;

    nv_loc_len.vs1_loc  = (FLASH_SECTOR_SIZE + FLASH_SECTOR_SIZE); // one sector after SS for fail safe

    nv_loc_len.vs1_len  = FLASH_SECTOR_SIZE;

    nv_loc_len.vs2_loc  = nv_loc_len.vs1_loc + nv_loc_len.vs1_len;

    nv_loc_len.vs2_len  = FLASH_SECTOR_SIZE;

    nv_loc_len.ds1_loc  = nv_loc_len.vs2_loc + nv_loc_len.vs2_len;

#if defined(USE_256K_SECTOR_SIZE)

    nv_loc_len.ds1_len  = FLASH_SECTOR_SIZE;

    nv_loc_len.ds2_loc  = nv_loc_len.ds1_loc + nv_loc_len.ds1_len;

    nv_loc_len.ds2_len  = FLASH_SECTOR_SIZE;

#else

    {

        uint32_t ds1_ds2_length = (FW_UPGRADE_FLASH_SIZE - nv_loc_len.ds1_loc);

        nv_loc_len.ds1_len = ds1_ds2_length/2;

        nv_loc_len.ds2_loc  = nv_loc_len.ds1_loc + nv_loc_len.ds1_len;

        nv_loc_len.ds2_len = ds1_ds2_length/2;

    }

#endif

由此可见,各个区块大小ss(8k), vs1(4k), vs2(4k), ds1(248k), ds2(248k)VS区域无法满足储存20k数据的需求。所以建议将数据存储在FW区域,即DS1区域。根据你发过来的编译信息,application大小在80k左右,理论上有160k左右可供使用。但是,请注意flash的最大读写次数为10w次,请根据你的应用来评估是否可以满足。如果不能满足,则需要在程序中做一个循环写入的逻辑,例如,将可用空间分为两块,循坏使用,这样可用空间就只有80k

2. 如何向flash固定区块写入数据

首先,需要根据编译出来的hex文件确定应用程序在flash中占用的大小以及具体的位置。下面以ota demo为例,在编译出来的hex文件,或者download.log中可以看到总共占用了多少空间:

A total of 2 contiguous memory areas were filled:

[FF000000..FF000080] DATA (129 bytes)

[FF004000..FF0154D1] DATA (70866 bytes)

Total execution time: 11.60 seconds     Net downloading time: 11.60 seconds

理论上来讲,从0154D1之后的区域,都可以用来存储数据。但是请注意,flash4k sector的,也就是说,每次在擦除的时候是以4k为单位进行的,所以在写入用户数据的时候请注意以4k为单位对齐。在这个例子中,可用区域应该从016000开始。

3.写入数据时使用的API

请参考libraries/fw_upgrade_lib/fw_upgrade.c中的function wiced_firmware_upgrade_store_to_nv

在这个函数中调用了fw_upgrade_write_mem,这个函数底层使用的是

wiced_hal_sflash_write(write_to, len, data)

在使用的过程中,可以根据应用程序的需要在这个API的基础上封装自己需要的function

4. 其他注意事项

由于类似的应用之前并没有其他客户使用过,我们这边只有在测试flash性能的时候使用相关的函数进行过flash的读写测试。因此需要你那边进行测试。

另外,在OTA的时候,是在DS1DS2之间相互切换,即第一次烧写存储在DS1OTA的代码放在DS2。下一次OTA的代码会放在DS1。相关的函数为

fw_upgrade_switch_active_ds

所以,在存放用户数据的时候,需要考虑到OTA代码写入的时候,如果OTA代码比较大,可能会擦除掉用户数据。OTA的在擦除的时候也是按照sector来进行的,并不是整个flash擦除,可以参考libraries/fw_upgrade_lib/fw_upgrade.c中的代码。

在写入数据之后,建议对设备多次进行OTA,然后读取用户数据,测试数据是否被擦除。

0 点赞

好的,谢谢!

我们这边会测试下。

0 点赞