• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > STM32 FSMC學習筆記

    STM32 FSMC學習筆記

    作者: 時間:2016-11-27 來源:網絡 收藏
    FSMC全稱“靈活靜態存儲器控制器”。
    FSMC 包括4個模塊:

    (1)AHB接口(包括FSMC配置寄存器)
    (2)NOR閃存和PSRAM控制器(驅動LCD的時候LCD就好像一個PSRAM的里面只有2個16位的存儲空間,一個是DATA RAM 一個是CMD RAM)
    (3)NAND閃存和PC卡控制器
    (4)外部設備接口
    每個模塊通過片選信號控制
    --------------------------------------------------------------------------------------------------
    硬件電路(這里給出的是非復用連接)

    可以這樣接
    地址線A0 接 RS
    NE接 CS
    NEW –WR
    NOE –RD

    FSMC與外設連接好以后,就等于對于使用者屏蔽了對外設備的具體操作,只要對應類型的映射地址空間寫入數據,這些數據+地址就會被自動翻譯,并寫入外圍存儲設備。
    對于寫LCD來說,STM官方庫里有一些常用寫法:
    #define LCD_BASE((u32)(0x60000000 | 0x0C000000))//我解釋一下,地址是BANK1 的 第四塊
    #define LCD((LCD_TypeDef *) LCD_BASE)

    void LCD_WriteReg(u8 LCD_Reg,u16 LCD_RegValue)
    {

    LCD->LCD_REG = LCD_Reg;

    LCD->LCD_RAM = LCD_RegValue;
    }


    u16 LCD_ReadReg(u8 LCD_Reg)
    {

    LCD->LCD_REG = LCD_Reg;

    return (LCD->LCD_RAM);
    }
    當然也可以自己操作,完全在于自己。
    --------------------------------------------------------------------------------------------------
    初始化問題:
    1位寬:
    主要是AHB到NOR/PSRAM位寬的,比如如果AHB設為32位,NOR為16位,他會分兩次傳輸

    2:設置地址
    手冊是這樣寫的:在NOR/PSRAM模式下HADDR[27:26](HADDR are internal AHB address lines that are translated to external memory)用來片選NOR/PSRAM的四個分區。A[25:0]是地址線,因為HADDR是字節地址但是存取其按字編址,所以根據位寬的不同由以下情況。
    (1)當存儲數據設為8位時,地址各位對應FSMC_A[25:0],數據位對應FSMC_D[7:0](存儲大小64MB * 8 = 512MB)
    (2)當存儲數據設為16位時,地址各位對應FSMC_A[25:1]>>1(即FSMC_A[24:0]),數據位對應FSMC_D[15:0]
    (存儲大小 (64MB / 2) * 16 = 512MB)
    注意:在16位外部存儲寬度下,FSMC內部會用A[25:1]去生成A[24:0]。不論8位或16位的情況,FSMC_A[0]必需連接外部存儲的A[0]。
    --------------------------------------------------------------------------------------------------
    --------------------------------------------------------------------------------------------------
    FSMC的好處就是你一旦設置好之后,WR、RD、DB0-DB15這些控制線和數據線,都是FSMC自動控制的。打個比方,當你在程序中寫到:
    (volatile unsigned short int*)(0x60000000)=val;
    那么FSMC就會自動執行一個寫的操作,其對應的主控芯片的WE、RD這些腳,就會呈現出寫的時序出來(即WE=0,RD=1),數據val的值也會通過 DB0-15自動呈現出來(即FSMC-D0:FSMC-D15=val)。地址0x60000000會被呈現在數據線上(即A0-A25=0,地址線的對應最麻煩,要根據具體情況來,好好看看FSMC手冊)。
    連接好之后,讀寫時序都會被FSMC自動完成。但是還有一個很關鍵的問題,就是RS沒有接,CS沒有接。因為在FSMC里面,根本就沒有對應RS和CS的腳。怎么辦呢?這個時候,有一個好方法,就是用某一根地址線來接RS。比如我們選擇了A16這根地址線來接,那么當我們要寫寄存器的時候,我們需要RS,也就是A16置高。軟件中怎么做呢?也就是將FSMC要寫的地址改成0x60020000,如下:
    (volatile unsigned short int*)(0x60020000)=val;
    這個時候,A16在執行其他FSMC的同時會被拉高,因為A0-A18要呈現出地址0x60020000。0x60020000里面的Bit17=1,就會導致A16為1。

    上一頁 1 2 下一頁

    關鍵詞: STM32FSMC學習筆

    評論


    技術專區

    關閉
    主站蜘蛛池模板: 崇仁县| 青海省| 彭阳县| 四子王旗| 五台县| 佛坪县| 西宁市| 青神县| 杨浦区| 哈巴河县| 灵丘县| 英山县| 漯河市| 原阳县| 桂平市| 西畴县| 浦县| 射洪县| 应用必备| 桐梓县| 稷山县| 鲁山县| 攀枝花市| 高陵县| 隆德县| 买车| 白山市| 临漳县| 筠连县| 大洼县| 太谷县| 石阡县| 利津县| 黎平县| 白山市| 石屏县| 宁安市| 黄龙县| 阿克陶县| 灌南县| 襄城县|