驱动一个和 SRAM 类似时序的芯片,同样的 FMC 配置,AC6 下没有问题,同一个工程转成 GCC 后(修改了链接器脚本和少量其他软件 port ),读写那个芯片的数据就出问题了。
其他外设都是没问题的,UART、RMII、CAN 等。
配置 MPU 部分如下(与 AC6 一致)
[C] 纯文本查看 复制代码 /* 配置FMC 片选3 TNT4882的支持*/
MPU_InitStruct.Enable = MPU_REGION_ENABLE;
MPU_InitStruct.BaseAddress = 0x68000000;
MPU_InitStruct.Size = MPU_REGION_SIZE_256B;
MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE; // 此外设需配置为无cache,否则会重复片选和读写使能
MPU_InitStruct.IsShareable = MPU_ACCESS_SHAREABLE;
MPU_InitStruct.Number = MPU_REGION_NUMBER4;
MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
MPU_InitStruct.SubRegionDisable = 0x00;
MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
配置 FMC 部分如下(与 AC6 一致)
[C] 纯文本查看 复制代码 hsram1.Instance = FMC_NORSRAM_DEVICE;
hsram1.Extended = FMC_NORSRAM_EXTENDED_DEVICE;
/* hsram1.Init */
hsram1.Init.NSBank = FMC_NORSRAM_BANK3;
hsram1.Init.DataAddressMux = FMC_DATA_ADDRESS_MUX_DISABLE;
hsram1.Init.MemoryType = FMC_MEMORY_TYPE_SRAM;
hsram1.Init.MemoryDataWidth = FMC_NORSRAM_MEM_BUS_WIDTH_8;
hsram1.Init.BurstAccessMode = FMC_BURST_ACCESS_MODE_DISABLE;
hsram1.Init.WaitSignalPolarity = FMC_WAIT_SIGNAL_POLARITY_LOW;
hsram1.Init.WaitSignalActive = FMC_WAIT_TIMING_BEFORE_WS;
hsram1.Init.WriteOperation = FMC_WRITE_OPERATION_ENABLE;
hsram1.Init.WaitSignal = FMC_WAIT_SIGNAL_DISABLE;
hsram1.Init.ExtendedMode = FMC_EXTENDED_MODE_ENABLE;
hsram1.Init.AsynchronousWait = FMC_ASYNCHRONOUS_WAIT_DISABLE;
hsram1.Init.WriteBurst = FMC_WRITE_BURST_DISABLE;
hsram1.Init.ContinuousClock = FMC_CONTINUOUS_CLOCK_SYNC_ONLY;
hsram1.Init.WriteFifo = FMC_WRITE_FIFO_ENABLE;
hsram1.Init.PageSize = FMC_PAGE_SIZE_NONE;
/* Timing */
Timing.AddressSetupTime = 10;
Timing.AddressHoldTime = 6; //6
Timing.DataSetupTime = 18; //18
Timing.BusTurnAroundDuration = 6;
Timing.CLKDivision = 16;
Timing.DataLatency = 17;
Timing.AccessMode = FMC_ACCESS_MODE_D;
/* ExtTiming */
ExtTiming.AddressSetupTime = 10;
ExtTiming.AddressHoldTime = 15;
ExtTiming.DataSetupTime = 16; //16
ExtTiming.BusTurnAroundDuration = 6; //6
ExtTiming.CLKDivision = 16;
ExtTiming.DataLatency = 17;
ExtTiming.AccessMode = FMC_ACCESS_MODE_A;
FMC 外设时钟是 200M ,RCC_FMCCLKSOURCE_D1HCLK ,收发段的时钟数都是计算好的,AC6 下一直稳定没有问题。
测试是读 0x68000000 部分的 16 个 8bit 数据,原有的 AC6 工程很稳定每次读取都一致。如下是 AC6 编译出的工程进行读取。
使用GCC编出来的工程则每次会有少许变化,但第一个字节几乎是不变的(或者极少)。如下是 GCC 编译出的工程进行读取。
个人怀疑是时钟时序和 AC6 不一样了。
很奇怪呀,搞不定辣(引脚很难焊,实在没办法只有焊出来对比了)
|