CC2541 flash 操作問題
我有在網上找到一些資訊,發現flash可以被osal_snv_read()與osal_snv_write()操作,我使用下列的程序可以正確讀寫page 0x80的一個byte
#define PG_ID 0x80
static uint8 test=0;
osal_snv_read(PG_ID, sizeof(test), &test);
osal_snv_write(PG_ID, sizeof(test), &test);
請問這樣如何用smartRF programmer外部寫入同一個address呢??(這邊指的是對page 0x80操作)
函数的第一个变量不是page ID. 而是SNV ID. 所以你不是对page 0x80. 而是一个NV_ID为0x80的item进行操作的。
// Device NV Items - Range 0 - 0x1F
#define BLE_NVID_IRK 0x02 //!< The Device's IRK
#define BLE_NVID_CSRK 0x03 //!< The Device's CSRK
#define BLE_NVID_SIGNCOUNTER 0x04 //!< The Device's Sign Counter
// Bonding NV Items - Range 0x20 - 0x5F - This allows for 10 bondings
#define BLE_NVID_GAP_BOND_START 0x20 //!< Start of the GAP Bond Manager's NV IDs
#define BLE_NVID_GAP_BOND_END 0x5f //!< End of the GAP Bond Manager's NV IDs Range
// GATT Configuration NV Items - Range 0x70 - 0x79 - This must match the number of Bonding entries
#define BLE_NVID_GATT_CFG_START 0x70 //!< Start of the GATT Configuration NV IDs
#define BLE_NVID_GATT_CFG_END 0x79 //!< End of the GATT Configuration NV IDs
// Customer NV Items - Range 0x80 - 0x8F - This must match the number of Bonding entries
#define BLE_NVID_CUST_START 0x80 //!< Start of the Customer's NV IDs
#define BLE_NVID_CUST_END 0x8F //!< End of the Customer's NV IDs
目前的机制中,flash使用了125和126两页,你写的数据可能在这两页的任何位置。
謝謝TY回覆,再請教。
任何位置的意思是,我每次呼叫osal_snv_write(),被寫入的address都會改變嗎? 還是寫入絕對位置?
我查到資料表示page與address的關係,好像是 (page* 2048) / 4 = address,這個對嗎?
若假設今天我寫入的address為 (125*2048) /4 =64000 = 0xFA00 ,要如何使用SmartRF Flash Programmer這此address進行燒錄呢?
你应该参考和使用更底层的接口
HalFlashRead 或HalFlashWrite
他们可以对应你说的page和address.
用osal_snv接口则已经是封装过了。因为flash同一地址不能连续写,必须擦除再写。osal_nv用了一套时间换空间的做法。,你可仔细读下代码。
FlashProgrammer应该是做不了对指定地址操作的。当然,你熟悉hex格式,自己构造一个hex file,可能可以做到你要的功能。
謝謝TY回覆,依照您提到的【当然,你熟悉hex格式,自己构造一个hex file,可能可以做到你要的功能。】
這個意思是我先找一個絕對的flash物理address,然後用FlashProgrammer利用裏頭的read flash into hex-file功能讀出,後去對hex file做修改再燒錄這個修改過的hex file嗎? 會有此一問是因為我先前已有詢問過類似的問題,有高人回覆這個解答,如下
題外一問,所以osal_snv_write(),這個寫入的方式是找一個不固定的address寫入,若要讀取此address可以透過ID去對應找出嗎?那是否有可能每次寫入的address都不相同? 若如此萬一page 125, 126使用完畢的話,會造成問題嗎? 還是有可能寫入重複的address,只是讀寫都依靠ID去mapping罷了?
1. 不,我的意思是,你不一定需要读,你的hex文件就只要包含你需要修改的那几行就行。
2. 没有直接的接口,但你可以看看osal_snv_read的实现,offset和activepg就是。
uint8 osal_snv_read( osalSnvId_t id, osalSnvLen_t len, void *pBuf )
{
uint16 offset = findItem(activePg, pgOff, id);
if (offset != 0)
{
HalFlashRead(activePg, offset, pBuf, len);
return SUCCESS;
}
return NV_OPER_FAILED;
}
感謝TY回覆
1. 您的意思是把專案中的hex file直接打開,找到你用HalFlashWrite寫入的絕對位置並進行修改後,再燒入裝置嗎? 這樣是省去從flash中讀出的動作沒錯。
可我也不知道為何讀不出flash,如下圖
2. osal_snv_read與osal_snv_write看起來像是自己會記錄address,並offset,做為下一次read/write參考用,不知道我有沒有理解錯?