问题:
在合计智能穿戴应用的时候,为了更好的用户体验和丰富的人机交互界面,需要更多的存储(RAM 和 FLASH)来存储自定义的图片资源 ;由于可穿戴类的产品体积都非常小,因此 FLASH&PSRAM集成在一起的 MCP 存储芯片是一个不错的选择.
我们的 STM32 FMC 外设是可以支持 MCP 存储芯片的,而且只需要简单的配置就可以实现MCP 的访问.
调研:
下面介绍使用 STM32CubeMX 配置 MCP 驱动的过程,我们使用 STM32F429+MX69V28F64 举例说明:
一、配置过程:
1.MX69V28F64 的总线结构和 PIN 定义:
2.下面我们使用 STM32CubeMX 来配置 MCP 接口:
a.新建 STM32F429ZIYx 的工程,在 FMC 根据 MCP 芯片来配置 FMC 的参数:
b.在 configuration 选项卡中配置 FMC 的详细参数,
c.根据 MX69V28F64 datasheet 中对时间的要求来更改 NOR/PSRAM timing 的参数:
c.配置完成后,生成代码,FMC 主要初始化如下:
- /* FMC initialization function */
- void MX_FMC_Init(void)
- {
- FMC_NORSRAM_TimingTypeDef Timing;
- /** Perform the SRAM1 memory initialization sequence
- */
- hsram1.Instance = FMC_NORSRAM_DEVICE;
- hsram1.Extended = FMC_NORSRAM_EXTENDED_DEVICE;
- /* hsram1.Init */
- hsram1.Init.NSBank = FMC_NORSRAM_BANK1;
- hsram1.Init.DataAddressMux = FMC_DATA_ADDRESS_MUX_ENABLE;
- hsram1.Init.MemoryType = FMC_MEMORY_TYPE_PSRAM;
- hsram1.Init.MemoryDataWidth = FMC_NORSRAM_MEM_BUS_WIDTH_16;
- hsram1.Init.BurstAccessMode = FMC_BURST_ACCESS_MODE_DISABLE;
- hsram1.Init.WaitSignalPolarity = FMC_WAIT_SIGNAL_POLARITY_HIGH;
- hsram1.Init.WrapMode = FMC_WRAP_MODE_DISABLE;
- hsram1.Init.WaitSignalActive = FMC_WAIT_TIMING_BEFORE_WS;
- hsram1.Init.WriteOperation = FMC_WRITE_OPERATION_DISABLE;
- hsram1.Init.WaitSignal = FMC_WAIT_SIGNAL_DISABLE;
- hsram1.Init.ExtendedMode = FMC_EXTENDED_MODE_DISABLE;
- hsram1.Init.AsynchronousWait = FMC_ASYNCHRONOUS_WAIT_ENABLE;
- hsram1.Init.WriteBurst = FMC_WRITE_BURST_DISABLE;
- hsram1.Init.ContinuousClock = FMC_CONTINUOUS_CLOCK_SYNC_ONLY;
- /* Timing */
- Timing.AddressSetupTime = 2;
- Timing.AddressHoldTime = 2;
- Timing.DataSetupTime = 6;
- Timing.BusTurnAroundDuration = 0;
- Timing.CLKDivision = 16;
- Timing.DataLatency = 17;
- Timing.AccessMode = FMC_ACCESS_MODE_A;
- /* ExtTiming */
- HAL_SRAM_Init(&hsram1, &Timing, NULL);
- /** Perform the NOR2 memory initialization sequence
- */
- hnor2.Instance = FMC_NORSRAM_DEVICE;
- hnor2.Extended = FMC_NORSRAM_EXTENDED_DEVICE;
- /* hnor2.Init */
- hnor2.Init.NSBank = FMC_NORSRAM_BANK2;
- hnor2.Init.DataAddressMux = FMC_DATA_ADDRESS_MUX_ENABLE;
- hnor2.Init.MemoryType = FMC_MEMORY_TYPE_NOR;
- hnor2.Init.MemoryDataWidth = FMC_NORSRAM_MEM_BUS_WIDTH_16;
- hnor2.Init.BurstAccessMode = FMC_BURST_ACCESS_MODE_DISABLE;
- hnor2.Init.WaitSignalPolarity = FMC_WAIT_SIGNAL_POLARITY_LOW;
- hnor2.Init.WrapMode = FMC_WRAP_MODE_DISABLE;
- hnor2.Init.WaitSignalActive = FMC_WAIT_TIMING_BEFORE_WS;
- hnor2.Init.WriteOperation = FMC_WRITE_OPERATION_DISABLE;
- hnor2.Init.WaitSignal = FMC_WAIT_SIGNAL_DISABLE;
- hnor2.Init.ExtendedMode = FMC_EXTENDED_MODE_DISABLE;
- hnor2.Init.AsynchronousWait = FMC_ASYNCHRONOUS_WAIT_DISABLE;
- hnor2.Init.WriteBurst = FMC_WRITE_BURST_DISABLE;
- hnor2.Init.ContinuousClock = FMC_CONTINUOUS_CLOCK_SYNC_ONLY;
- /* Timing */
- Timing.AddressSetupTime = 5;
- Timing.AddressHoldTime = 15;
- Timing.DataSetupTime = 7;
- Timing.BusTurnAroundDuration = 2;
- Timing.CLKDivision = 16;
- Timing.DataLatency = 17;
- Timing.AccessMode = FMC_ACCESS_MODE_A;
- /* ExtTiming */
- HAL_NOR_Init(&hnor2, &Timing, NULL);
- }
复制代码
二、软件如何使用:
用户在编写软件的时候,直接访问 FMC Bank1 的分区地址即可,FMC 外设会生成读写MCP 芯片的时序.
|