開發環境: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有的時候也很傻啊!!