error 65: access violation at 0x40021000 : no 'read' permission

開發環境:keil MDK V5.10

操作系統:windows 7(32位)


問題描述:使用MDK進行軟件設計時沒有使用ST官方的模板而是手動建立的工程,使用ST官方提供的3.5版本固件庫。編譯完全通過,在使用軟件仿真時出現問題,表現爲程序無法跳轉到main入口,直接在SystemInit()函數就無法執行,調試窗口出現如標題所示的錯誤信息:

error 65: access violation at 0x40021000 : no 'read' permission

如下圖所示,途中紅圈分別表示了代碼執行到的位置及相應的錯誤信息


網絡上查找解決方案同時對比ST提供的3.5版本固件庫中的工程模板,發現是工程配置選項中的debug選項卡的dialog dll和對應的parameter配置出了問題。選中MCU後默認的配置如下圖:


可以看到dialog dll默認配置爲DCM.DLL,而parameter默認配置爲-pCM3,該種配置無法進行正常的仿真調試。

正確配置應該爲dialog dll:DARMSTM.dll parameter:-pSTM32F103C8

這兩個參數是根據你使用的MCU不同而不同的,例如本工程使用的MCU爲STM系列,那麼在dialog DLL選項中就應該使用DARMSTM.dll,名字中的STM就是指廠商,參數則是具體的MCU芯片型號,本項目使用STM32F103C8T6,因此選擇爲STM32F103C8,如下圖所示:


爲何使用的是STM32F103C8T6,參數卻只能是STM32F103C8,這個原因是因爲根據ST公司的MCU命名規則,到C8這個位置就已經完全規定了仿真所需要的所有參數,包括cpu頻率,ram容量,flash容量,外設資源等內容。型號中後邊的部分都已經和仿真無關了,例如後邊的名字主要代表了MCU的封裝,工作溫度等。官方命名規則如下圖:


當然還有一個更加直接的原因是DARMSTM.DLL這個動態鏈接庫文件中沒有詳細的MCU型號,我們可以通過使用工具打開動態鏈接庫文件查看證明,如下圖所示,圖中可以清楚的看到一個MCU的型號只有11個字符,不包括後邊的其他參數字符。

總結:該問題的產生,歸根到底還是keil IDE的問題,正常的情況,應該是通過工程嚮導建立工程的時候,配置參數就自動使用該MCU應該使用的dialogdll及相關參數。不得不感嘆,KEIL有的時候也很傻啊!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章