打印
[STM32F4]

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

[复制链接]
4005|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jinyi7016|  楼主 | 2015-12-31 10:36 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
开发板FMC上挂载的是SDRAM,对应 的最主要的初始化函数是
  BSP_SDRAM_Init(); 



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

  DMA_HandleTypeDef             *hdma;      /*!< Pointer DMA handler                   */
  
}SDRAM_HandleTypeDef;

对FMC初始化的硬件相关的函数是HAL_SDRAM_Init(&sdramHandle, &Timing)
而其中再主要的 是函数HAL_StatusTypeDef FMC_SDRAM_Init(FMC_SDRAM_TypeDef *Device, FMC_SDRAM_InitTypeDef *Init);
  if (Init->SDBank != FMC_SDRAM_BANK2) 
  {
    tmpr1 = Device->SDCR[FMC_SDRAM_BANK1];
   
    /* Clear NC, NR, MWID, NB, CAS, WP, SDCLK, RBURST, and RPIPE bits */
    tmpr1 &= ((uint32_t)~(FMC_SDCR1_NC  | FMC_SDCR1_NR | FMC_SDCR1_MWID | \
                         FMC_SDCR1_NB  | FMC_SDCR1_CAS | FMC_SDCR1_WP | \
                         FMC_SDCR1_SDCLK | FMC_SDCR1_RBURST | FMC_SDCR1_RPIPE));
  
  
    tmpr1 |= (uint32_t)(Init->ColumnBitsNumber   |\
                                               Init->RowBitsNumber      |\
                                               Init->MemoryDataWidth    |\
                                               Init->InternalBankNumber |\
                                               Init->CASLatency         |\
                                               Init->WriteProtection    |\
                                               Init->SDClockPeriod      |\
                                               Init->ReadBurst          |\
                                               Init->ReadPipeDelay
                                               );
    Device->SDCR[FMC_SDRAM_BANK1] = tmpr1;
  }
  else /* FMC_Bank2_SDRAM */                     
  {
    tmpr1 = Device->SDCR[FMC_SDRAM_BANK1];
   
    /* Clear NC, NR, MWID, NB, CAS, WP, SDCLK, RBURST, and RPIPE bits */
    tmpr1 &= ((uint32_t)~(FMC_SDCR1_NC  | FMC_SDCR1_NR | FMC_SDCR1_MWID | \
                          FMC_SDCR1_NB  | FMC_SDCR1_CAS | FMC_SDCR1_WP | \
                          FMC_SDCR1_SDCLK | FMC_SDCR1_RBURST | FMC_SDCR1_RPIPE));
   
    tmpr1 |= (uint32_t)(Init->SDClockPeriod      |\
                        Init->ReadBurst          |\
                        Init->ReadPipeDelay);  
   
    tmpr2 = Device->SDCR[FMC_SDRAM_BANK2];
   
    /* Clear NC, NR, MWID, NB, CAS, WP, SDCLK, RBURST, and RPIPE bits */
    tmpr2 &= ((uint32_t)~(FMC_SDCR1_NC  | FMC_SDCR1_NR | FMC_SDCR1_MWID | \
                          FMC_SDCR1_NB  | FMC_SDCR1_CAS | FMC_SDCR1_WP | \
                          FMC_SDCR1_SDCLK | FMC_SDCR1_RBURST | FMC_SDCR1_RPIPE));

    tmpr2 |= (uint32_t)(Init->ColumnBitsNumber   |\
                       Init->RowBitsNumber      |\
                       Init->MemoryDataWidth    |\
                       Init->InternalBankNumber |\
                       Init->CASLatency         |\
                       Init->WriteProtection);

    Device->SDCR[FMC_SDRAM_BANK1] = tmpr1;
    Device->SDCR[FMC_SDRAM_BANK2] = tmpr2;
  }  

要注意。BANK1对应 BANK0BANK2对应 BANK1
#define FMC_SDRAM_BANK1                       ((uint32_t)0x00000000)
#define FMC_SDRAM_BANK2                       ((uint32_t)0x00000001)


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


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


最后对SRAM进行读写结果:




沙发
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 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

137

主题

1347

帖子

12

粉丝