在这自己做了基于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;
} |