找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9077|回復(fù): 1
收起左側(cè)

MDK軟件不能模擬仿真STM32的問題解決方法

[復(fù)制鏈接]
ID:105323 發(fā)表于 2016-2-23 16:12 | 顯示全部樓層 |閱讀模式
摘要: 學(xué)習(xí)和使用RealViewMDK開發(fā)工具及STM32等芯片時(shí),如果每個(gè)系列芯片都要購買、制作評估板或開發(fā)板的話,經(jīng)濟(jì)條件不允許,也不現(xiàn)實(shí)。當(dāng)然也可以在沒有硬件的條件下,通過MDK軟件的模擬仿真來學(xué)習(xí)STM32系列芯片的編程,但MDK軟件對模擬仿真的支持不是很全面,大部分芯片都不能模擬仿真,必須通過相應(yīng)的設(shè)置和相關(guān)的操作,才能完成模擬仿真。
關(guān)鍵詞: 模擬仿真;MDK;STM32
中圖分類號: TP368.1文獻(xiàn)標(biāo)識碼: A
Solution for MDK Software’s Inability to Simulate STM32
Liu Yongjun, Yang Xuancheng
Zhongshan Secondary Specialized School,Zhongshan 528458,China
Abstract: Learning and using STM32 and RealView MDK economicconditions do not permit each series chip to purchase andproduction evaluation or development board, not realistic. Ofcourse, there can be no hardware, and to learn STM32 series chipthrough the MDK software simulation program, but the MDK software'ssimulation support is not very comprehensive, supporting only partof the chips, simulation must be done through the correspondingconfiguration and associated operation.
Key words: simulation;MDK;STM32
引言
  MDK軟件在模擬仿真時(shí),不能很好地支持各種STM32系列芯片,目前對STM32F103系列芯片支持模擬仿真,但對于其他系列芯片不支持或只是部分支持。主要存在的問題是:PC和SP不能自動裝載,存儲器不能訪問,中斷服務(wù)程序不能執(zhí)行或觸發(fā),外設(shè)寄存器不能修改或觀察。要解決上述問題,必須通過相應(yīng)的設(shè)置和相關(guān)的操作,才能完成模擬仿真。
1 模擬仿真的實(shí)現(xiàn)及PC和SP的自動裝載
  在MDK軟件中,只有部分STM32芯片支持模擬仿真(如STM32F103),大部分芯片都不支持模擬仿真。主要的問題是,當(dāng)進(jìn)入調(diào)試界面后,R15(PC)的值為0x00000000,不能進(jìn)行調(diào)試操作(如單步、全速等)。要能對STM32進(jìn)行模擬仿真,必須使PC的值不能為0。通過分析STM32芯片的存儲器結(jié)構(gòu)可知,在存儲器地址0x00000000處保存的是堆棧指針SP的值,程序加載時(shí)自動把該值送給SP,在存儲器地址0x00000004處保存的是程序指針PC的值,程序加載時(shí)自動把該值送給PC,程序從該P(yáng)C值取指令執(zhí)行程序,而不是從地址0x00000000處執(zhí)行程序。而STM32芯片的Flash程序存儲器地址是從0x08000000處開始的,當(dāng)進(jìn)入模擬仿真時(shí),MDK軟件不能把Flash的地址送給PC和SP?赏ㄟ^以下操作步驟完成PC和SP的自動裝載。
①打開MDK自帶的工程文件,如C:\Keil\ARM\Boards\ST\STM3240GEVAL\Blinky\Blinky.uvproj。
②單擊“編譯”工具欄上面的下拉菜單,選擇“STM32F407 Flash”。
③單擊,打開“Options”對話框,切換到“Output”選項(xiàng)卡,勾選“Debug Information”和“BrowseInformation”,用以產(chǎn)生調(diào)試信息。再切換到“Debug”選項(xiàng)卡,單擊“UseSimulator”,選擇模擬仿真,確保勾選“Load Application at Startup”,其他為默認(rèn)設(shè)置。
④單擊,編譯程序,并保證編譯成功。
⑤單擊,開始調(diào)試,進(jìn)入調(diào)試界面后,觀察“Registers”寄存器選項(xiàng)卡中的R15(PC)的值,如果值為0,則說明不能進(jìn)行模擬仿真,“單步”調(diào)試等無效,須進(jìn)行步驟⑥的操作,否則可不進(jìn)行步驟⑥的操作。
⑥停止調(diào)試,再次單擊,打開“Options”對話框,切換到“Target”選項(xiàng)卡,將IROM1的值[0x08000000,0x100000]修改為[0x0,0x100000],以使Flash的起始地址從0x0開始。單擊重新編譯程序,再次單擊,開始調(diào)試,PC的值將不再為0,即可進(jìn)入模擬仿真,“單步”調(diào)試等有效。
2 存儲器的訪問
  當(dāng)進(jìn)入模擬仿真界面后,按“全速”F5或“單步”F10調(diào)試鍵后,在“command”窗口中將會出現(xiàn)類似如下的錯(cuò)誤提示:“*** error 65: access violation at 0x40023800 : no ′read′permission”,意思是在地址0x40023800處訪問違例,沒有“讀”的權(quán)限。地址0x40023800是外設(shè)寄存器地址。要使外設(shè)寄存器地址具有相應(yīng)的“讀”、“寫”、“執(zhí)行”權(quán)限,可在命令窗口中輸入MAP命令(不區(qū)分大小寫)。命令格式為:
  MAP 起始地址,結(jié)束地址 READ WRITEEXEC其中,READ表示“讀”權(quán)限,WRITE表示“寫”權(quán)限,EXEC表示“執(zhí)行”權(quán)限,結(jié)束地址與起始地址的空間尺寸不超過128MB,即不超過0x08000000字節(jié)。外設(shè)寄存器的存儲空間分布較廣,不可能在每次調(diào)試時(shí)都通過命令窗口輸入MAP指令,可通過如下的操作步驟進(jìn)行。
①新建一個(gè)文本文件,打開該文件,執(zhí)行文件菜單命令“另存為”,在打開的“另存為”對話框中,文件名輸入為initmap.ini,保存類型選擇為“所有文件”,并保存。在文件中輸入如下內(nèi)容并保存:
map 0x40000000,0x47ffffffreadwrite
map 0x50000000,0x57ffffffreadwrite
map 0xa0000000,0xa7ffffffreadwrite
map 0xf0000000,0xf7f00000 readwrite
根據(jù)需要,可在該文件中輸入包含所有外設(shè)寄存器的MAP命令,使所有外設(shè)寄存器都具有“讀”、“寫”權(quán)限。但注意映射空間不要超過0x08000000,否則調(diào)試時(shí)會提示錯(cuò)誤:“*** error 129: MapMemmap size truncated to 128MB”。
②單擊,打開“Options”對話框,切換到“Debug”,在“InitializationFile”的右邊單擊,打開“選擇仿真初始化文件”對話框,選擇上一步保存的initmap.ini文件。單擊“Edit”按扭,可打開文件再次修改。
3 中斷服務(wù)程序的執(zhí)行與觸發(fā)
  當(dāng)解決以上的兩個(gè)問題后,可以進(jìn)行模擬仿真調(diào)試。但這時(shí)中斷服務(wù)程序不能執(zhí)行,如系統(tǒng)定時(shí)中斷程序;或者不能觸發(fā)中斷,如不能自動觸發(fā)SPI中斷程序等。由于已經(jīng)把Flash存儲器的起始地址調(diào)到了0x00000000處,所以也需要把中斷向量偏移量地址設(shè)為0x00000000,即把SCB-﹥VTOR設(shè)為0?赏ㄟ^如下方法解決。
①對于通過訪問SCB-﹥VTOR寄存器來修改中斷向量的,可通過“Edit”菜單命令中的“Find inFiles”命令查找SCB-﹥VTOR,查找并修改宏定義FLASH_BASE的值為0X00000000。
②如果不能通過以上的方法修改SCB-﹥VTOR,可以在進(jìn)入仿真界面后,執(zhí)行中斷程序前,選擇“Peripherals”→“CorePeripherals”→“Nested Vectored InterruptController”命令,打開中斷向量對話框,修改VTO的值為0x00000000。當(dāng)然也可以通過如下的方法完成對外設(shè)寄存器SCB-﹥VTOR的修改,使它的值為0x00000000:當(dāng)進(jìn)入仿真后,在主函數(shù)main()前設(shè)置一個(gè)斷點(diǎn),全速運(yùn)行程序,程序在斷點(diǎn)處暫停執(zhí)行,通過下節(jié)介紹的方法把外設(shè)寄存器SCB-﹥VTOR添加到觀察窗口1,修改SCB-﹥VTOR外設(shè)寄存器的值,使它的值為0x00000000即可。
③對于SysTick定時(shí)器,可以自動觸發(fā)中斷,并執(zhí)行中斷程序,但對于其他的中斷則不能自動觸發(fā)中斷?砂慈缦路椒ú僮鳎涸谥袛喑绦蛑性O(shè)一個(gè)斷點(diǎn),并“全速”運(yùn)行程序,通過選擇“Peripherals”→“CorePeripherals”→“Nested Vectored InterruptController”命令,打開中斷向量對話框,單擊選擇相應(yīng)的中斷,然后勾選Pending復(fù)選框,此時(shí)會自動執(zhí)行相應(yīng)的中斷服務(wù)程序,并在斷點(diǎn)處暫停執(zhí)行程序。
4 外設(shè)寄存器的修改
  在模擬仿真時(shí),一般要對外設(shè)寄存器進(jìn)行修改,有些外設(shè)寄存器可直接修改,有些外設(shè)寄存器不能直接修改,如只讀位不能直接修改。要實(shí)現(xiàn)對外設(shè)寄存器的修改,可通過如下的方法進(jìn)行操作。
①對于要修改的寄存器,可通過鼠標(biāo)選擇外設(shè)寄存器,如選擇RCC-﹥CR,然后再鼠標(biāo)右鍵,彈出右鍵菜單,執(zhí)行“Add‘RCC-﹥CR’to…”→“Watch 1”菜單命令,把RCC-﹥CR外設(shè)寄存器添加到觀察窗口1中,如下所示。
  此時(shí)可在編輯框中修改該外設(shè)寄存器的值。當(dāng)然也可在觀察窗口中,直接輸入外設(shè)寄存器的名稱“RCC-﹥CR”,但此種方法對某些芯片會失效。
②用以上方法也不能完成外設(shè)寄存器的修改時(shí),可通過如下方法完成修改。停止仿真,單擊,打開“Options”對話框,切換到“Target”選項(xiàng)卡,確保特殊功能寄存器(sfr)文件已被添加。然后單擊的下拉箭頭,選擇并添加所要觀察的外設(shè),如RCC等,可添加觀察多個(gè)外設(shè)。單擊添加的外設(shè)寄存器,可在下方顯示該外設(shè)寄存器的存儲器地址,如RCC-﹥CR外設(shè)寄存器的地址為0x40023800。最后再選擇“View”→“Memory Windows”→“Memory1”打開存儲器觀察窗口,在地址欄中輸入地址“0x40023800”,按回車鍵確認(rèn)輸入,在數(shù)據(jù)區(qū)雙擊數(shù)據(jù)可直接修改。STM32的存儲器采用小端模式,即低地址存放數(shù)據(jù)的低位,高地址存放數(shù)據(jù)的高位。在存儲器窗口中,可通過右鍵修改顯示方式。
結(jié)語
  目前最新的MDK版本也未能解決在模擬仿真時(shí)出現(xiàn)的上述問題,通過本文介紹的方法則可以解決,這對于學(xué)習(xí)STM32,以及使用MDK軟件都有一定的幫助。以上介紹的方法是一個(gè)全面的描述,不是所有的芯片都需要通過以上步驟來完成,有的只需要部分操作即可完成。
劉勇軍(講師),主要從事單片機(jī)與嵌入式系統(tǒng)方面的研究與教學(xué);楊選成(講師),主要從事電路系統(tǒng)方面的研究與教學(xué)。
(責(zé)任編輯:高珍 收修改稿日期:2013-04-24)

回復(fù)

使用道具 舉報(bào)

ID:43342 發(fā)表于 2016-9-10 08:20 | 顯示全部樓層
謝謝分享!
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表