You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 21:36:04