抽空参考我的实现例子,你这个做的略复杂,另外你的页编程大小怎么配置了个8K
这个是我的
[C] 纯文本查看 复制代码 /*
*********************************************************************************************************
*
* 模块名称 : FlashDev
* 文件名称 : FlashDev.c
* 版 本 : V1.0
* 说 明 : Flash配置
*
* 修改记录 :
* 版本号 日期 作者 说明
* V1.0 2020-11-06 Eric2013 正式发布
*
* Copyright (C), 2020-2030, 安富莱电子 [url]www.armfly.com[/url]
*
*********************************************************************************************************
*/
#include "FlashOS.H"
#ifdef FLASH_MEM
struct FlashDevice const FlashDevice = {
FLASH_DRV_VERS, /* 驱动版本,勿修改,这个是MDK定的 */
"ARMFLY_STM32H7x_QSPI_W25Q256", /* 算法名,添加算法到MDK安装目录会显示此名字 */
EXTSPI, /* 设备类型 */
0x90000000, /* Flash起始地址 */
32 * 1024 * 1024, /* Flash大小,32MB */
4 * 1024, /* 编程页大小 */
0, /* 保留,必须为0 */
0xFF, /* 擦除后的数值 */
1000, /* 页编程等待时间 */
6000, /* 扇区擦除等待时间 */
64 * 1024, 0x000000, /* 扇区大小,扇区地址 */
SECTOR_END
};
#endif
/***************************** 安富莱电子 [url]www.armfly.com[/url] (END OF FILE) *********************************/
[C] 纯文本查看 复制代码 /*
*********************************************************************************************************
* 函 数 名: ProgramPage
* 功能说明: 页编程
* 形 参: adr 页起始地址
* sz 页大小
* buf 要写入的数据地址
* 返 回 值: 无
*********************************************************************************************************
*/
int ProgramPage (unsigned long adr, unsigned long sz, unsigned char *buf)
{
int size;
int result = 0;
/* 地址要在操作的芯片范围内 */
if (adr < QSPI_FLASH_MEM_ADDR || adr >= QSPI_FLASH_MEM_ADDR + QSPI_FLASH_SIZES)
{
return 1;
}
/* W25Q256初始化 */
result = bsp_InitQSPI_W25Q256();
if (result != 0)
{
return 1;
}
adr -= QSPI_FLASH_MEM_ADDR;
size = sz;
/* 页编程 */
while(size > 0)
{
if (QSPI_WriteBuffer(buf, adr, 256) == 1)
{
QSPI_MemoryMapped();
return 1;
}
size -= 256;
adr += 256;
buf += 256;
}
/* 内存映射 */
result = QSPI_MemoryMapped();
if (result != 0)
{
return 1;
}
return (0);
}
|