新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32F103 FSMC同步模式學習筆記2

        STM32F103 FSMC同步模式學習筆記2

        作者: 時間:2016-11-26 來源:網絡 收藏
        苦逼了。。看了將近一個禮拜的STM32F103 FSMC 片選NOR的異步模式。。。。可能對項目提升不大。。。現在看同步突發模式。。我也不知道怎么翻譯。。。嵌入式學得不太久。。不說了 一會看手冊啊。。
        ----------------------------------我是無恥的分割線-----------------------------------------------
        首先對于NOR異步模式總結一下:
        1.硬件線路一定要對
        2.需要知道可以用一根地址線(Ax)或者一些地址線選擇RS或者其他的東西,很有用。
        3.我用的是不復用模式144腳,如果是復用模式可能地址線會更亂一些。
        4.一定要先初始化RCC,GPIO在初始化FSMC。。要不可能會有問題,經驗之談。。
        5.21IC上有好多FSMC的帖子。。很有用。。
        6.要去官網下appliction note和芯片手冊。。最權威

        之后對于一些要重復記憶的話:
        FSMC所有輸出信號都是上升沿有效。

        最后給出我用示波器測試出來數據:
        ADDSET = 0DATASET = 2實際數據傳輸率: 7MHz (接近最快)
        ADDSET = 0DATASET = 6實際數據傳輸率: 5MHz
        ADDSET = 15 DATASET = 255 實際數據傳輸率: 260KHz (接近最慢)

        異步模式NE也就是信號有點奇怪,我認為他是片選信號,但是為什么會根據transaction拉低,transaction結束后又拉高,維持一固定一小段時間??(有待繼續看手冊)

        經過異步模式的測量與驗證,按照時序計算,一次transaction(NE從低到高的過程),時間計算和手冊是一樣的:
        我用的是擴展模式B: Tclc(write) =ADDSET + 1 + DATASET + 1;
        其中ADDSET最小為0,而DATASET最小為1.

        手冊上沒有的知識,經過一下午的測量,得出NE信號的恢復時間,即transaction結束后,NE拉高,再拉地的時間大致為6個HCLK。(如果同步模式和你的分頻有關,為6個CLK)
        -------------------------------------------------------------------------------------------------
        下面是同步模式:



        為了保證memory clock(CLK)在NADV低電平的中間上升,FSMC會在一個HCLK周期后操作CLK(在NADV前)。
        Data latency:就是在采樣前等待的時間周期,但是不包括NADV為低時的時間,可以從圖1看出。
        注意的是:一些NOR FLASH包括NADV為低時的周期,所以有下面的情況
        NOR Flash latency = DATLAT + 2
        NOR Flash latency = DATLAT + 3

        同步模式代碼我貼出來吧:
        void LED_FSMCConfigMy(void)
        {
        FSMC_NORSRAMInitTypeDefFSMC_NORSRAMInitStructure;
        FSMC_NORSRAMTimingInitTypeDefp;

        memset((unsigned char *)&p, 0, sizeof(FSMC_NORSRAMTimingInitTypeDef));
        memset((unsigned char *)&FSMC_NORSRAMInitStructure, 0, sizeof(FSMC_NORSRAMInitTypeDef));



        p.FSMC_CLKDivision =0x09;
        p.FSMC_DataLatency =0x01;
        p.FSMC_AccessMode = FSMC_AccessMode_A;

        //- Data/Address MUX = Disable
        //- Memory Type = SRAM
        //- Data Width = 16bit
        //- Write Operation = Enable
        //- Extended Mode = Disable
        //- Asynchronous Wait = Disable
        //- WaitSignalPolarity = Low
        //- BurstAccessMode = Enable
        FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;//NOR和SRAM的BANK
        FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Enable; //不復用
        FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_PSRAM ; //因為我需要寫,同步模式只有PSRAM才能寫,和輸出時鐘信號
        FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;//16位輸出
        FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Enable; //這個不太懂
        FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
        FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable; //同步模式dont care
        FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;//WAITCFG = 0 默認值,其實無所謂
        FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;//WREN 同步寫時不可更改
        FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Enable;//允許等待
        FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;//不用擴展模式
        FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Enable;//使用同步模式必須開
        FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;
        FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;

        FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);


        FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);


        }


        另外,我用紅色高亮的代碼是我遇到問題后的解決方案,就是不論你怎么設置分頻和時延,都是預期的結果。
        http://bbs.21ic.com/viewthread.php?tid=375165&highlight=
        原因很簡單:
        因為STM32 給的庫,在這個結構體問題上FSMC_NORSRAMTimingInitTypeDef, 并沒有初始化!!!
        天知道原來是什么值,加上庫里直接把寄存器用 或 的方式全部賦值,如果結構體本身就有數值,進行 或 了
        以后當然天知道他變成什么值了!!
        FSMC_Bank1->BTCR[FSMC_NORSRAMInitStruct->FSMC_Bank+1] =
        (uint32_t)FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressSetupTime |
        (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressHoldTime << 4) |
        (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataSetupTime << 8) |
        (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_BusTurnAroundDuration << 16) |
        (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_CLKDivision << 20) |
        (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataLatency << 24) |
        FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AccessMode;

        加了一句 清零結構體數值語句。
        memset((unsigned char *)&p, 0, sizeof(FSMC_NORSRAMTimingInitTypeDef));
        保證他能夠成功寫入寄存器


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 海盐县| 重庆市| 扎赉特旗| 尼木县| 湘阴县| 昌黎县| 武定县| 出国| 襄樊市| 新巴尔虎右旗| 泰安市| 渑池县| 泰宁县| 磐安县| 崇州市| 泸州市| 工布江达县| 皋兰县| 呼和浩特市| 台湾省| 都匀市| 桂阳县| 田林县| 黑河市| 龙胜| 钟山县| 扎赉特旗| 澄江县| 阿荣旗| 始兴县| 饶河县| 册亨县| 肇源县| 宁乡县| 嘉峪关市| 丰台区| 阜城县| 九江市| 固镇县| 株洲市| 阳西县|