新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32的FSMC仿真可運行

        STM32的FSMC仿真可運行

        作者: 時間:2016-11-26 來源:網絡 收藏
        調試了幾天STM32FSMC驅動液晶的程序,原先在MDK上編譯下載后可以運行的程序,移植到IAR上后就出現了問題,(以下描述的是在從新上電復位后運行的現象,但在jlink調試過程中運行都是正常的)
        問題是這樣的:程序運行完 *(__IO uint16_t *) (Bank1_LCD_C)= index; 后就不在往下運行了,反復實驗了N次,只有一次進入了Hardfault, 而剩下的情況都是mcu不運行了。查了很多資料終于在一片《STM32F103FSMC同步模式學習筆記2》文章中找到了答案,原因是在FSMC初始化過程中出現的,我們初學者編程序都有以個缺點,就是定義申請的變量后都不進行變量初始化操作(特別是定義了一些較為復雜的結構體之后),而在我們使用的過程中又忽視一些未使用的變量,這些都會導致一系列我們不想初相的問題,而編譯器有時候也不可能智能到按照我們默認地想法為我們做好各種細節的操作。
        FSMC_NORSRAMInitTypeDef結構體的定義是這樣的:
        typedef struct
        {
        uint32_t FSMC_Bank;
        uint32_t FSMC_DataAddressMux;
        uint32_t FSMC_MemoryType;
        uint32_t FSMC_MemoryDataWidth;
        uint32_t FSMC_BurstAccessMode;
        uint32_t FSMC_AsynchronousWait;
        uint32_t FSMC_WaitSignalPolarity;
        uint32_t FSMC_WrapMode;
        uint32_t FSMC_WaitSignalActive;
        uint32_t FSMC_WriteOperation;
        uint32_t FSMC_WaitSignal;
        uint32_t FSMC_ExtendedMode;
        uint32_t FSMC_WriteBurst;
        FSMC_NORSRAMTimingInitTypeDef* FSMC_ReadWriteTimingStruct;
        FSMC_NORSRAMTimingInitTypeDef* FSMC_WriteTimingStruct;
        }FSMC_NORSRAMInitTypeDef;
        我的參看的程序在對FSMC_NORSRAMInitTypeDef結構體的初始化過程中是這樣的:
        FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1; //Bank1基址0x60000000
        FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; //關閉地址、數據線混合模式
        FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_NOR; //選擇存儲器模式,選擇與液晶控制器類似的模式
        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_DuringWaitState;//FSMC_WaitSignalActive_BeforeWaitState;//連續傳輸模式中在等待狀態前發等待信號
        FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; //使能FSMC寫操作
        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 = &FSMC_Timing; //用FSMC_Timing結構體設定讀寫時序
        FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); //以上參數初始化FSMC
        這個結構體初始化過程只對結構體里面的13項進行了初始化,而結構體定義了15項,也就是說我們默認為進行初始化操作的另外兩項內存值應該都0x00,而事實并非我們所想想的那樣,問題就出在這里。解決的方法也很簡單,那就是加一句將FSMC_NORSRAMInitTypeDef初始化為0x00的語句接可以了。
        FSMC_NORSRAMInitTypeDef 結構體未進行初始化可能會出現一下幾種糾結的情況:
        1、像我上面遇到的一樣,用jlink調試是可以運行,但是系統從新上電后就會出現運行完一個FSMC的讀寫操作后就會出現Hardfault或則程序直接死在了這里(應該說單片機進入了某種等待狀態,這種狀態如果是處在jlink調試模式下,就可能導致仿真不能停止的情況,而只能關閉jlink調試,從新復位開發板,然后從新開始jlink調試運行)
        2、程序可以脫機運行,但是運行得很慢


        關鍵詞: STM32FSMC仿

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 岢岚县| 安塞县| 山阳县| 盖州市| 礼泉县| 杂多县| 崇州市| 西藏| 穆棱市| 始兴县| 皮山县| 报价| 宿州市| 磐石市| 江都市| 扬州市| 仙居县| 绩溪县| 陇川县| 桐柏县| 游戏| 罗江县| 松溪县| 饶阳县| 锡林郭勒盟| 邛崃市| 昌吉市| 上犹县| 汽车| 隆回县| 和田县| 东平县| 沙雅县| 扎鲁特旗| 双峰县| 库伦旗| 桦川县| 卢湾区| 万载县| 鹤壁市| 铅山县|