STM32读写25Q64遇到的BUG

文章探讨了一个在调用Flash_Read_Array函数时出现的问题。当使用非指针变量作为参数时,程序会卡住,而使用指针变量的地址则能正常运行。问题的关键在于正确传递内存地址进行Flash读取操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

25Q64写函数如下:

void Flash_Read_Array(unsigned long nAddr, unsigned char *pData, unsigned short nCount)
{
		unsigned char *pAddr;
		pAddr = (unsigned char *)&nAddr;
		
//		printf(".......................2\r\n");
		FLASHCSLow();
		
		Flash_Send_Byte(FLASH_CMD_READ);
		Flash_Send_Byte(*(pAddr + 2));
		Flash_Send_Byte(*(pAddr + 1));
		Flash_Send_Byte(*(pAddr + 0));
		while(nCount--)
		{
			*pData++ = Flash_Get_Byte();
		}
//		printf(".......................3\r\n");
		FLASHCSHigh();
}

如果按以下操作,会卡住:

sInnerRecord *tespRecord;
	Flash_Read_Array(INNER_FLASH_RECORD_START + index * sizeof(sInnerRecord), (uint8_t *)tespRecord, sizeof(sInnerRecord));

以下操作则可正常写入:

	sInnerRecord tespRecord;
	Flash_Read_Array(INNER_FLASH_RECORD_START + index * sizeof(sInnerRecord), (uint8_t *)&tespRecord, sizeof(sInnerRecord));
SFUD (Serial Flash Universal Driver)  串行 Flash 万能驱动库 0、SFUD 是什么 SFUD 是一款开源的串行 SPI Flash 通用驱动库。由于现有市面的串行 Flash 种类居多,各个 Flash 的规格及命令存在差异, SFUD 就是为了解决这些 Flash 的差异现状而设计,让我们的产品能够支持不同品牌及规格的 Flash,提高了涉及到 Flash 功能的软件的可重用性及可扩展性,同时也可以规避 Flash 缺货或停产给产品所带来的风险。 主要特点:面向对象(同时支持多个 Flash 对象)、可灵活裁剪、扩展性强、支持 4 字节地址 资源占用 标准占用:RAM:0.2KB ROM:5.5KB 最小占用:RAM:0.1KB ROM:3.6KB 设计思路:这里要首先跟大家介绍一个标准: SFDP ,它是 JEDEC (固态技术协会)制定的串行 Flash 功能的参数表标准,最新版 V1.6B (点击这里查看)。该标准规定了,每个 Flash 中会存在一个参数表,该表中会存放 Flash 容量、写粗粒度、擦除命令、地址模式等 Flash 规格参数。目前,除了部分厂家旧款 Flash 型号会不支持该标准,其他绝大多数新出厂的 Flash 均已支持 SFDP 标准。所以该库在初始化时会优先读取 SFDP 表参数,如果该 Flash 不支持 SFDP,则查询配置文件 ( /sfud/inc/sfud_flash_def.h ) 中提供的 Flash 参数信息表 中是否支持该款 Flash。如果不支持,则可以在配置文件中添加该款 Flash 的参数信息(添加方法详细见 2.5 添加库目前不支持的 Flash)。获取到了 Flash 的规格参数后,就可以实现对 Flash 的全部操作。 1、为什么选择 SFUD 避免项目因 Flash 缺货、Flash 停产或产品扩容而带来的风险; 越来越多的项目将固件存储到串行 Flash 中,例如:ESP8266 的固件、主板中的 BIOS 及其他常见电子产品中的固件等等,但是各种 Flash 规格及命令不统一。使用 SFUD 即可避免,在相同功能的软件平台基础下,无法适配不同 Flash 种类的硬件平台的问题,提高软件的可重用性; 简化软件流程,降低开发难度。现在只需要配置好 SPI 通信,即可畅快的开始玩串行 Flash 了; 可以用来制作 Flash 编程器/烧写器 2、SFUD 如何使用 2.1 已支持 Flash 下表为所有在 Demo 平台上进行过真机测试的 Flash。目前 SFUD 提供的 Flash 参数信息表 只包括下表中 不支持 SFDP 标准的 Flash,其他不支持 SFDP 标准的 Flash 需要大家以后 共同来完善和维护 (Github|OSChina) 。如果觉得这个开源项目很赞,可以点击 项目主页 右上角的 Star ,同时把它推荐给更多有需要的朋友。 型号 制造商 容量 最高速度 SFDP 备注 W25Q40BV Winbond 4Mb 50Mhz 不支持 已停产 W25Q80DV Winbond 8Mb 104Mhz 支持 W25Q16CV Winbond 16Mb 104Mhz 支持 W25Q32BV
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值