一 硬件准备
1, Air103 核心板, 完美兼容 W806, 预留 PSRAM 焊盘, 9. 9 元包邮
2, LY68L6400, 64M bit PSARM 芯片
二 CDK
1, 使能 PSRAM 时钟
__HAL_RCC_PSRAM_CLK_ENABLE () ;
(#define __HAL_RCC_PSRAM_CLK_ENABLE () SET_BIT (RCC-" CLK_EN, RCC_CLK_EN_QSRAM) )
2, 复用 PSRAM io, 采用 QSPI 模式
__HAL_AFIO_REMAP_PSRAM_CS (GPIOB, GPIO_PIN_27) ;
__HAL_AFIO_REMAP_PSRAM_CLK (GPIOA, GPIO_PIN_15) ;
__HAL_AFIO_REMAP_PSRAM_MISO (GPIOB, GPIO_PIN_3) ;
__HAL_AFIO_REMAP_PSRAM_MOSI (GPIOB, GPIO_PIN_2) ;
__HAL_AFIO_REMAP_PSRAM_D2 (GPIOB, GPIO_PIN_4) ;
__HAL_AFIO_REMAP_PSRAM_D3 (GPIOB, GPIO_PIN_5) ;
(#define __HAL_AFIO_REMAP_PSRAM_CS (__HANDLE__, __IOPOSITION__) do{ \
if ( (__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_27) ) \
{ \
__AFIO_REMAP_SET_OPT1 (__HANDLE__, __IOPOSITION__) ; \
} \
}while (0)
if ( (__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_15) ) \
{ \
__AFIO_REMAP_SET_OPT1 (__HANDLE__, __IOPOSITION__) ; \
} \
}while (0)
if ( (__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_3) ) \
{ \
__AFIO_REMAP_SET_OPT4 (__HANDLE__, __IOPOSITION__) ; \
} \
}while (0)
if ( (__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_2) ) \
{ \
__AFIO_REMAP_SET_OPT4 (__HANDLE__, __IOPOSITION__) ; \
} \
}while (0)
if ( (__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_4) ) \
{ \
__AFIO_REMAP_SET_OPT4 (__HANDLE__, __IOPOSITION__) ; \
} \
}while (0)
if ( (__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_5) ) \
{ \
__AFIO_REMAP_SET_OPT4 (__HANDLE__, __IOPOSITION__) ; \
} \
}while (0) )
3, PSRAM 初始化, 可以参照 W800 初始化程序, 下面是我修改的, 也可以直接用
typedef volatile unsigned int TLS_REG;
static __inline void tls_reg_write32 (unsigned int reg, unsigned int val)
{
* (TLS_REG *) reg = val;
}
static __inline unsigned int tls_reg_read32 (unsigned int reg)
{
unsigned int val = * (TLS_REG *) reg;
return val;
}
void psram_init (void)
{
value = tls_reg_read32 (HR_PSRAM_CTRL_ADDR) ;
printf ("HR_PSRAM_CTRL_ADDR-1 %d\r\n ", value) ;
value |= 0x03;
tls_reg_write32 (HR_PSRAM_CTRL_ADDR, value) ;
do{
value = tls_reg_read32 (HR_PSRAM_CTRL_ADDR) ;
}while (value&0x01) ;
value = 0xfffff000;
tls_reg_write32 (HR_PSRAM_CTRL_ADDR, value) ;
value = (tls_reg_read32 (HR_PSRAM_CTRL_ADDR) &0xffffff0f) | 0x40;
tls_reg_write32 (HR_PSRAM_CTRL_ADDR, value) ;
value = (tls_reg_read32 (HR_PSRAM_CTRL_ADDR) &0xfffff8ff) | 0x600;
tls_reg_write32 (HR_PSRAM_CTRL_ADDR, value) ;
value = (tls_reg_read32 (HR_PSRAM_CTRL_ADDR) &0xffffffff) | 0x040 | 0x002;
tls_reg_write32 (HR_PSRAM_CTRL_ADDR, value) ;
value = (tls_reg_read32 (HR_PSRAM_OVERTIMER_ADDR) &0xfffff000) | 0x800;
tls_reg_write32 (HR_PSRAM_OVERTIMER_ADDR, value) ;
}
4, 函数中验证
定义 unsigned int *membase = (unsigned int ) (0x30000000) ;
for (num=0; num "1024; num++) //每个数据 4 字节, 每 1024*2*4 个内存写一个数, 1024 次为 8Mbyte, 再读出来 printf 至电脑.
{
membase[1024*2*num]=1024*2*num;
HAL_Delay (10) ;
printf ("%d w-r %d %d ", num, 1024*2*num, membase[1024*2*num]) ;
printf ("\r\n") ;
}
HAL_Delay (1000) ;
for (num=0; num "1024; num++)
{
HAL_Delay (10) ;
printf ("%d r-r %d %d ", num, 1024*2*num, membase[1024*2*num]) ;
printf ("\r\n") ;
}
HAL_Delay (1000) ;