新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32的FSMC靈活靜態存儲器控制器

        STM32的FSMC靈活靜態存儲器控制器

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

          FSMC模塊能夠與同步或異步存儲器和16位PC存儲器卡接口,主要將AHB傳輸信號轉換到適當的外部設備協議,滿足訪問外部設備的時序要求。

        本文引用地址:http://www.104case.com/article/201611/316147.htm

          存儲器接口包括:

          ① 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模塊框圖如下:

               
          存儲塊外設地址映射(具體說明請看數據手冊,此處只用圖表形式簡單表示):
             
                   
          下表為NOR/PSRAM存儲塊選擇:  
                   
          三個存儲塊可用于NAND或PC:
                
          對于NAND閃存,空間可在低256K字節部分劃分為三個區:
                
          時序參數:
          FSMC通過使用可編程的存儲器時序參數寄存器,拓展了可選用的外部存儲器的速度范圍。FSMC的NOR FLASH控制器支持同步和異步突發兩種訪問方式。
          選用同步突發訪問方式時,FSMC將系統時鐘HCLK分頻后,發送給外部存儲器作為同步時鐘信號FSMC_CLK。此時需要設置的時間參數有兩個:CLK的分頻系數和訪問中獲得第1個數據所需要的等待延遲(DATLAT)。
          選用異步突發訪問方式時,FSMC主要設置3個時間參數:地址建立時間(ADDSET),數據建立時間(DATAST)和地址保持時間(ADDHLD)。
          異步NOR FLASH時序模式2時間參數計算公式如下:
                 
          式中Twc和Trc為所選存儲器芯片的寫周期長度和讀操作周期長度;Twp為所選存儲器芯片的寫信號持續長度。
          為達到更好的控制效果,還應考慮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;   //擴展NORBANK的第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);
        }


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 龙南县| 罗甸县| 定日县| 西吉县| 正宁县| 侯马市| 开原市| 浪卡子县| 七台河市| 江油市| 中牟县| 四子王旗| 金溪县| 西贡区| 大连市| 兖州市| 平塘县| 利川市| 莱州市| 平潭县| 会宁县| 尼木县| 印江| 连平县| 河池市| 娄底市| 宜兴市| 洮南市| 元氏县| 科技| 泉州市| 娄底市| 越西县| 张家口市| 平顶山市| 金沙县| 迭部县| 衢州市| 康马县| 芮城县| 苏尼特左旗|