STM32F429NI外接NOR Flash擦读写异常及8位数据写入方案咨询
问题1:集成多模块后NOR Flash数据接收异常排查方案
- 排查引脚冲突:当前配置的NOR引脚为PD4、PD5、PD6、PD7,检查完整项目中以太网、其他外设的引脚配置是否复用了这几个IO,同时确认GPIO的速度、上下拉配置是否和单独测试时一致,CubeMX集成多模块时可能自动覆盖已配置的引脚参数。
- 检查FMC时钟配置:完整项目中可能修改了AHB/APB总线时钟分频,导致FMC工作时钟和单独测试时不一致,原测试的时序参数不再匹配,可适当加大
DataSetupTime、AddressSetupTime参数测试是否恢复正常。 - 检查总线优先级配置:以太网DMA等外设的总线优先级如果高于FMC,可能会抢占FMC的总线访问权,导致读写时序被打断,可调整NVIC中FMC相关中断、总线矩阵的优先级配置。
- 检查内存映射配置:确认NOR Flash的设备基地址
NOR_DEVICE_ADDR没有和内部Flash、SRAM、以太网DMA缓冲区的地址范围重叠,避免访问地址冲突。
问题2:16位总线下实现8位数据写入的方案
你当前FMC配置为16位总线宽度,硬件上是16位并行连接NOR Flash,单次硬件访问最小单位是16位,可通过读改写的方式实现8位写入,参考实现代码如下:
uint8_t BSP_NOR_Write8(uint32_t uwStartAddress, uint8_t* pData, uint32_t uwDataSize) { uint32_t i = 0; uint16_t tmp_val; // 对齐到16位访问地址 uint32_t addr_align = uwStartAddress & 0xFFFFFFFE; // 字节偏移:0表示写入16位的低8位,1表示写入高8位 uint8_t offset = uwStartAddress % 2; while(i < uwDataSize) { // 先读取目标地址的16位原始数据 if(BSP_NOR_ReadData(addr_align, &tmp_val, 1) != NOR_STATUS_OK) { return NOR_STATUS_ERROR; } // 仅修改目标字节,保留另一字节的原始值 if(offset == 0) { tmp_val = (tmp_val & 0xFF00) | pData[i]; } else { tmp_val = (tmp_val & 0x00FF) | ((uint16_t)pData[i] << 8); } // 回写修改后的16位数据 if(BSP_NOR_WriteData(addr_align, &tmp_val, 1) != NOR_STATUS_OK) { return NOR_STATUS_ERROR; } // 更新地址和偏移 offset ^= 1; if(offset == 0) { addr_align += 2; } i++; } return NOR_STATUS_OK; }
注意:NOR Flash写入前需要保证对应扇区已经擦除,未擦除的位置只能将1改写为0,读改写操作如果是写入全新数据请先擦除对应扇区。
如果你的NOR Flash硬件本身支持8位工作模式,可以直接修改FMC初始化中的hnor1.Init.MemoryDataWidth参数为FMC_NORSRAM_MEM_BUS_WIDTH_8,同时修改对应驱动的读写函数直接操作8位数据即可,不需要读改写流程。
内容的提问来源于stack exchange,提问作者user15150033
相关产品推荐
相关产品推荐

