707 psram使用说明
📎 原始文档:https://www.kdocs.cn/l/cfecSEWArhO6 707 psram使用说明
701 psram 常见接口,同样适用于707 sdk 701 PSRAM 常见接口.otl
- 使能和供电配置
(1)使能
sdk配置中打开 TCFG_PSRAM_DEV_ENABLE或在JLstudio 配置 ,容量根据实际大小,内封psram 一般为2MB,可以在JLstudio里面配置。
(2)供电脚配置
AC7074A7S带psram的芯片使用pb5供电,其他芯片使用fspg2供电;
注意检查供电口是否被复用。
如果供电方式不对,或供电口被复用导致供电异常,上电将触发ASSERT(psram_id !=0) 断言
- 低功耗
(1)进入低功耗
Psram 申请的buf均释放时,低功耗psram掉电;
若psram存在数据,则进入stanby模式,额外增加约50uA左右的功耗(不同PSRAM、不同温度情况下功耗有差异);
退出低功耗 通过malloc_psram接口申请内存时,若psram处于低功耗状态(power_down/stanby),则psram将退出低功耗。
直接读/写/操作psram地址段,不能使psram退出低功耗使用注意事项
cache与nocache Cache地址段0x08000000~(0x08000000+psram size)
No cache地址的0x04000000~(0x04000000+psram size)
地址转换接口
void *psram_cache_2_nocache(void *p);
void *psram_nocache_2_cache(void *p);
原则上,nocache段的数据与cache段数据是对应的,
即地址0x08000000的数据与0x04000000的数据对应到同一个物理存储。
Cpu读/写psram数据,必须cache地址段访问。
Dma/gpu/dbi可以通过cache地址段和nocache地址段访问数据。
通过nocache访问时减少数据cache时间,读取速度会快一些。
如果一段数据需要被cache和nocache段交叉读写时,需要做好cache同步,避免cache数据与外存数据不一致导致数据异常。
可以通过下述两个接口将数据同步回外存(psram)。
void psram_flush_cache(void *begin, u32 len);
将数据同步到外存,下一次访问cache数据时不需要重新load。
一般用于cache数据写入后,nocache操作前。将数据从cache同步回物理介质。避免nocache操作访问到未被更新的数据。(同步到外存会有时间开销)
void psram_flush_invaild_cache(void *begin, u32 len);
将所有数据同步到psram,并使cache数据失效,下一次访问时,将重新从psram中load数据到cache;
nocache地址段操作前,调用该接口先同步数据到外存,并使数据失效。Nocache操作后,再进行cache操作时,数据会从物理介质中重新加载到cache。
psram写入优化 ①数据写入sram的速度快于写入psram;
②nocache数据不需要经过cache,读写速度快于cache数据;
③dma可与cpu并行拷贝数据且dma支持访问nocache数据;
基于上述三点,可以将数据(分块)写入sram,再经dma加载到psram上。优化psram写入。碎片问题 Psram不带mmu管理,存在内存碎片导致申请不到大块内存的风险,特别是在多页面特效的场景下。
(4) 时钟配置
开发板使用外置psram 时钟,跑96Mhz (顶板外挂考虑降频) 。 内封的psram 如7072s ,7074A7S等跑144M
#define TCFG_PSRAM_INIT_CLK (144* 1000000) //144Mhz
- JLUI变量存psram 在lib_jlui_config.c中,可以指定模块优先使用psram
- 页面合成到psram
- 从psram推屏
7.变量,数组 定义在psram
1、放入 .psram_data 段(已初始化的数据):attribute((section(".psram_data"))) u32 nandflash_g_capacity = 0;
2、放入 .psram_bss 段(未初始化的数据):attribute((section(".psram_bss"))) u32 psram_var;
3、放入 .psram_noinit 段(不需要初始化的数据):attribute((section(".psram_noinit"))) u32 psram_noinit_var;
这样测试,应该在 0x8000000 之后