实验3
EXPERIMENT 3


C语言实验





3.1实验目的
 熟悉在Keil 工具中编写C语言程序; 
 熟悉C语言程序的调试。
3.2实验设备
1. 硬件
PC一台。
2. 软件
(1) Windows 7/8/10系统; 
(2) Keil μVision5集成开发环境。
3.3实验内容
在Keil 工具中通过C语言完成sum=1+2+…+10的程序编写,并在仿真模式下进行调试。
3.4实验预习
 复习C语言编程; 
 学习在Keil 工具下如何建立工程及配置。
3.5实验原理
在调试该C语言程序时,配置本实验教材所使用的开发板,或以仿真模式运行。
3.6实验步骤
3.6.1创建工程
在Keil工具中创建一个新工程,在实验2创建工程的基础上在USR中添加main函数。
3.6.2修改配置 




单击如图3.1所示方框中的按钮,打开配置界面。


图3.1打开配置界面按钮


切换到Debug选项卡,如图3.2所示。


图3.2Debug选项卡






将选项卡中的内容改为如图3.3所示,注意粗黑框标注的内容,具体修改见下文。


图3.3需要修改Debug选项卡的内容


其中: 
Use Simulator代表要使用软件模拟仿真。
Dialog DLL的内容是DARMSTM.DLL,表示使用STM系列。
Parameter的内容是“pSTM32F429IGT6”,这里匹配的是当前开发板的型号。
Initialization File,该选项可以配置映射一些地址,从而实现对STM32开发板不同功能的模拟仿真。一个典型的Initialization File内容如下: 


map 0x40000000,0x4000ffff read write

map 0x40010000,0x4001ffff read write

map 0x40020000,0x4002ffff read write

map 0x48000000,0x4800ffff read write


在工程文件夹下新建init.ini文件,将上述4行内容添加到这个文件中,在Debug选项卡的Initialization File选项下添加该文件。
在该文件中,我们设置了4段地址映射,使得可以实现模拟某些功能。一个大致的地址功能映射表如图3.4所示。


图3.4部分存储器的映射


上面只是截取了部分存储器的映射情况,这是AHB1的地址。例如,如果需要使用RCC功能,那么可以看到0x40021000至0x400213FF这部分地址需要有读写属性,可以在Initialization File中添加相应映射地址的字段来启用读写。注意: 该地址对于不同型号的开发板会有变化。
Debug选项卡中的内容修改完毕后,单击OK按钮完成配置。
3.6.3跟踪变量
配置完成后,就可以通过Debug进行仿真了。本次实验中,我们通过一个简单的累加来仿真,验证程序的正确性。main.c文件内容如下: 


#include "stm32f4xx.h"



static int x=0;   //需要跟踪的变量x,设置为全局变量,局部变量无法用分析器跟踪

int main(void)

{

while(1){

int i;

x=0;

for(i=0; i < 10; ++i){

x ++;   //每次加1直至加到10

}

}

}


在编写好程序后,单击Keil左上角的Build或Rebuild按钮进行编译,如图3.5所示。


图3.5重新编译


在如图3.6所示的Output框中看到无错误(0 Error(s))提示后即编译成功。


图3.6重新编译成功的Output框


编译完成后,单击Debug按钮,然后单击分析器按钮,如图3.7所示。


图3.7打开Debug窗口并启用分析器


单击分析器左上角的Setup按钮,如图3.8所示。


图3.8单击Setup按钮


在如图3.9所示界面中单击右上角标识处添加变量x(如果已经有则不用添加,关闭此框即可),添加完毕后单击Close按钮。


图3.9添加变量


在分析器中左侧看到变量x,即添加成功,如图3.10所示。请注意,需要在分析器中跟踪的变量必须为全局变量,若设置为局部变量,则可能无法添加到分析器中。


图3.10添加变量成功




图3.11设置仿真变量的最大/最小值

因为分析器展示的默认范围非常广(和变量类型上下限有关),因此需要设置自动调整范围以更好地展现值的变化。在分析器窗口中空白位置右击,选中Adaptive Min/Max选项,如图3.11所示。
单击Keil左上角的Run按钮,可以看到分析器中出现波形,如图3.12所示。


图3.12观察变量的波形


可以看到,波形从0~10以阶梯形式上升,符合程序设定,每次加1直到10的结果是一致的。
请注意,如果Initialization File没有被加载或者没有正确配置地址,那么在Command窗口会出现如图3.13所示的错误信息。此时需要重新配置Initialization File。


图3.13初始文件配置错误信息


此外,还有一种在设置变量时失败的情况,是在最新版Keil μVision5中,默认的ARM编译器会使用版本6的编译器,在该版本的编译器进行编译后,在Debug选项卡的Setup里无法设置变量,提示Unknown Signal。解决方案是在Target选项卡中将ARM Compiler切换到版本5或以下的版本,如图3.14所示。


图3.14切换ARM编译器版本


3.7实验参考程序



#include "stm32f4xx.h"



static int x=0;   //需要跟踪的变量x,设置为全局变量,局部变量无法用分析器跟踪

int main(void)

{

while(1){

int i;

x=0;

for(i=0; i < 10; ++i){

x ++;   //每次加1直至加到10

}

}

}


3.8实验总结
本实验给出了如何使用Keil软件进行仿真的例子: 从Keil软件仿真器中模拟运行一个简单的累加计算。初学者经过本节的实验理解和体验STM32的仿真过程,熟练掌握Keil软件的STM32系列开发板的仿真器使用方法。
3.9思考题
(1) 尝试通过配置其他映射地址,启用GPIO引脚,观察GPIO引脚高低电平变化。
(2) 使用Debug模式下的Watch功能观察变量的变化,并比较和仿真分析器的相同和不同点。
(3) 查阅资料了解不同型号的STM32的地址映射配置。