KEIL下基于STM32F407 的W25Q16 下载算法分享

2019-07-20 01:59发布

本帖最后由 qiousanxi 于 2018-11-16 11:13 编辑

在这自己做了基于F407 W25Q16 的下载算法,
给大家分享下源码,
H750 的QSPI也是类似的,使用了内存映射就可以运行程序的,集体看ST给的HAL 例程 很详细的

其他的东西具体可以看源码。
这里给大家说几个东西,
1.MDK默认使用的Code/Const 存放的地方在0x90000000, 所以在sct文件里面修改一下,没有使用的数据会被优化掉
原文件
LR_IROM1 0x08000000 0x00080000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00080000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x20000000 0x00020000  {  ; RW data
   .ANY (+RW +ZI)
  }
}

LR_ROM1 0x90000000 0x00200000  {
  ER_ROM1 0x90000000 0x00200000  {  ; load address = execution address
    test.o (+RO)
   .ANY (+RO)
  }
}


修改后:
LR_IROM1 0x08000000 0x00080000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00080000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x20000000 0x00020000  {  ; RW data
   .ANY (+RW +ZI)
  }
}

LR_ROM1 0x90000000 0x00200000  {
  ER_ROM1 0x90000000 0x00200000  {  ; load address = execution address
    test.o (+RO)
  }
}


2.下载算法的空间尽量弄大一些

3.读取数据时, 因为TEXTSPI 的地址是 0x90000000  所以要获取真实地址W25QXX_Read(datatemp,(u32)TEXTSPI,SIZE);                                        //
void W25QXX_Read(u8* pBuffer,u32 ReadAddr,u16 NumByteToRead)   
{
         u16 i;
        u32 __ReadAddr = 0;        
        
        __ReadAddr = ReadAddr & 0xffffff;         //获取真实地址
                                                                                            
        W25QXX_CS=0;                            //使能器件   
    SPI1_ReadWriteByte(W25X_ReadData);         //发送读取命令   
    SPI1_ReadWriteByte((u8)((__ReadAddr)>>16));  //发送24bit地址   
    SPI1_ReadWriteByte((u8)((__ReadAddr)>>8));   
    SPI1_ReadWriteByte((u8)__ReadAddr);   
    for(i=0;i<NumByteToRead;i++)
        {
        pBuffer=SPI1_ReadWriteByte(0XFF);   //循环读数  
    }
        W25QXX_CS=1;                                                   
}  

链接:https://pan.baidu.com/s/1IJpk3LyhMAw8DLu__3A6mw
提取码:1804
补充一个:
void W25QXX_FastRead(u8* pBuffer,u32 ReadAddr,u16 NumByteToRead)   
{
         u16 i;
        u32 __ReadAddr = 0;
       
        __ReadAddr = ReadAddr & 0xffffff;
                                                                                            
        W25QXX_CS=0;                                    //使能器件   
    SPI1_ReadWriteByte(W25X_FastReadData);       //发送读取命令   
    SPI1_ReadWriteByte((u8)((__ReadAddr)>>16));  //发送24bit地址   
    SPI1_ReadWriteByte((u8)((__ReadAddr)>>8));   
    SPI1_ReadWriteByte((u8)__ReadAddr);  
        SPI1_ReadWriteByte(W25X_Dummy);
       
    for(i=0;i<NumByteToRead;i++)
        {
        pBuffer=SPI1_ReadWriteByte(0XFF);   //循环读数  
    }
        W25QXX_CS=1;                                                   
}  

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。