• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

stm32fsmc的复用

無唁苡對 2018-10-16 浏览量:1827
我把fsmc的地址线和数据线复用,当我读写SRAM时,我怎么吧地址和数据区分了?
0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 这种用法,是要把FSMC配置成分时复用的,也就是地址线与数据线分时复用,要使用锁存器把先发出来的地址信号锁存后等数据信号一起输出。

    锁存器可以选择74HC137DB


    无标题.png.thumb.png



    引脚配置:
      
    static void HAL_FSMC_MspInit(void){
      
       /* USER CODE BEGIN FSMC_MspInit 0 */
      
      
       /* USER CODE END FSMC_MspInit 0 */
      
       GPIO_InitTypeDef GPIO_InitStruct;
      
       if (FSMC_Initialized) {
      
         return;
      
      }
      
       FSMC_Initialized = 1;
      
       /* Peripheral clock enable */
      
       __HAL_RCC_FSMC_CLK_ENABLE();
      
      
       /** FSMC GPIO Configuration  
      
       PE7   ------> FSMC_DA4
      
       PE8   ------> FSMC_DA5
      
       PE9   ------> FSMC_DA6
      
       PE10   ------> FSMC_DA7
      
       PE11   ------> FSMC_DA8
      
       PE12   ------> FSMC_DA9
      
       PE13   ------> FSMC_DA10
      
       PE14   ------> FSMC_DA11
      
       PE15   ------> FSMC_DA12
      
       PD8   ------> FSMC_DA13
      
       PD9   ------> FSMC_DA14
      
       PD10   ------> FSMC_DA15
      
       PD14   ------> FSMC_DA0
      
       PD15   ------> FSMC_DA1
      
       PD0   ------> FSMC_DA2
      
       PD1   ------> FSMC_DA3
      
       PD4   ------> FSMC_NOE
      
       PD5   ------> FSMC_NWE
      
       PD6   ------> FSMC_NWAIT
      
       PD7   ------> FSMC_NE1
      
       PB7   ------> FSMC_NL
      
       */
      
       GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10
      
                               |GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14
      
                              |GPIO_PIN_15;
      
       GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
      
       GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
      
       HAL_GPIO_Init(GPIOE &GPIO_InitStruct);
      
      
       GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_14
      
                               |GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_4
      
                               |GPIO_PIN_5|GPIO_PIN_7;
      
       GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
      
       GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
      
       HAL_GPIO_Init(GPIOD &GPIO_InitStruct);
      
      
       GPIO_InitStruct.Pin = GPIO_PIN_6;
      
       GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
      
       GPIO_InitStruct.Pull = GPIO_NOPULL;
      
       HAL_GPIO_Init(GPIOD &GPIO_InitStruct);
      
      
       GPIO_InitStruct.Pin = GPIO_PIN_7;
      
       GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
      
       GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
      
       HAL_GPIO_Init(GPIOB &GPIO_InitStruct);
      
      
       /* USER CODE BEGIN FSMC_MspInit 1 */
      
      
       /* USER CODE END FSMC_MspInit 1 */
      
    }
      
    FSMC配置
      
    static void MX_FSMC_Init(void)
      
    {
      
       FSMC_NORSRAM_TimingTypeDef Timing;
      
      
       /** Perform the SRAM1 memory initialization sequence
      
       */
      
       hsram1.Instance = FSMC_NORSRAM_DEVICE;
      
       hsram1.Extended = FSMC_NORSRAM_EXTENDED_DEVICE;
      
       /* hsram1.Init */
      
       hsram1.Init.NSBank = FSMC_NORSRAM_BANK1;
      
       hsram1.Init.DataAddressMux = FSMC_DATA_ADDRESS_MUX_ENABLE;
      
       hsram1.Init.MemoryType = FSMC_MEMORY_TYPE_PSRAM;
      
       hsram1.Init.MemoryDataWidth = FSMC_NORSRAM_MEM_BUS_WIDTH_16;
      
       hsram1.Init.BurstAccessMode = FSMC_BURST_ACCESS_MODE_DISABLE;
      
       hsram1.Init.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW;
      
       hsram1.Init.WrapMode = FSMC_WRAP_MODE_DISABLE;
      
       hsram1.Init.WaitSignalActive = FSMC_WAIT_TIMING_BEFORE_WS;
      
       hsram1.Init.WriteOperation = FSMC_WRITE_OPERATION_DISABLE;
      
       hsram1.Init.WaitSignal = FSMC_WAIT_SIGNAL_DISABLE;
      
       hsram1.Init.ExtendedMode = FSMC_EXTENDED_MODE_DISABLE;
      
       hsram1.Init.AsynchronousWait = FSMC_ASYNCHRONOUS_WAIT_ENABLE;
      
       hsram1.Init.WriteBurst = FSMC_WRITE_BURST_DISABLE;
      
       /* Timing */
      
       Timing.AddressSetupTime = 15;
      
       Timing.AddressHoldTime = 15;
      
       Timing.DataSetupTime = 255;
      
       Timing.BusTurnAroundDuration = 15;
      
       Timing.CLKDivision = 16;
      
       Timing.DataLatency = 17;
      
       Timing.AccessMode = FSMC_ACCESS_MODE_A;
      
       /* ExtTiming */
      
      
       if (HAL_SRAM_Init(&hsram1 &Timing NULL) != HAL_OK)
      
      {
      
         Error_Handler();
      
      }
      
      
    }

    • 发布于 2018-10-16
    • 举报
    • 评论 1
    • 0
    • 0
無唁苡對 回复了 汉云:我读写外部SRAM,没有那个address valid引脚 回复

其他答案 数量:8
  • 外部需要锁存芯片,就像以前的80c32带单片机,外部要锁存芯片
    • 发布于2018-10-16
    • 举报
    • 评论 1
    • 0
    • 0
無唁苡對 回复了 yhj416606438 :用来锁存地址线么 回复

  • 这个最少要是100引脚的芯片才会有这个外设的,要使用锁存器芯片
    • 发布于2018-10-16
    • 举报
    • 评论 1
    • 0
    • 0
無唁苡對 回复了 莱克迷KW :我是100引脚的,需要锁存地址线么 回复

  • 地址与数据线是在同一组引脚上,是分不开的 ,信号只是分不同时间发出的
    • 发布于2018-10-16
    • 举报
    • 评论 0
    • 0
    • 0

  • 这样的操作要把你的地址和数据总线区分开,不然会相互干扰
    • 发布于2018-10-27
    • 举报
    • 评论 0
    • 0
    • 0

  • 地址线和数据线最好不要复用,要分开连接,不同的从机之间用cs引脚来进行区分。
    • 发布于2018-10-31
    • 举报
    • 评论 0
    • 0
    • 0

  • 要使用锁存器把地址线锁一下,再一起与地址线发出来
    • 发布于2018-11-10
    • 举报
    • 评论 0
    • 0
    • 0

  • 这个引脚在同一组是不能分开的,只能直接进行使用
    • 发布于2018-11-19
    • 举报
    • 评论 0
    • 0
    • 0

  • 地址线是不能喝你数据线一起使用的,要单独控制
    • 发布于2018-11-22
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

stm32fsmc的复用