当前位置:   article > 正文

STM32-FSMC理解及与FPGA通讯问题整理_fsmc fpga

fsmc fpga

目录

1. FSMC基本原理

 1)FSMC是什么?     

2)FSMC框架

2. FSMC实现

1)硬件连接

2)软件code


1. FSMC基本原理

 1)FSMC是什么?     

        FSMC,灵活静态存储控制器,顾名思义就是STM32 IC去访问外部存储器的一种可灵活配置的控制器。通过对相关寄存器的配置,可以访问不同类型的外部存储器,并且满足不同存储器的时序要求,实现不同场景及应用的灵活通讯。

        那么需要配置哪些寄存器呢?硬件如何连接呢?STM32内部的结构是怎么样的呢?

2)FSMC框架

        首先说下称为FSMC的对应的IC内部的部分及大概结构。如下图可以看出以下几点:

1)FSMC通过AHB总线访问外部存储器,参考时钟是AHB的时钟。

2)可访问的外部存储器有NOR FLASH、 PSRAM、SRAM、NAND FLASH、 PC卡等;

3)外部存储器是被固定划分的区域,有4个bank,每个bank的控制信号不同,数据地址信号和触发信号是一样的。

4)外部存储器的划分如下图,从地址0X6000 0000H-0X9FFF FFFFH的地址区域被划分为4个BANK,可通过选通信号NE来选择访问哪个BANK,第一个bank支持的存储器类型是NOR/PSRAM/SRAM, 第二和第三个bank支持访问NAND FLASH,最后一个bank支持访问PC卡。

 5)上面的每个bank又划分个4个存储区域,以第一个bank为例,划分为等内存空间的NE1, NE2, NE3, NE4。如下图所示,通过HADDR[27:26]这两位来选择使用哪个存储区。 

6)上面的配置寄存器,主要是指如下的3个寄存器的配置,片选以及时序。

2. FSMC实现

1)硬件连接

        STM32通过控制信号,以及地址和数据线连接到外设上,使用的是GPIO口的复用PIN。如下所示位PSRAM和SRAM的连接PIN定义。在STM32的手册中,分别对不同的外设以及是否复用I/O分别进行了PIN的接口定义。

这里的复用I/O指,如下所示,AD既可以作为地址线也可以作为数据线。

2)软件code

       FSMC部分的软件配置主要是FSMC的初始化,即FSMC的时钟配置,接口配置,复用功能配置,时序配置,以及上面的寄存器的配置。如下:

  1. void FSMC_FPGA_Init(void)
  2. {
  3. GPIO_InitTypeDef GPIO_InitStructure;
  4. FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
  5. FSMC_NORSRAMTimingInitTypeDef readWriteTiming;
  6. //clock set
  7. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOF|RCC_AHB1Periph_GPIOG, ENABLE);//enable PD,PE,PF,PG clock
  8. RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC,ENABLE);// enable FSMC clock
  9. // FSMC pin of GPIO D,E,F,G set
  10. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|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;
  11. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  12. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  13. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;//25MHz
  14. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  15. GPIO_Init(GPIOD, &GPIO_InitStructure);
  16. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_3|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;
  17. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  18. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  19. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;//25MHz
  20. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  21. GPIO_Init(GPIOE, &GPIO_InitStructure);
  22. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
  23. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  24. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  25. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;//25MHz
  26. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  27. GPIO_Init(GPIOF, &GPIO_InitStructure);
  28. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
  29. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  30. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  31. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;//25MHz
  32. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  33. GPIO_Init(GPIOG, &GPIO_InitStructure);
  34. //set I/O function,and assert PIN signal
  35. // fsmc data
  36. GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF_FSMC);
  37. GPIO_PinAFConfig(GPIOD,GPIO_PinSource15,GPIO_AF_FSMC);//PD15,AF12
  38. GPIO_PinAFConfig(GPIOD,GPIO_PinSource0,GPIO_AF_FSMC);//PD0,AF12
  39. GPIO_PinAFConfig(GPIOD,GPIO_PinSource1,GPIO_AF_FSMC);//PD1,AF12
  40. GPIO_PinAFConfig(GPIOE,GPIO_PinSource7,GPIO_AF_FSMC);//PE7,AF12
  41. GPIO_PinAFConfig(GPIOE,GPIO_PinSource8,GPIO_AF_FSMC);
  42. GPIO_PinAFConfig(GPIOE,GPIO_PinSource9,GPIO_AF_FSMC);
  43. GPIO_PinAFConfig(GPIOE,GPIO_PinSource10,GPIO_AF_FSMC);
  44. GPIO_PinAFConfig(GPIOE,GPIO_PinSource11,GPIO_AF_FSMC);
  45. GPIO_PinAFConfig(GPIOE,GPIO_PinSource12,GPIO_AF_FSMC);
  46. GPIO_PinAFConfig(GPIOE,GPIO_PinSource13,GPIO_AF_FSMC);
  47. GPIO_PinAFConfig(GPIOE,GPIO_PinSource14,GPIO_AF_FSMC);
  48. GPIO_PinAFConfig(GPIOE,GPIO_PinSource15,GPIO_AF_FSMC);//PE15,AF12
  49. GPIO_PinAFConfig(GPIOD,GPIO_PinSource8,GPIO_AF_FSMC);
  50. GPIO_PinAFConfig(GPIOD,GPIO_PinSource9,GPIO_AF_FSMC);
  51. GPIO_PinAFConfig(GPIOD,GPIO_PinSource10,GPIO_AF_FSMC);
  52. /control signal
  53. GPIO_PinAFConfig(GPIOD,GPIO_PinSource3,GPIO_AF_FSMC);//CLK
  54. GPIO_PinAFConfig(GPIOD,GPIO_PinSource4,GPIO_AF_FSMC);//OE
  55. GPIO_PinAFConfig(GPIOD,GPIO_PinSource5,GPIO_AF_FSMC);//WE
  56. GPIO_PinAFConfig(GPIOD,GPIO_PinSource7,GPIO_AF_FSMC); //CS1
  57. GPIO_PinAFConfig(GPIOE,GPIO_PinSource0,GPIO_AF_FSMC);//LB
  58. GPIO_PinAFConfig(GPIOE,GPIO_PinSource1,GPIO_AF_FSMC);//UB
  59. //address
  60. GPIO_PinAFConfig(GPIOF,GPIO_PinSource0,GPIO_AF_FSMC);//PF0,AF12
  61. GPIO_PinAFConfig(GPIOF,GPIO_PinSource1,GPIO_AF_FSMC);//PF1,AF12
  62. GPIO_PinAFConfig(GPIOF,GPIO_PinSource2,GPIO_AF_FSMC);//PF2,AF12
  63. GPIO_PinAFConfig(GPIOF,GPIO_PinSource3,GPIO_AF_FSMC);//PF3,AF12
  64. GPIO_PinAFConfig(GPIOF,GPIO_PinSource4,GPIO_AF_FSMC);//PF4,AF12
  65. GPIO_PinAFConfig(GPIOF,GPIO_PinSource5,GPIO_AF_FSMC);//PF5,AF12
  66. GPIO_PinAFConfig(GPIOF,GPIO_PinSource12,GPIO_AF_FSMC);//PF12,AF12
  67. GPIO_PinAFConfig(GPIOF,GPIO_PinSource13,GPIO_AF_FSMC);//PF13,AF12
  68. GPIO_PinAFConfig(GPIOF,GPIO_PinSource14,GPIO_AF_FSMC);//PF14,AF12
  69. GPIO_PinAFConfig(GPIOF,GPIO_PinSource15,GPIO_AF_FSMC);//PF15,AF12
  70. GPIO_PinAFConfig(GPIOG,GPIO_PinSource0,GPIO_AF_FSMC);
  71. GPIO_PinAFConfig(GPIOG,GPIO_PinSource1,GPIO_AF_FSMC);
  72. GPIO_PinAFConfig(GPIOG,GPIO_PinSource2,GPIO_AF_FSMC);
  73. GPIO_PinAFConfig(GPIOG,GPIO_PinSource3,GPIO_AF_FSMC);
  74. GPIO_PinAFConfig(GPIOG,GPIO_PinSource4,GPIO_AF_FSMC);
  75. GPIO_PinAFConfig(GPIOG,GPIO_PinSource5,GPIO_AF_FSMC);
  76. GPIO_PinAFConfig(GPIOD,GPIO_PinSource11,GPIO_AF_FSMC);
  77. GPIO_PinAFConfig(GPIOD,GPIO_PinSource12,GPIO_AF_FSMC);
  78. GPIO_PinAFConfig(GPIOD,GPIO_PinSource13,GPIO_AF_FSMC);
  79. GPIO_PinAFConfig(GPIOE,GPIO_PinSource3,GPIO_AF_FSMC);
  80. // fsmc regiter set, every paramter of register setting
  81. readWriteTiming.FSMC_AddressSetupTime = 0x02; //one HCLK 1/36M=27ns
  82. readWriteTiming.FSMC_AddressHoldTime = 0x0F;//0x00;
  83. readWriteTiming.FSMC_DataSetupTime = 0xFF;//0x03;
  84. readWriteTiming.FSMC_BusTurnAroundDuration = 0x04;
  85. readWriteTiming.FSMC_CLKDivision = 0x07; //168 / 8 = 21 mhz
  86. readWriteTiming.FSMC_DataLatency = 0x00;
  87. readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A;
  88. //the content value of fsmc register struct
  89. FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;
  90. FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
  91. FSMC_NORSRAMInitStructure.FSMC_MemoryType =FSMC_MemoryType_SRAM;
  92. FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
  93. FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode =FSMC_BurstAccessMode_Disable;
  94. FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
  95. FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait=FSMC_AsynchronousWait_Disable;
  96. FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
  97. FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
  98. FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
  99. FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
  100. FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
  101. FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
  102. FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming;
  103. FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &readWriteTiming;
  104. //register address mapping
  105. FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); //init fsmc set
  106. FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE); // enable bank1
  107. }

3. 问题整理

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/384809
推荐阅读
相关标签
  

闽ICP备14008679号