摘要: 学习和使用RealViewMDK开发工具及STM32等芯片时,如果每个系列芯片都要购买、制作评估板或开发板的话,经济条件不允许,也不现实。当然也可以在没有硬件的条件下,通过MDK软件的模拟仿真来学习STM32系列芯片的编程,但MDK软件对模拟仿真的支持不是很全面,大部分芯片都不能模拟仿真,必须通过相应的设置和相关的操作,才能完成模拟仿真。
关键词: 模拟仿真;MDK;STM32
中图分类号: TP368.1文献标识码: 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软件在模拟仿真时,不能很好地支持各种STM32系列芯片,目前对STM32F103系列芯片支持模拟仿真,但对于其他系列芯片不支持或只是部分支持。主要存在的问题是:PC和SP不能自动装载,存储器不能访问,中断服务程序不能执行或触发,外设寄存器不能修改或观察。要解决上述问题,必须通过相应的设置和相关的操作,才能完成模拟仿真。
1 模拟仿真的实现及PC和SP的自动装载
在MDK软件中,只有部分STM32芯片支持模拟仿真(如STM32F103),大部分芯片都不支持模拟仿真。主要的问题是,当进入调试界面后,R15(PC)的值为0x00000000,不能进行调试操作(如单步、全速等)。要能对STM32进行模拟仿真,必须使PC的值不能为0。通过分析STM32芯片的存储器结构可知,在存储器地址0x00000000处保存的是堆栈指针SP的值,程序加载时自动把该值送给SP,在存储器地址0x00000004处保存的是程序指针PC的值,程序加载时自动把该值送给PC,程序从该PC值取指令执行程序,而不是从地址0x00000000处执行程序。而STM32芯片的Flash程序存储器地址是从0x08000000处开始的,当进入模拟仿真时,MDK软件不能把Flash的地址送给PC和SP。可通过以下操作步骤完成PC和SP的自动装载。
①打开MDK自带的工程文件,如C:\Keil\ARM\Boards\ST\STM3240GEVAL\Blinky\Blinky.uvproj。
②单击“编译”工具栏上面的下拉菜单,选择“STM32F407 Flash”。
③单击,打开“Options”对话框,切换到“Output”选项卡,勾选“Debug Information”和“BrowseInformation”,用以产生调试信息。再切换到“Debug”选项卡,单击“UseSimulator”,选择模拟仿真,确保勾选“Load Application at Startup”,其他为默认设置。
④单击,编译程序,并保证编译成功。
⑤单击,开始调试,进入调试界面后,观察“Registers”寄存器选项卡中的R15(PC)的值,如果值为0,则说明不能进行模拟仿真,“单步”调试等无效,须进行步骤⑥的操作,否则可不进行步骤⑥的操作。
⑥停止调试,再次单击,打开“Options”对话框,切换到“Target”选项卡,将IROM1的值[0x08000000,0x100000]修改为[0x0,0x100000],以使Flash的起始地址从0x0开始。单击重新编译程序,再次单击,开始调试,PC的值将不再为0,即可进入模拟仿真,“单步”调试等有效。
2 存储器的访问
当进入模拟仿真界面后,按“全速”F5或“单步”F10调试键后,在“command”窗口中将会出现类似如下的错误提示:“*** error 65: access violation at 0x40023800 : no ′read′permission”,意思是在地址0x40023800处访问违例,没有“读”的权限。地址0x40023800是外设寄存器地址。要使外设寄存器地址具有相应的“读”、“写”、“执行”权限,可在命令窗口中输入MAP命令(不区分大小写)。命令格式为:
MAP 起始地址,结束地址 READ WRITEEXEC其中,READ表示“读”权限,WRITE表示“写”权限,EXEC表示“执行”权限,结束地址与起始地址的空间尺寸不超过128MB,即不超过0x08000000字节。外设寄存器的存储空间分布较广,不可能在每次调试时都通过命令窗口输入MAP指令,可通过如下的操作步骤进行。
①新建一个文本文件,打开该文件,执行文件菜单命令“另存为”,在打开的“另存为”对话框中,文件名输入为initmap.ini,保存类型选择为“所有文件”,并保存。在文件中输入如下内容并保存:
map 0x40000000,0x47ffffffreadwrite
map 0x50000000,0x57ffffffreadwrite
map 0xa0000000,0xa7ffffffreadwrite
map 0xf0000000,0xf7f00000 readwrite
根据需要,可在该文件中输入包含所有外设寄存器的MAP命令,使所有外设寄存器都具有“读”、“写”权限。但注意映射空间不要超过0x08000000,否则调试时会提示错误:“*** error 129: MapMemmap size truncated to 128MB”。
②单击,打开“Options”对话框,切换到“Debug”,在“InitializationFile”的右边单击,打开“选择仿真初始化文件”对话框,选择上一步保存的initmap.ini文件。单击“Edit”按扭,可打开文件再次修改。
3 中断服务程序的执行与触发
当解决以上的两个问题后,可以进行模拟仿真调试。但这时中断服务程序不能执行,如系统定时中断程序;或者不能触发中断,如不能自动触发SPI中断程序等。由于已经把Flash存储器的起始地址调到了0x00000000处,所以也需要把中断向量偏移量地址设为0x00000000,即把SCB-﹥VTOR设为0。可通过如下方法解决。
①对于通过访问SCB-﹥VTOR寄存器来修改中断向量的,可通过“Edit”菜单命令中的“Find inFiles”命令查找SCB-﹥VTOR,查找并修改宏定义FLASH_BASE的值为0X00000000。
②如果不能通过以上的方法修改SCB-﹥VTOR,可以在进入仿真界面后,执行中断程序前,选择“Peripherals”→“CorePeripherals”→“Nested Vectored InterruptController”命令,打开中断向量对话框,修改VTO的值为0x00000000。当然也可以通过如下的方法完成对外设寄存器SCB-﹥VTOR的修改,使它的值为0x00000000:当进入仿真后,在主函数main()前设置一个断点,全速运行程序,程序在断点处暂停执行,通过下节介绍的方法把外设寄存器SCB-﹥VTOR添加到观察窗口1,修改SCB-﹥VTOR外设寄存器的值,使它的值为0x00000000即可。
③对于SysTick定时器,可以自动触发中断,并执行中断程序,但对于其他的中断则不能自动触发中断。可按如下方法操作:在中断程序中设一个断点,并“全速”运行程序,通过选择“Peripherals”→“CorePeripherals”→“Nested Vectored InterruptController”命令,打开中断向量对话框,单击选择相应的中断,然后勾选Pending复选框,此时会自动执行相应的中断服务程序,并在断点处暂停执行程序。
4 外设寄存器的修改
在模拟仿真时,一般要对外设寄存器进行修改,有些外设寄存器可直接修改,有些外设寄存器不能直接修改,如只读位不能直接修改。要实现对外设寄存器的修改,可通过如下的方法进行操作。
①对于要修改的寄存器,可通过鼠标选择外设寄存器,如选择RCC-﹥CR,然后再鼠标右键,弹出右键菜单,执行“Add‘RCC-﹥CR’to…”→“Watch 1”菜单命令,把RCC-﹥CR外设寄存器添加到观察窗口1中,如下所示。
此时可在编辑框中修改该外设寄存器的值。当然也可在观察窗口中,直接输入外设寄存器的名称“RCC-﹥CR”,但此种方法对某些芯片会失效。
②用以上方法也不能完成外设寄存器的修改时,可通过如下方法完成修改。停止仿真,单击,打开“Options”对话框,切换到“Target”选项卡,确保特殊功能寄存器(sfr)文件已被添加。然后单击的下拉箭头,选择并添加所要观察的外设,如RCC等,可添加观察多个外设。单击添加的外设寄存器,可在下方显示该外设寄存器的存储器地址,如RCC-﹥CR外设寄存器的地址为0x40023800。最后再选择“View”→“Memory Windows”→“Memory1”打开存储器观察窗口,在地址栏中输入地址“0x40023800”,按回车键确认输入,在数据区双击数据可直接修改。STM32的存储器采用小端模式,即低地址存放数据的低位,高地址存放数据的高位。在存储器窗口中,可通过右键修改显示方式。
结语
目前最新的MDK版本也未能解决在模拟仿真时出现的上述问题,通过本文介绍的方法则可以解决,这对于学习STM32,以及使用MDK软件都有一定的帮助。以上介绍的方法是一个全面的描述,不是所有的芯片都需要通过以上步骤来完成,有的只需要部分操作即可完成。
刘勇军(讲师),主要从事单片机与嵌入式系统方面的研究与教学;杨选成(讲师),主要从事电路系统方面的研究与教学。 |