注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

深海精灵

水里的一滴油,透明地飘零在空气中。。。

 
 
 

日志

 
 
关于我

神秘诡谲,令人费解。可以很执着,也可以很破坏。冰冷,沉默。渴望单纯,渴望自由。躲在文字的背后,用心聆听世界,用直觉洞察世情。

网易考拉推荐

STM32的FSMC灵活静态存储器控制器  

2011-09-21 11:59:48|  分类: Cortex-M3 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

  FSMC(Flexihie Static Memory Controller)模块只适用于大容量产品。

  FSMC模块能够与同步或异步存储器和16位PC存储器卡接口,主要将AHB传输信号转换到适当的外部设备协议,满足访问外部设备的时序要求。

  存储器接口包括:

  ① SRAM静态随机存储器

  ② ROM只读存储器

  ③ NOR闪存

  ④ PSRAM(4个存储块)

  ⑤ 两个NAND闪存块

  ⑥ 16位PC卡

  STM32之所以能够支持NOR FLASH和NAND FLASH两类访问方式完全不同的存储器扩展,是因为FSMC内部实际包括NOR FLASH和NAND / PC Card两个控制器,分别支持两种截然不同的存储器访问方式。在STM32内部,FSMC的一端通过内部高速总线AHB连接到内核Cortex-M3,另一端则是面向扩展器的外部总线。内核对外部存储器访问信号发送到AHB总线后,经FSMC转换为符合外部存储器通信规约的信号,送到外部存储器相应的引脚,实现数据交互。FSMC起着桥梁作用,既能进行信号类型的转换,又能进行信号宽度和时序的调整,屏蔽掉不同存储类型的差异,使之对内核而言没有区别。

  FSMC模块框图如下:

       STM32的FSMC灵活静态存储器控制器 - 深海精灵 - 深海精灵
 
  存储块外设地址映射(具体说明请看数据手册,此处只用图表形式简单表示):
     
           STM32的FSMC灵活静态存储器控制器 - 深海精灵 - 深海精灵
  下表为NOR/PSRAM存储块选择:  
           STM32的FSMC灵活静态存储器控制器 - 深海精灵 - 深海精灵
  三个存储块可用于NAND或PC:
        STM32的FSMC灵活静态存储器控制器 - 深海精灵 - 深海精灵
  对于NAND闪存,空间可在低256K字节部分划分为三个区:
        STM32的FSMC灵活静态存储器控制器 - 深海精灵 - 深海精灵
 
  时序参数:
  FSMC通过使用可编程的存储器时序参数寄存器,拓展了可选用的外部存储器的速度范围。FSMC的NOR FLASH控制器支持同步和异步突发两种访问方式。
  选用同步突发访问方式时,FSMC将系统时钟HCLK分频后,发送给外部存储器作为同步时钟信号FSMC_CLK。此时需要设置的时间参数有两个:CLK的分频系数和访问中获得第1个数据所需要的等待延迟(DATLAT)。
  选用异步突发访问方式时,FSMC主要设置3个时间参数:地址建立时间(ADDSET),数据建立时间(DATAST)和地址保持时间(ADDHLD)。
  异步NOR FLASH时序模式2时间参数计算公式如下:
         STM32的FSMC灵活静态存储器控制器 - 深海精灵 - 深海精灵
  式中Twc和Trc为所选存储器芯片的写周期长度和读操作周期长度;Twp为所选存储器芯片的写信号持续长度。
  为达到更好的控制效果,还应考虑FSMC自身延迟问题,使用校正公式: 
         STM32的FSMC灵活静态存储器控制器 - 深海精灵 - 深海精灵
  式中TAVQV为所选存储器芯片访问过程中,从地址有效至数据有效的时间域;Tsu(Data_NE)为STM32特征参数,从数据有效到FSMC_NE失效时间域,Ttv(A_NE)为STM32特征参数,从FSMC_NE有效至地址有效的时间域。
 
 
   关于FSMC的其它配置这里就不多说了,下面以TFT屏(ILI9325)的驱动举个例子。
  TFT_RS —— PE2/A23
  TFT_WR —— PD5/NWE
  TFT_RD —— PD4/NOE
  数据线连接FSMC的数据接口,TFT屏背光使用PWM控制。
 
  例程如下:

#define TFT_Command ((uint32_t)0x60000000)
#define TFT_Data    ((uint32_t)0x61000000)     // FSMC_A23(16位) 注意16位与8位的地址计算方式不一样
                          // 8位地址 ——0x60800000
                          // 16位地址——0x61000000
 
/*-------------------------------------------------------------------------------*/
void TFT_IO_Configuration(void)
{
 GPIO_InitTypeDef GPIO_InitStructure;
 
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5
                     | GPIO_Pin_14 | GPIO_Pin_15// | GPIO_Pin_7
                      | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
 GPIO_Init(GPIOD, &GPIO_InitStructure);
 
 GPIO_InitStructure.GPIO_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_Pin_2;
 GPIO_Init(GPIOE, &GPIO_InitStructure);
}
/*-------------------------------------------------------------------------------*/
void TFT_FSMC_Configuration(void)
{
 FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
 FSMC_NORSRAMTimingInitTypeDef p;
 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC , ENABLE);
 
 TFT_IO_Configuration();
 
 p.FSMC_AddressSetupTime = 1;
 p.FSMC_AddressHoldTime = 0;
 p.FSMC_DataSetupTime = 2;
 p.FSMC_BusTurnAroundDuration = 0;
 p.FSMC_CLKDivision = 0;
 p.FSMC_DataLatency = 0;
 p.FSMC_AccessMode = FSMC_AccessMode_B;
 
 FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;   //扩展NOR BANK的第1个子BANK
 FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;  //不使用总线复用
 FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;   //扩展类型为SRAM
 FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;  // 16位总线宽度
 FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; // 
 FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
 FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
 FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
 FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
 FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
 FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;  //读写统一时间参数
 FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
 FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;   //指向定义的BTR结构
 FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;
 FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);
 FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);
}
  
/*---------------------------------------*/
void TFT_Write_com(u16 dat)  //发送命令
{
   *(__IO uint16_t *) (TFT_Command)= dat;
}
/*---------------------------------------*/
void TFT_Write_dat(u16 dat)  // 发送数据
{
   *(__IO uint16_t *) (TFT_Data)= dat;
}

/*---------------------------------------*/
u16 TFT_Read_dat(void)  // 读数据
{
   return *(__IO uint16_t *) (TFT_Data);
}
/*---------------------------------------*/
u16 TFT_ReadReg(u16 reg)
{
   *(__IO uint16_t *) (TFT_Command)= reg;
   return *(__IO uint16_t *) (TFT_Data);
}

 

 

   

  评论这张
 
阅读(2491)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017