<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32的FSMC靈活靜態(tài)存儲器控制器

          STM32的FSMC靈活靜態(tài)存儲器控制器

          作者: 時間:2016-11-13 來源:網(wǎng)絡(luò) 收藏
            FSMC(Flexihie Static Memory Controller)模塊只適用于大容量產(chǎn)品。

            FSMC模塊能夠與同步或異步存儲器和16位PC存儲器卡接口,主要將AHB傳輸信號轉(zhuǎn)換到適當(dāng)?shù)耐獠吭O(shè)備協(xié)議,滿足訪問外部設(shè)備的時序要求。

          本文引用地址:http://www.ex-cimer.com/article/201611/316147.htm

            存儲器接口包括:

            ① SRAM靜態(tài)隨機(jī)存儲器

           ?、凇OM只讀存儲器

            ③ NOR閃存

           ?、堋SRAM(4個存儲塊)

           ?、荨蓚€NAND閃存塊

           ?、蕖?6位PC卡

            STM32之所以能夠支持NOR FLASH和NAND FLASH兩類訪問方式完全不同的存儲器擴(kuò)展,是因?yàn)镕SMC內(nèi)部實(shí)際包括NOR FLASH和NAND / PC Card兩個控制器,分別支持兩種截然不同的存儲器訪問方式。在STM32內(nèi)部,F(xiàn)SMC的一端通過內(nèi)部高速總線AHB連接到內(nèi)核Cortex-M3,另一端則是面向擴(kuò)展器的外部總線。內(nèi)核對外部存儲器訪問信號發(fā)送到AHB總線后,經(jīng)FSMC轉(zhuǎn)換為符合外部存儲器通信規(guī)約的信號,送到外部存儲器相應(yīng)的引腳,實(shí)現(xiàn)數(shù)據(jù)交互。FSMC起著橋梁作用,既能進(jìn)行信號類型的轉(zhuǎn)換,又能進(jìn)行信號寬度和時序的調(diào)整,屏蔽掉不同存儲類型的差異,使之對內(nèi)核而言沒有區(qū)別。

            FSMC模塊框圖如下:

                 
            存儲塊外設(shè)地址映射(具體說明請看數(shù)據(jù)手冊,此處只用圖表形式簡單表示):
               
                     
            下表為NOR/PSRAM存儲塊選擇:  
                     
            三個存儲塊可用于NAND或PC:
                  
            對于NAND閃存,空間可在低256K字節(jié)部分劃分為三個區(qū):
                  
            時序參數(shù):
            FSMC通過使用可編程的存儲器時序參數(shù)寄存器,拓展了可選用的外部存儲器的速度范圍。FSMC的NOR FLASH控制器支持同步和異步突發(fā)兩種訪問方式。
            選用同步突發(fā)訪問方式時,F(xiàn)SMC將系統(tǒng)時鐘HCLK分頻后,發(fā)送給外部存儲器作為同步時鐘信號FSMC_CLK。此時需要設(shè)置的時間參數(shù)有兩個:CLK的分頻系數(shù)和訪問中獲得第1個數(shù)據(jù)所需要的等待延遲(DATLAT)。
            選用異步突發(fā)訪問方式時,F(xiàn)SMC主要設(shè)置3個時間參數(shù):地址建立時間(ADDSET),數(shù)據(jù)建立時間(DATAST)和地址保持時間(ADDHLD)。
            異步NOR FLASH時序模式2時間參數(shù)計(jì)算公式如下:
                   
            式中Twc和Trc為所選存儲器芯片的寫周期長度和讀操作周期長度;Twp為所選存儲器芯片的寫信號持續(xù)長度。
            為達(dá)到更好的控制效果,還應(yīng)考慮FSMC自身延遲問題,使用校正公式:
                   
            式中TAVQV為所選存儲器芯片訪問過程中,從地址有效至數(shù)據(jù)有效的時間域;Tsu(Data_NE)為STM32特征參數(shù),從數(shù)據(jù)有效到FSMC_NE失效時間域,Ttv(A_NE)為STM32特征參數(shù),從FSMC_NE有效至地址有效的時間域。
            關(guān)于FSMC的其它配置這里就不多說了,下面以TFT屏(ILI9325)的驅(qū)動舉個例子。
            TFT_RS —— PE2/A23
            TFT_WR —— PD5/NWE
            TFT_RD —— PD4/NOE
            數(shù)據(jù)線連接FSMC的數(shù)據(jù)接口,TFT屏背光使用PWM控制。
            例程如下:

          #define TFT_Command ((uint32_t)0x60000000)
          #define TFT_Data    ((uint32_t)0x61000000)   // FSMC_A23(16位) 注意16位與8位的地址計(jì)算方式不一樣
                                    // 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;   //擴(kuò)展NORBANK的第1個子BANK
          FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;  //不使用總線復(fù)用
          FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;   //擴(kuò)展類型為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;  //讀寫統(tǒng)一時間參數(shù)
          FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
          FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;   //指向定義的BTR結(jié)構(gòu)
          FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;
          FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);
          FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);
          }

          /*---------------------------------------*/
          void TFT_Write_com(u16 dat) //發(fā)送命令
          {
            *(__IO uint16_t *) (TFT_Command)= dat;
          }
          /*---------------------------------------*/
          void TFT_Write_dat(u16 dat)// 發(fā)送數(shù)據(jù)
          {
            *(__IO uint16_t *) (TFT_Data)= dat;
          }

          /*---------------------------------------*/
          u16 TFT_Read_dat(void)// 讀數(shù)據(jù)
          {
            return *(__IO uint16_t *) (TFT_Data);
          }
          /*---------------------------------------*/
          u16 TFT_ReadReg(u16 reg)
          {
            *(__IO uint16_t *) (TFT_Command)= reg;
            return *(__IO uint16_t *) (TFT_Data);
          }


          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();