[STM32F4] 【STM32F469I试用】入门(六):FMC的使用

[复制链接]
4238|2
 楼主| jinyi7016 发表于 2015-12-31 10:36 | 显示全部楼层 |阅读模式
开发板FMC上挂载的是SDRAM,对应 的最主要的初始化函数是
  1.   BSP_SDRAM_Init();

捕获.PNG

与其他外设的初始化一样,初始化过程也是在对结构体sdramHandle的赋值。
这个结构体的类型是SDRAM_HandleTypeDef
这是一个比较简单的结构体
  1. typedef struct
  2. {
  3.   FMC_SDRAM_TypeDef             *Instance;  /*!< Register base address                 */
  4.   
  5.   FMC_SDRAM_InitTypeDef         Init;       /*!< SDRAM device configuration parameters */
  6.   
  7.   __IO HAL_SDRAM_StateTypeDef   State;      /*!< SDRAM access state                    */
  8.   
  9.   HAL_LockTypeDef               Lock;       /*!< SDRAM locking object                  */

  10.   DMA_HandleTypeDef             *hdma;      /*!< Pointer DMA handler                   */
  11.   
  12. }SDRAM_HandleTypeDef;

对FMC初始化的硬件相关的函数是HAL_SDRAM_Init(&sdramHandle, &Timing)
而其中再主要的 是函数HAL_StatusTypeDef FMC_SDRAM_Init(FMC_SDRAM_TypeDef *Device, FMC_SDRAM_InitTypeDef *Init);
  1.   if (Init->SDBank != FMC_SDRAM_BANK2)
  2.   {
  3.     tmpr1 = Device->SDCR[FMC_SDRAM_BANK1];
  4.    
  5.     /* Clear NC, NR, MWID, NB, CAS, WP, SDCLK, RBURST, and RPIPE bits */
  6.     tmpr1 &= ((uint32_t)~(FMC_SDCR1_NC  | FMC_SDCR1_NR | FMC_SDCR1_MWID | \
  7.                          FMC_SDCR1_NB  | FMC_SDCR1_CAS | FMC_SDCR1_WP | \
  8.                          FMC_SDCR1_SDCLK | FMC_SDCR1_RBURST | FMC_SDCR1_RPIPE));
  9.   
  10.   
  11.     tmpr1 |= (uint32_t)(Init->ColumnBitsNumber   |\
  12.                                                Init->RowBitsNumber      |\
  13.                                                Init->MemoryDataWidth    |\
  14.                                                Init->InternalBankNumber |\
  15.                                                Init->CASLatency         |\
  16.                                                Init->WriteProtection    |\
  17.                                                Init->SDClockPeriod      |\
  18.                                                Init->ReadBurst          |\
  19.                                                Init->ReadPipeDelay
  20.                                                );
  21.     Device->SDCR[FMC_SDRAM_BANK1] = tmpr1;
  22.   }
  23.   else /* FMC_Bank2_SDRAM */                     
  24.   {
  25.     tmpr1 = Device->SDCR[FMC_SDRAM_BANK1];
  26.    
  27.     /* Clear NC, NR, MWID, NB, CAS, WP, SDCLK, RBURST, and RPIPE bits */
  28.     tmpr1 &= ((uint32_t)~(FMC_SDCR1_NC  | FMC_SDCR1_NR | FMC_SDCR1_MWID | \
  29.                           FMC_SDCR1_NB  | FMC_SDCR1_CAS | FMC_SDCR1_WP | \
  30.                           FMC_SDCR1_SDCLK | FMC_SDCR1_RBURST | FMC_SDCR1_RPIPE));
  31.    
  32.     tmpr1 |= (uint32_t)(Init->SDClockPeriod      |\
  33.                         Init->ReadBurst          |\
  34.                         Init->ReadPipeDelay);  
  35.    
  36.     tmpr2 = Device->SDCR[FMC_SDRAM_BANK2];
  37.    
  38.     /* Clear NC, NR, MWID, NB, CAS, WP, SDCLK, RBURST, and RPIPE bits */
  39.     tmpr2 &= ((uint32_t)~(FMC_SDCR1_NC  | FMC_SDCR1_NR | FMC_SDCR1_MWID | \
  40.                           FMC_SDCR1_NB  | FMC_SDCR1_CAS | FMC_SDCR1_WP | \
  41.                           FMC_SDCR1_SDCLK | FMC_SDCR1_RBURST | FMC_SDCR1_RPIPE));

  42.     tmpr2 |= (uint32_t)(Init->ColumnBitsNumber   |\
  43.                        Init->RowBitsNumber      |\
  44.                        Init->MemoryDataWidth    |\
  45.                        Init->InternalBankNumber |\
  46.                        Init->CASLatency         |\
  47.                        Init->WriteProtection);

  48.     Device->SDCR[FMC_SDRAM_BANK1] = tmpr1;
  49.     Device->SDCR[FMC_SDRAM_BANK2] = tmpr2;
  50.   }  

要注意。BANK1对应 BANK0BANK2对应 BANK1
  1. #define FMC_SDRAM_BANK1                       ((uint32_t)0x00000000)
  2. #define FMC_SDRAM_BANK2                       ((uint32_t)0x00000001)
捕获.PNG

其本质,不过是对寄存器SDCR的配置。
捕获.PNG

还有一个寄存器STDR。它的配置在函数FMC_SDRAM_Timing_Init(hsdram->Instance, Timing, hsdram->Init.SDBank);中。
这两个函数完成了对SRAM的基本配置。
捕获.PNG

最后对SRAM进行读写结果:
捕获.PNG



gejigeji521 发表于 2015-12-31 11:57 | 显示全部楼层
由于CPU与FPGA通信的需要,以及对8080总线的熟悉,首选采用了STM32的FSMC总线,作为片间通信接口。FSMC能达到16MHz的写入速度,理论上能写20fps的1024*768的图片哈哈。(当然实际上是不可能的,就算是DMA传输,数据源也跟不上,实际上刷模拟的图片每秒10fps,刷的很high)当然这不是本篇的要点,这里主要研究STM32的FSMC接口,将速度提升到极限。
秋风式街球 发表于 2015-12-31 15:29 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

148

主题

1414

帖子

12

粉丝
快速回复 在线客服 返回列表 返回顶部