關(guān)于ch32v208的flash相關(guān)疑問

我看了一下ble的ota 的app代碼,其中LD配置為

FLASH (rx) : ORIGIN = 0x00004000, LENGTH = 216K

RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K

三個(gè)區(qū)域放滿了448K (0x08000000 ~ 0x08070000)

/* FLASH定義 */

#define FLASH_PAGE_SIZE? ? ? ? 256

#define FLASH_BLOCK_SIZE? ? ? ?4096

#define IMAGE_SIZE? ? ? ? ? ? ?216 * 1024


/* imageIAP定義 */

#define IMAGE_IAP_FLAG? ? ? ? ?0x03

#define IMAGE_IAP_START_ADD? ? 0x08000000

#define IMAGE_IAP_SIZE? ? ? ? ?16 * 1024


/* imageA定義 */

#define IMAGE_A_FLAG? ? ? ? ? ?0x01

#define IMAGE_A_START_ADD? ? ? (IMAGE_IAP_START_ADD + IMAGE_IAP_SIZE)

#define IMAGE_A_SIZE? ? ? ? ? ?IMAGE_SIZE


/* imageB定義 */

#define IMAGE_B_FLAG? ? ? ? ? ?0x02

#define IMAGE_B_START_ADD? ? ? (IMAGE_A_START_ADD + IMAGE_SIZE)

#define IMAGE_B_SIZE? ? ? ? ? ?IMAGE_SIZE


那重點(diǎn)問題來了 ,LD中配置的是64K,那falsh只有448K才對(duì)呀,這個(gè)OTA_DATAFLASH_ADD的位置不是超出448K了嗎

因?yàn)槲遗渲玫氖?4K的RAM那從下圖中看,可變映射區(qū)確實(shí)是RAM,那flash就是最大448K,0x08077000這個(gè)位置理論上是越界了呀

/* 存放在DataFlash地址,不能占用藍(lán)牙的位置 */

#define OTA_DATAFLASH_ADD? ? ? 0x08077000


image



熱門產(chǎn)品 : USB3.0 HUB控制器:CH634

還有個(gè)問題,我看OTA_DATAFLASH_ADD這個(gè)地址是用的FLASH_ErasePage_Fast函數(shù)去擦除,

這個(gè)函數(shù)是不是代表著這塊flash是零等待flash區(qū),那么我應(yīng)該怎么區(qū)分和判斷哪個(gè)區(qū)域是零等待,哪個(gè)區(qū)域是非零等待




我看了那個(gè)圖的理解是Flash最大大小和RAM最大值不能使用超過512K,那按上述flash用了480K,RAM是64K,那就超過了512K,所以是我不理解的地方

好像圖片打不開,可以看這個(gè)連接的圖片

https://www.cnblogs.com/iot-fan/p/16667833.html


OTA_DATAFLASH_ADD的位置不是超出448K了嗎
CH32V208的flash總量是480K,這個(gè)位置在476K,正常的。由于V208沒有類似CH5Xx的藍(lán)牙MCU那樣劃分出codeflash與dataflash,如OTA升級(jí)標(biāo)志、BLE的配對(duì)綁定信息,都是被放在448K~480K這32K區(qū)域內(nèi)的。


FLASH_ErasePage_Fast
接口函數(shù)中“_Fast”的含義:調(diào)用這個(gè)擦除接口的代碼,本身一定要在零等待flash中。見RM手冊(cè)32.2章節(jié)。如果不在零等待flash中執(zhí)行該擦除接口,會(huì)跑卡住。該接口擦除的目標(biāo)頁,在零等待flash/非零等待flash中,均可。


“怎么區(qū)分和判斷哪個(gè)區(qū)域是零等待,哪個(gè)區(qū)域是非零等待”

編譯后檢查list文件,如果函數(shù)是存放在0x00...起始的區(qū)域,是存放在零等待flash中(函數(shù)定義上方,用highcode修飾后,該函數(shù)優(yōu)先被存放于零等待flash中)。見V208的DS0手冊(cè)2.3章節(jié)。


按上述flash用了480K,RAM是64K,那就超過了512K”

見V208的DS0手冊(cè)2.3章節(jié),ram/零等待/非零等待flash,三者的區(qū)域是獨(dú)立劃分的,沒有毗鄰。

零等待flash+ram的配置,在燒錄工具中選配,0x00...地址起始,與0x08...起始的480K的非零等待flash量獨(dú)立開了。

非零等待flash總量是480K不變。

零等待與零等待flash之間的聯(lián)系:零等待flash中的內(nèi)容,是由MCU在上電后,從非零等待flash中自動(dòng)拷貝過去的,拷貝完成后,直接在零等待區(qū)運(yùn)行相應(yīng)代碼(非零等待區(qū)的代碼可以視作“備份”)。


非常感謝您的解答,上述問題,我都能理解了,但還有以下兩個(gè)疑問

關(guān)于highcode 修飾問題,

我看了LD中設(shè)置為 FLASH (rx) : ORIGIN = 0x00004000, LENGTH = 216K

但是highcode 定義的是這216K的flash區(qū)域

? ? ?.highcode :?

? ? {

? ? ? ? . = ALIGN(4);

? ? ? ? *(.highcode);

? ? ? ? *(.highcode.*);

. = ALIGN(4);?

? ? } >FLASH AT>FLASH


那是否會(huì)存在問題:

  1. ch32v208芯片只有128k的零等待flash(64KRAM的情況下),那么216k的代碼都是用highcode標(biāo)識(shí),有112K(128k-??0x00004000)的代碼存在于零等待區(qū)域,還有104k的代碼存在于非零等待。我怎么能保證highcode標(biāo)識(shí)的代碼都會(huì)在零等待區(qū)域

  2. LD中設(shè)置為 FLASH (rx) : ORIGIN = 0x00004000, LENGTH = 216K 按這個(gè)配置,是不是216k的代碼都會(huì)存放在0x00...起始的區(qū)域內(nèi)



那就是說我FLASH_ErasePage這個(gè)函數(shù)也應(yīng)該highcode修飾,把他放在零等待flash上才行


只有登錄才能回復(fù),可以選擇微信賬號(hào)登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频