一直不知道MDK該怎么仿真調試程序,之前試了好幾次都沒有成功。因為有個程序一直不知道里面的變量對應着外部怎么的模式,今天想起可以用仿真調試的方法查看當外部設置某種模式的時候,
內部變量的變化,這樣想來,仿真調試真是太方便了,而且很實用,估計開發者當時開發這個功能的時候,估計就是出於這個目的吧,哈哈。
其實仿真並不難,就是有一點老是迷惑人,查了很多論壇,很多人都是因為這個問題不知道該怎么調試,就是進不去主函數,老是在systemint 里面徘徊,估計有情況,
其實如果這個問題解決了,也就那么回事。而且這也不是大家的問題,這個開發者當時開發
MDK的時候沒有考慮到這個問題,所以有點小麻煩。
我主要是看到這個帖子,才知道了原來如此,這種大神真應該多發點文章,解決我們廣大入門者的問題啊。
原文:http://blog.sina.com.cn/s/blog_3c63d2bd0102vt9a.html
問題描述:使用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有的時候也很傻啊!!
最后,上一下我的調試結果吧: