一 硬件准备
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) ;