之前已经有L476 F7 QSPI扩展RAM,内存映射后只读不能写,当然有他的用处,不过不能写就很麻烦了,程序是动态的,数据会变化,不能写的内存映射即便芯片是RAM类型,也只能当FLash用,还贵。因此我探索了一番OCTO SPI 接口 驱动 四线SPI psRAM。 ' r |2 N/ S. H0 W, F $ U: \3 e0 N8 i! g+ q9 V 5 i: a& m/ M. M. O3 R # L4R5扩展板外扩串行SPI RAM ## L4R5 OSPI特点8 V3 M# ]$ a( {. }! I E. k Q* v2 O * 内存映射 * 可以直接读写(与操作内部RAM无异) * 引脚少,本例6个脚, ?: }& h' u& S6 h * 速度问题有待测试 >>> 可用于LCD显示缓存,操作系统heap) h$ c, f5 l1 Q# q ## 软件环境, {& l7 ^9 Y: H V0 K: J1 d% R * STM32CubIDE 1.4 * STM32CubeMX 6.07 Y: Y9 @+ l: V$ Z7 I+ b9 j 1 r' |. L: `! i c3 F! Y& E" N ## 硬件环境 * Nucleo L4R53 L' H! T. U9 d# @+ k: ] * 本人自制扩展板 带8MB psRAM + M* i+ e8 ]* @7 H/ ? ## 主程序代码$ [! k3 D/ F6 g* `6 E) d ! I3 z& s$ h4 d2 H$ Q/ g psRAM_Reset();+ H+ N6 h+ a4 F% f4 L% W if( psRAM_ReadID() != 0x0D )$ y% J0 o$ d! O* ? {9 a: R8 d. W/ G) q6 m- ?8 m" }! W Error_Handler(); } psRAM_Read(r_buf, 0, 4); psRAM_Write( (uint8_t *)"ABCD", 0, 4);& E( B5 s' S9 v4 K4 ^0 I psRAM_Read(r_buf, 0, 4);( B' w& _3 ]$ [) m, A$ s4 i/ \ EnableMemMapped();+ _9 e' ~7 N% c4 k8 S uint8_t *p = (uint8_t *)0x70000000;$ y& t* W1 m: a1 `, \ // memset(p, 0, 8*1024*1024); for(uint32_t i=0; i<8*1024*1024;i++)9 P+ n7 I( `+ |! U0 h; ~# i {- N( D& I4 t# F# v! ^; q) h! X& a/ o *p = (uint8_t)i;2 W& A. V0 b- l1 J& y+ _% n! m( u p++;( W; y0 O1 S" ~$ W6 q }, n" r5 \7 f: Y+ D/ L/ D6 _' a: Q ## 结果 * X5 e+ ~0 |$ A& h; Q) `' I: e * 最后有一部分内存出现了问题,后续测试速度,稳定性 . ]& t! K' x3 X* V# V |
OSPI 扩展一个psRAM,一个nor Flash,就有了8M外部RAM,32M外部Flash(W25Q128)。nuc L4R5 OSPI 速度上最快86MHZ. |
支持一下 |
厉害了厉害了) e, w: Z, F- Y |
厉害了 |