Re: 關於內部Nonvolatile Memory讀寫的問題 SAMC21N18A
|
||||
---|---|---|---|---|
管理員
|
您好, 首先 RWWEE 與 Flash Emulated EEPROM 的確如您所描述的分屬於不同的區塊, 但都歸類在 NVMCTRL的管轄之下, 這裡有兩篇 APP note相信對於您理解他們之間的區別及應用有很大的幫助
https://ww1.microchip.com/downloads/en ... plicationNote_AT10931.pdf https://ww1.microchip.com/downloads/en ... 3974_Application-Note.pdf 由於 NOR Flash 的特性, 無法如同真正的 EEPROM 達到單一Byte的擦除及寫入, 在32位元的MCU中, 若想擁有一塊特定的非揮發性記憶體區塊, 但是不想額外設計製程容量密度比不同且不一定會用到的的 EEPROM 在 Memory 中時, 通常會使用 Flash 來實現 EEPROM 以達到應用上折衷的需求. RWWEE 又比 Flash Emulated EEPROM 更接近 EEPROM 的使用情境, 因為當程式在Flash執行時, 可以同時對 RWWEE 進行寫入操作. 因此這只能說使用 Flash 來達成的"類"EEPROM 的功能.
發表於: 2023/11/20 11:41
Edited by Libra on 2023年11月21日 09:31:51
|
|||
|
Re: 關於內部Nonvolatile Memory讀寫的問題 SAMC21N18A
|
||||
---|---|---|---|---|
管理員
|
關於 __attribute__ 請參閱 XC32 compiler for SAM/PIC32C 說明
P124 8.11 VARIABLE ATTRIBUTES https://ww1.microchip.com/downloads/en ... 2_PICC_UG_DS50002895A.pdf 關於程式碼 : #define NVMCTRL_FLASH_ROWSIZE (256U) const uint8_t nvm_user_start_address[NVMCTRL_FLASH_ROWSIZE] __attribute__((aligned(NVMCTRL_FLASH_ROWSIZE),keep,externally_visible,space(prog)))= {0}; 幾本上的解讀為宣告一個矩陣 nvm_user_start_address 空間大小為 256 Bytes 256byte 是內部 NVMFlash的Row erase size, aligned用來指定該矩陣所對齊的地址, 也就是起始位址, 即 0x100 keep, externally_visible 用來避免compiler將之忽視, 並且宣告為外部可以參照到的記憶體位址 space(prog) 宣告該矩陣變數所在位址為 Internal Flash(Programming Memory) 簡單來說, 就是在程式記憶體(Flash)中預留一塊大小為256 bytes的空間, 用來進行Flash的讀寫存取. 好處是, 該Flash空間可以隨著程式燒錄時一併預留下來, 而且還是可以直接寫程式定址的一個矩陣. 壞處是, 如果重新燒錄程式時, 就會被一併Erase, 因為該空間屬於程式定址範圍內的區域.
發表於: 2023/8/25 13:54
|
|||
|
Re: 關於內部Nonvolatile Memory讀寫的問題 SAMC21N18A
|
||||
---|---|---|---|---|
新會員
|
具我印象所知,你問的三個宣告應該如下。
詳細說明可以參考Compiler User’s Guide (google一下就可以找到) __attribute__((keep)) 可以應用於函數。 keep 屬性將 使用 --gc-sections 防止Linker時刪除該函數,即使它是 沒用過。 externally_visible,宣告成外部可見的變數或函數 space(prog),宣告使用的是 prog的這個區塊
發表於: 2023/8/21 18:41
|
|||
|
關於內部Nonvolatile Memory讀寫的問題 SAMC21N18A
|
||||
---|---|---|---|---|
新會員
|
Dear Microchip Team,
最近再練習MCU內部Memory讀寫的功能,參考了\HarmonyFramework\csp_apps_sam_c20_c21\apps\nvmctrl\ 裡的兩個範例。 兩個範例在宣告記憶體空間的方式不太一樣~ nvmctrl_flash_read_write 中的宣告方式 // Define a constant array in Flash. // It must be aligned to row boundary and size has to be in multiple of rows const uint8_t nvm_user_start_address[NVMCTRL_FLASH_ROWSIZE] __attribute__((aligned(NVMCTRL_FLASH_ROWSIZE),keep,externally_visible,space(prog)))= {0}; 執行後,使用ICD4回讀整個記憶體的資料,發現寫入的位址是0x1200,但範例程式中並沒有任何起始位址的定義,請問在這樣的情況下,是否就由compiler自行分配位址呢? 在nvmctrl_flash_read_while_write 中的宣告方式 const uint8_t nvm_user_start_address[NVMCTRL_FLASH_ROWSIZE] __attribute__((address(NVMCTRL_FLASH_START_ADDRESS+0x20000),keep,externally_visible,space(prog)))= {0}; 這裡就有定義執行位址NVMCTRL_FLASH_START_ADDRESS+0x20000, 如果未來想自己定義起始位置,是否可以使用下面的方式宣告呢? const uint8_t nvm_user_start_address[NVMCTRL_FLASH_ROWSIZE] __attribute__((aligned(NVMCTRL_FLASH_ROWSIZE),address(NVMCTRL_FLASH_START_ADDRESS+0x20000) ,keep,externally_visible,space(prog)))= {0}; 最後,是否有大師知道__attribute__中 keep, externally_visible, space(prog) 這三個關鍵詞的功能是什麼? 謝謝~
發表於: 2023/8/8 10:42
|
|||
|