|
以FSMC/FMC的模式A为例,分别配置读和写:
- /*
- *********************************************************************************************************
- * 函 数 名: LCD_FSMCConfig
- * 功能说明: 配置FSMC并口访问时序
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- static void LCD_FSMCConfig(void)
- {
- /*
- TFT-LCD,OLED和AD7606公用一个FMC配置,如果都开启,请以FMC速度最慢的为准。
- 从而保证所有外设都可以正常工作。
- */
- SRAM_HandleTypeDef hsram = {0};
- FMC_NORSRAM_TimingTypeDef SRAM_TimingRead = {0};
- FMC_NORSRAM_TimingTypeDef SRAM_TimingWrite = {0};
-
- hsram.Instance = FMC_NORSRAM_DEVICE;
- hsram.Extended = FMC_NORSRAM_EXTENDED_DEVICE;
-
- /* FMC使用的HCLK,主频168MHz,1个FMC时钟周期就是5.95ns */
- SRAM_TimingRead.AddressSetupTime = 4; /* 4*5.95ns,地址建立时间,范围0 -15个FMC时钟周期个数 */
- SRAM_TimingRead.AddressHoldTime = 0; /* 地址保持时间,配置为模式A时,用不到此参数 范围1 -15个时钟周期个数 */
- SRAM_TimingRead.DataSetupTime = 8; /* 6*5.95ns,数据保持时间,范围1 -255个时钟周期个数 */
- SRAM_TimingRead.BusTurnAroundDuration = 1; /* 两个连续数据读写的时间间隔*/
- SRAM_TimingRead.CLKDivision = 0; /* 此配置用不到这个参数 */
- SRAM_TimingRead.DataLatency = 0; /* 此配置用不到这个参数 */
- SRAM_TimingRead.AccessMode = FSMC_ACCESS_MODE_A; /* 配置为模式A */
-
- SRAM_TimingWrite.AddressSetupTime = 4; /* 4*5.95ns,地址建立时间,范围0 -15个FMC时钟周期个数 */
- SRAM_TimingWrite.AddressHoldTime = 0; /* 地址保持时间,配置为模式A时,用不到此参数 范围1 -15个时钟周期个数 */
- SRAM_TimingWrite.DataSetupTime = 6; /* 8*5.95ns,数据保持时间,范围1 -255个时钟周期个数 */
- SRAM_TimingWrite.BusTurnAroundDuration = 1; /* 两个连续数据读写的时间间隔*/
- SRAM_TimingWrite.CLKDivision = 0; /* 此配置用不到这个参数 */
- SRAM_TimingWrite.DataLatency = 0; /* 此配置用不到这个参数 */
- SRAM_TimingWrite.AccessMode = FSMC_ACCESS_MODE_A; /* 配置为模式A */
- hsram.Init.NSBank = FSMC_NORSRAM_BANK4; /* 使用的BANK4,即使用的片选FSMC_NE4 */
- hsram.Init.DataAddressMux = FSMC_DATA_ADDRESS_MUX_DISABLE; /* 禁止地址数据复用 */
- hsram.Init.MemoryType = FSMC_MEMORY_TYPE_SRAM; /* 存储器类型SRAM */
- hsram.Init.MemoryDataWidth = FSMC_NORSRAM_MEM_BUS_WIDTH_16; /* 16位总线宽度 */
- hsram.Init.BurstAccessMode = FSMC_BURST_ACCESS_MODE_DISABLE; /* 关闭突发模式 */
- hsram.Init.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW; /* 用于设置等待信号的极性,关闭突发模式,此参数无效 */
- hsram.Init.WaitSignalActive = FSMC_WAIT_TIMING_BEFORE_WS; /* 关闭突发模式,此参数无效 */
- hsram.Init.WriteOperation = FSMC_WRITE_OPERATION_ENABLE; /* 用于使能或者禁止写保护 */
- hsram.Init.WaitSignal = FSMC_WAIT_SIGNAL_DISABLE; /* 关闭突发模式,此参数无效 */
- hsram.Init.ExtendedMode = FSMC_EXTENDED_MODE_DISABLE; /* 禁止扩展模式 */
- hsram.Init.AsynchronousWait = FSMC_ASYNCHRONOUS_WAIT_DISABLE; /* 用于异步传输期间,使能或者禁止等待信号,这里选择关闭 */
- hsram.Init.WriteBurst = FSMC_WRITE_BURST_DISABLE; /* 禁止写突发 */
- hsram.Init.ContinuousClock = FSMC_CONTINUOUS_CLOCK_SYNC_ONLY; /* 仅同步模式才做时钟输出 */
- hsram.Init.WriteFifo = FSMC_WRITE_FIFO_ENABLE; /* 使能写FIFO */
- /* 初始化SRAM控制器 */
- if (HAL_SRAM_Init(&hsram, &SRAM_TimingRead, &SRAM_TimingWrite) != HAL_OK)
- {
- /* 初始化错误 */
- Error_Handler(__FILE__, __LINE__);
- }
- }
复制代码
|
|