2.14. XIP FLASH 设备¶
2.14.1. 简介¶
XIP:eXecute In Place,即芯片内执行,指应用程序可以直接在 flash 闪存内运行,不必再把代码读到系统 RAM 中。所谓片内执行并不是说程序在存储器内执行,CPU的基本功能是取指、译码、执行,存储器访问,写回。通常我们使用 Nor Flash,Nor Flash能在芯片内执行,指的是 CPU 能够直接从Nor flash 中取指令,供后面的译码器和执行器来使用。
博流系列芯片拥有 XIP FLASH 控制器,并且支持内存映射,BL702/BL704/BL706 的逻辑地址为 0x23000000,最大可支持 8M 的 nor flash。不仅如此,映射的实际物理 flash 地址是可以修改的,举例来说,假设一个 nor flash 大小为 1M,如果应用程序烧录在 flash 物理地址 0,那么就可以将逻辑地址映射到 0 地址,如果应用程序烧录在 flash 物理地址 x,那么就可以将逻辑地址映射到 x 地址,而逻辑地址可以保持不变,一直是 0x23000000,省去了修改 ld 文件的麻烦。
下图演示三块应用程序映射地址分布:

2.14.2. XIP FLASH 设备接口¶
2.14.2.1. flash_init¶
flash_init
用于初始化 flash 控制器。
BL_Err_Type flash_init(void);
return 错误码,0 表示成功,其他表示错误
2.14.2.2. flash_read_jedec_id¶
flash_read_jedec_id
用于获取 flash id。
BL_Err_Type flash_read_jedec_id(uint8_t *data);
data 存储 flash id 的指针,大小 4 字节
return 错误码,0 表示成功,其他表示错误
2.14.2.3. flash_erase¶
flash_init
用于 flash 扇区擦除。
BL_Err_Type flash_erase(uint32_t startaddr, uint32_t len);
startaddr 要擦除的 flash 物理起始地址
len 擦除扇区长度,单位
return 错误码,0 表示成功,其他表示错误
2.14.2.4. flash_write¶
BL_Err_Type flash_write(uint32_t addr, uint8_t *data, uint32_t len);
addr 要写入的 flash 物理起始地址
data 写入数据指针
len 写入长度
return 错误码,0 表示成功,其他表示错误
2.14.2.5. flash_read¶
BL_Err_Type flash_read(uint32_t addr, uint8_t *data, uint32_t len);
addr 要读取的 flash 物理起始地址
data 读入数据指针
len 读取长度
return 错误码,0 表示成功,其他表示错误
2.14.2.6. hal_jump2app¶
void hal_jump2app(uint32_t flash_offset);
flash_offset 要跳转的 flash 物理地址,即烧录新应用程序的物理地址
错误
以上地址均为 flash 物理地址,不可以填入内存映射地址,比如0x23000000。