关于ch32v208的flash相关疑问

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

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

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

三个区域放满了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


那重点问题来了 ,LD中配置的是64K,那falsh只有448K才对呀,这个OTA_DATAFLASH_ADD的位置不是超出448K了吗

因为我配置的是64K的RAM那从下图中看,可变映射区确实是RAM,那flash就是最大448K,0x08077000这个位置理论上是越界了呀

/* 存放在DataFlash地址,不能占用蓝牙的位置 */

#define OTA_DATAFLASH_ADD      0x08077000


image


还有个问题,我看OTA_DATAFLASH_ADD这个地址是用的FLASH_ErasePage_Fast函数去擦除,

这个函数是不是代表着这块flash是零等待flash区,那么我应该怎么区分和判断哪个区域是零等待,哪个区域是非零等待




我看了那个图的理解是Flash最大大小和RAM最大值不能使用超过512K,那按上述flash用了480K,RAM是64K,那就超过了512K,所以是我不理解的地方

好像图片打不开,可以看这个连接的图片

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


OTA_DATAFLASH_ADD的位置不是超出448K了吗
CH32V208的flash总量是480K,这个位置在476K,正常的。由于V208没有类似CH5Xx的蓝牙MCU那样划分出codeflash与dataflash,如OTA升级标志、BLE的配对绑定信息,都是被放在448K~480K这32K区域内的。


FLASH_ErasePage_Fast
接口函数中“_Fast”的含义:调用这个擦除接口的代码,本身一定要在零等待flash中。见RM手册32.2章节。如果不在零等待flash中执行该擦除接口,会跑卡住。该接口擦除的目标页,在零等待flash/非零等待flash中,均可。


“怎么区分和判断哪个区域是零等待,哪个区域是非零等待”

编译后检查list文件,如果函数是存放在0x00...起始的区域,是存放在零等待flash中(函数定义上方,用highcode修饰后,该函数优先被存放于零等待flash中)。见V208的DS0手册2.3章节。


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

见V208的DS0手册2.3章节,ram/零等待/非零等待flash,三者的区域是独立划分的,没有毗邻。

零等待flash+ram的配置,在烧录工具中选配,0x00...地址起始,与0x08...起始的480K的非零等待flash量独立开了。

非零等待flash总量是480K不变。

零等待与零等待flash之间的联系:零等待flash中的内容,是由MCU在上电后,从非零等待flash中自动拷贝过去的,拷贝完成后,直接在零等待区运行相应代码(非零等待区的代码可以视作“备份”)。


非常感谢您的解答,上述问题,我都能理解了,但还有以下两个疑问

关于highcode 修饰问题,

我看了LD中设置为 FLASH (rx) : ORIGIN = 0x00004000, LENGTH = 216K

但是highcode 定义的是这216K的flash区域

     .highcode : 

    {

        . = ALIGN(4);

        *(.highcode);

        *(.highcode.*);

. = ALIGN(4); 

    } >FLASH AT>FLASH


那是否会存在问题:

  1. ch32v208芯片只有128k的零等待flash(64KRAM的情况下),那么216k的代码都是用highcode标识,有112K(128k-  0x00004000)的代码存在于零等待区域,还有104k的代码存在于非零等待。我怎么能保证highcode标识的代码都会在零等待区域

  2. LD中设置为 FLASH (rx) : ORIGIN = 0x00004000, LENGTH = 216K 按这个配置,是不是216k的代码都会存放在0x00...起始的区域内



那就是说我FLASH_ErasePage这个函数也应该highcode修饰,把他放在零等待flash上才行


只有登录才能回复,可以选择微信账号登录