在之前的学习中,一直用外部SPI Flash存放字库文件,之前的数据下载方法是用SD卡拷贝到SPIFLASH中,一直觉得在开发板上学习还算方便,如果在项目中应用,不是很方便,偶然机会,发现ST官方工具STM32 ST-LINK Utility可对外部SPIFLASH直接进行读写。于是尝试在原子精英板STM32 ST-LINK U上进行实验,并成功将字库文件下载到外部SPIFLASH,现把实现方法分享出来,方便大家共同学习,不完善之处还请多多指教!
平台:原子精英开发板(SPIFLASH芯片型号W25Q128),STM32F103,ST-LINK/V2
准备工作
1. 官网或社区下载软件STM32 ST-LINK Utility v4.2.0 setup.exe,并安装
2. W25Q128_STM32F1_Elite.stldr文件制作
源码见附件,该文件需要根据自己的硬件平台做出相应的修改
3.将制作好的文件放在 安装目录\STMicroelectronics\STM32 ST-LINKUtility\ST-LINK Utility\ExternalLoader下
4.添加LOADER文件
5.在ExternalLoader菜单先对外部SPIFLASH进行读、写、擦除等操作。
源码可从我的资源中下载
定义存储区信息
struct StorageInfo const StorageInfo = {
"W25Q128_STM32F1xx", // Device Name + version number
SPI_FLASH, // Device Type
0x00000000, // Device Start Address
0x01000000, // Device Size in Bytes (16MBytes/128Mbits)
256, // Programming Page Size 256Bytes
0xFF, // Initial Content of Erased Memory
4096, 0, // Sector Size: 4KBytes
SECTOR_END // SECTOR_END
};
声明读函数
int Read (uint32_t Address, uint32_t Size, uint8_t* buffer)
{
sFLASH_ReadBuffer(buffer, Address, Size);
return 1;
}
声明写函数
int Write (uint32_t Address, uint32_t Size, uint8_t* buffer)
{
sFLASH_WriteBuffer(buffer, Address, Size);
return 1;
}
声明擦除函数
int MassErase (void)
{
sFLASH_EraseBulk();
return 1;
}
声明扇区擦除函数
int SectorErase (uint32_t EraseStartAddress ,uint32_t EraseEndAddress)
{
EraseStartAddress = EraseStartAddress - EraseStartAddress%0x10000;
while (EraseEndAddress>=EraseStartAddress)
{
sFLASH_EraseSector(EraseStartAddress);
EraseStartAddress += 0x10000;
}
return 1;
}
声明更新函数
int Verify (uint32_t MemoryAddr, uint32_t RAMBufferAddr, uint32_t Size)
{
uint32_t VerifiedData = 0;
uint8_t TmpBuffer = 0x00;
Size*=4;
while (Size>VerifiedData)
{
sFLASH_ReadBuffer(&TmpBuffer, MemoryAddr+VerifiedData, 1);
if (TmpBuffer != *((uint8_t*)RAMBufferAddr+VerifiedData))
return MemoryAddr+VerifiedData;
VerifiedData++;
}
return 0;
}
声明:文章内容为原创,曾在其他论坛发表过。