第一篇:0837嵌入式体系结构综合实验报告
重庆理工大学
嵌入式体系结构综合实验报告
题目:基于LPC2114的定时数据采集与通讯程序设计
二级学院 计算机科学与工程学院 专 业 计算机科学与技术
班 级 0837-1 学生姓名 冉晨 学号 10803070119 教 师 刘政 时 间 2010/11/14 成 绩
目录
一、实验名称-------------3
二、实验目的-------------3
三、实验设备与环境----3
四、实验基本原理-------3
五、实验内容(包括主要算法分析与流程图)--4
六、实验源程序及分析-5
七、实验运行结果及分析-----------------------------7
八、实验心得体会-------8
一、实验名称
基于LPC2114的定时数据采集与通讯程序设计
二、实验目的
使用EasyARM2114板上AIN0和AIN1输入模拟量, 定时1mS中断采样,然后采样的电压每秒通过UART串口传送到PC机串口助手显示.三、实验设备与环境
EasyARM2114实验板,PC机,Windows XP操作系统, H-JTAG串口,实验相关数据线, ARM Developer Suite相关软件,串口调试助手.四、实验基本原理
本设计任务选用了Philips的LPC2114微处理器作为现场控制的核心。设计采用定时中断方式,要求每1ms采集一点,LPC2114将采集所转换的数据存储在ADDR(A/D数据存储器)中, A/D采样结果也采用中断读取.然后程序通过SPI实现UART通讯, 传送到PC机串口助手显示, 其中的电压值为实际采样值,每秒显示完后换行,同时要求串口发送采用中断.五、实验内容(包括主要算法分析与流程图)
设置P0,P1,P0.27,P0.28连接定时器初始化初始化串口模式A/D初始化数据采集并传送显示(每秒换行)中断 该实验最主要的算法实现在于中断的实现(包括实现UART的中断和数据采集后的A/D采样结果),结合代码分析: void __irq IRQ_ADC(){
count++;
if(count%2==1)
{
ADC_Data=ADDR;//存入寄存器数据
ADC_Data=(ADC_Data>>6)&0x3FF;
ADC_Data=ADC_Data*3300;
ADC_Data=ADC_Data/1024;//换算
sum1+=ADC_Data;//存入电压AIN0总值
}
else
{
ADC_Data=ADDR;
ADC_Data=(ADC_Data>>6)&0x3FF;
ADC_Data=ADC_Data*3300;
ADC_Data=ADC_Data/1024;//换算
sum2+=ADC_Data;// 存入电压AIN1总值
}
VICVectAddr=0x00;//通知VIC中断处理结束 } 关于ADC的初始化: void ADC_Init(){
ADCR=
(3)
//选择通道
((Fpclk/1000000-1)<<8)
(0<<16)
(0<<17)
(1<<21)
//PDN=1模式为正常工作
(0<<22)
(1<<26)
(1<<27)
//EDGE=1
VICVectCntl2=0x32;
VICVectAddr=(uint32)IRQ_ADC;
VICVIntEnable |=0x00040000;
}
六、实验源程序及分析
#include“config.h” #include“stdio.h” #define UART_BPS 115200 uint8 comERR;int count=0;uint32 ADC_Data;long sun1=0,sum2=0;int v1=0,v2=0;int pSd=0,pRd=0;char SdBuff[100],RdBuff[20];void Time0Init()//定时器初始化 {
T0PR=9;
T0MCR=0x03;
T0MR1=1106/2;
T0TCR=0x03;
T0TCR=0x01;
T0EMR=0xC0;
} void __irq IRQ_UART_Exception()//通讯发送中断 {
switch(U0IIR&0x0f)
{
case 0x06:
comERR=U0LSR;
break;
case 0x04:
while((U0LSR & 0x01)==1)
{
RdBuff[pRd++]=U0RBR;
if(pRd>=100)pRd=0;
}
break;
case 0x0c:
while((U0LSR&0x01)==1)
{
RdBuff[pRd++]=U0RBR;
if(pRd>=100)pRd=0;
}
break;
case 0x02:
if(SdBuff[pSd]!=' ')U0THR=SdBuff[pSd++];
break;
}
VICVectAddr=0x00;
} void UART0_SendStr()//输出到显示屏 {
sprintf(SdBuff,“Voltage0 is %dmV
Voltage0 is %dmVn”,v1,v2);
for(pSd=0;pSd<16;pSd++)U0THR=SdBuff[pSd];} void UART0_Ini()//初始化串口模式 {
uint16 Fdiv;
U0LCR=0x03;
Fdiv=(Fpclk/16)/UART_BPS;
U0DLM=Fdiv/256;
U0DLL=Fdiv%256;
U0LCR=0x03;
U0LER=ox07;
U0FCR=0x87;
VICVectCntl1=0x26;
VICVectAddr1=(uint32)IRQ_UART_Exception;
VICIntEnable |=0x00000040;} void __irq IRQ_ADC()//内部中断 {
count++;
if(count%2==1)
{
ADC_Data=ADDR;
ADC_Data=(ADC_Data>>6)&0x3FF;
ADC_Data=ADC_Data*3300;
ADC_Data=ADC_Data/1024;
sum1+=ADC_Data;
}
else
{
ADC_Data=ADDR;
ADC_Data=(ADC_Data>>6)&0x3FF;
ADC_Data=ADC_Data*3300;
ADC_Data=ADC_Data/1024;
sum2+=ADC_Data;
}
VICVectAddr=0x00;} void ADC_Init()//A/D初始化 {
ADCR=
(3)
|
((Fpclk/1000000-1)<<8)|
(0<<16)
|
(0<<17)
|
(1<<21)
|
(0<<22)
|
(1<<26)
|
(1<<27)
|
VICVectCntl2=0x32;
VICVectAddr=(uint32)IRQ_ADC;
VICVIntEnable |=0x00040000;
} int main(){ //设置引脚
PINSEL0=0x00000005;
PINSEL1=0x01400000;
VICIntEnable=0x00000000;
Time0Init();
UART0_Ini();
ADC_Init();
while(1)
{
if(count>=1000)
{
v1=sum1/500;
v2=sum2/500;
count=0;
sum1=0;
sum2=0;
UART0_SendStr();
}
}
return 0;}
七、实验运行结果及分析
由UART串口发送至屏幕显示,每秒输出后中断直接换行.八、实验心得体会
通过该次实验,我对LPC2114有了比较全面的研究.由于内置了宽范围的串行通信接口,它们也非常适合于通信网关、协议转换器、嵌入式软件调制解调器以及其它各种类型的应用。给我比较深刻的印象的功能就是UART通讯方面.这次实验让我对UART发送信息的过程有了一个全面的了解,对SPI接口的使用有了一个初步的认识.但是仍然还是有很多不理解的地方,比如中断的详细流程和实现,都比较模糊.我想应该能在以后的学习中逐步地完善,达到进步.总之,这次实验让我收获颇丰,对嵌入式也有了一个理性的认识.9
第二篇:体系结构实验报告
中南大学软件学院
学生姓名:所在学院:学生学号:学生班级:指导老师:完成日期:
软件体系结构 设计模式实验报告
宋昂
软件学院 3901080115 软件0801 刘伟 2010-12-7
一、实验目的
熟练使用PowerDesigner和任意一种面向对象编程语言实现几种常见的设计模式,包括简单工厂模式、工厂方法模式、抽象工厂模式、单例模式和适配器模式,理解每一种设计模式的模式动机,掌握模式结构,学习如何使用代码实现这些模式,并学会分析这些模式的使用效果。
二、实验内容
使用PowerDesigner和任意一种面向对象编程语言实现简单工厂模式、工厂方法模式、抽象工厂模式、单例模式和适配器模式,包括根据实例绘制模式结构图、编写模式实例实现代码,运行并测试模式实例代码。
(1)简单工厂模式
使用简单工厂模式设计一个可以创建不同几何形状(Shape)的绘图工具类,如可创建圆形(Circle)、方形(Rectangle)和三角形(Triangle)对象,每个几何图形都要有绘制draw()和擦除erase()两个方法,要求在绘制不支持的几何图形时,提示一个UnsupportedShapeException,绘制类图并编程实现。
(2)简单工厂模式
使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数“M”,则返回一个Man对象,如果传入参数“W”,则返回一个Woman对象,使用任意一种面向对象编程语言实现该场景。现需要增加一个新的Robot类,如果传入参数“R”,则返回一个Robot对象,对代码进行修改并注意女娲的变化。
(3)工厂方法模式
某系统日志记录器要求支持多种日志记录方式,如文件记录、数据库记录等,且用户可以根据要求动态选择日志记录方式,现使用工厂方法模式设计该系统。用代码实现日志记录器实例,如果在系统中增加一个中的日志记录方式——控制台日志记录(ConsoleLog),绘制类图并修改代码,注意增加新日志记录方式过程中原有代码的变化。
ClientLogFactory+createLog(): Log...Log+writeLog(): void...FileLogFactory+createLog(): Log...DatabaseLogFactory+createLog(): Log...<
现需要设计一个程序来读取多种不同类型的图片格式,针对每一种图片格式都设计一个图片读取器(ImageReader),如GIF图片读取器(GifReader)用于读取GIF格式的图片、JPG图片读取器(JpgReader)用于读取JPG格式的图片。图片读取器对象通过图片读取器工厂ImageReaderFactory来创建,ImageReaderFactory是一个抽象类,用于定义创建图片读取器的工厂方法,其子类GifReaderFactory和JpgReaderFactory用于创建具体的图片读取器对象。使用工厂方法模式实现该程序的设计。
(5)抽象工厂模式
某系统为了改进数据库操作的性能,自定义数据库连接对象Connection和语句对象Statement,可针对不同类型的数据库提供不同的连接对象和语句对象,如提供Oracle或SQL Server专用连接类和语句类,而且用户可以通过配置文件等方式根据实际需要动态更换系统数据库。使用抽象工厂模式设计该系统。用代码模拟实现数据库操作工厂实例,要求可以通过配置文件改变数据库类型。
DBFactory+createConnection(): Connection+createStatement(): Statement...ConnectionOracleFactory+createConnection(): Connection+createStatement(): Statement...OracleConnectionMySQLConnectionMySQLFactory+createConnection(): Connection+createStatement(): Statement...OracleStatementStatementMySQLStatement(6)抽象工厂模式
计算机包含内存(RAM)、CPU等硬件设备,根据下面的“产品等级结构-产品族”示意图,使用抽象工厂模式实现计算机设备创建过程并绘制相应的类图。
产品族一个产品族PcCPUPcRAMPcMacMacCPUMacRAMCPU(7)单例模式
RAM产品等级结构
使用单例模式的思想实现多例模式,确保系统中某个类的对象只能存在有限个,如两个或三个,设计并编写代码实现一个多例类。
(8)单例模式
使用单例模式设计一个多文档窗口(注:在Java AWT/Swing开发中可使用JDesktopPane和JInternalFrame来实现),要求在主窗体中某个内部子窗体只能实例化一次,即只能弹出一个相同的子窗体,如下图所示:
(注:用C#或C++实现类似功能也可以)
(9)适配器模式
现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[], int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法,类BinarySearch 的binarySearch(int[], int)方法实现了二分查找算法。现使用适配器模式设计一个系统,在不修改源代码的情况下将类QuickSort和类BinarySearch的方法适配到DataOperation接口中。绘制类图并编程实现。(要求实现快速排序和二分查找)
(10)适配器模式
使用任意一种面向对象编程语言实现一个双向适配器实例,使得猫可以学狗叫,狗可以学猫抓老鼠。绘制相应类图并使用代码编程模拟。
三、实验要求
1.正确无误绘制简单工厂模式、工厂方法模式、抽象工厂模式、单例模式和适配器模式实例的模式结构图;
2.使用任意一种面向对象编程语言实现简单工厂模式、工厂方法模式、抽象工厂模式、单例模式和适配器模式实例,代码运行正确无误。
四、实验步骤
1.熟悉PowerDesigner15的常用功能;
2.使用PowerDesigner绘制简单工厂模式实例结构图并用面向对象编程语言实现该模式实例;
3.使用PowerDesigner绘制工厂方法模式实例结构图并用面向对象编程语言实现该模式实例;
4.使用PowerDesigner绘制抽象工厂模式实例结构图并用面向对象编程语言实现该模式实例;
5.使用PowerDesigner绘制单例模式实例结构图并用面向对象编程语言实现该模式实例; 6.使用PowerDesigner绘制适配器模式结构图并用面向对象编程语言实现该模式。
五、实验结果
(1)简单工厂模式1:
类图:
结果:
(2)简单工厂模式2: 类图:
结果:
(3)工厂方法模式1 类图:
结果:
(4)工厂方法模式2 类图:
结果:
(5)抽象工厂模式1 类图:
结果:
(6)抽象工厂模式2 类图:
结果:
(7)单例模式1 类图:
结果:
(8)单例模式1 类图:
结果:
(9)适配器模式1 类图:
结果:
(10)适配器模式2 类图:
结果:
六、实验总结
通过一段时间的对设计模式的学习和练习,我深刻的意识到了一个好的软件往往是设计模式巧妙运用的结果。要学好设计模式,就必须得彻底理解设计模式,要能够看懂设计模式中的类图,如果要是设计模式中的类图都看不懂,那学好设计模式只是天方夜谭了。从开始学习设计模式到现在我们大概已经学了10种左右的设计模式了,每一种都有着它独特的优点,但是事情往往都是有两面性的,它们也存在着缺点,怎么去用好设计模式对我们来说是一门学问,我们有必要花时间和精力去学好它。
第三篇:嵌入式实验报告
目录
实验一 跑马灯实验.........................................................................1 实验二 按键输入实验.....................................................................3 实验三 串口实验.............................................................................5 实验四 外部中断实验.....................................................................8 实验五 独立看门狗实验................................................................11 实验七 定时器中断实验................................................................13 实验十三 ADC实验........................................................................15 实验十五 DMA实验........................................................................17 实验十六 I2C实验........................................................................21 实验十七 SPI实验........................................................................24 实验二十一 红外遥控实验............................................................27 实验二十二 DS18B20实验.............................................................30
实验一 跑马灯实验
一.实验简介
我的第一个实验,跑马灯实验。
二.实验目的
掌握STM32开发环境,掌握从无到有的构建工程。
三.实验内容
熟悉MDK KEIL开发环境,构建基于固件库的工程,编写代码实现跑马灯工程。通过ISP下载代码到实验板,查看运行结果。使用JLINK下载代码到目标板,查看运行结果,使用JLINK在线调试。
四.实验设备
硬件部分:PC计算机(宿主机)、亮点STM32实验板、JLINK。软件部分:PC机WINDOWS系统、MDK KEIL软件、ISP软件。
五.实验步骤
1.熟悉MDK KEIL开发环境 2.熟悉串口编程软件ISP 3.查看固件库结构和文件
4.建立工程目录,复制库文件 5.建立和配置工程 6.编写代码 7.编译代码
8.使用ISP下载到实验板 9.测试运行结果
10.使用JLINK下载到实验板 11.单步调试
12.记录实验过程,撰写实验报告
六.实验结果及测试
源代码:
两个灯LED0与LED1实现交替闪烁的类跑马灯效果,每300ms闪烁一次。
七.实验总结
通过本次次实验我了解了STM32开发板的基本使用,初次接触这个开发板和MDK KEILC软件,对软件操作不太了解,通过这次实验了解并熟练地使用MDK KEIL软件,用这个软件来编程和完成一些功能的实现。作为 STM32 的入门第一个例子,详细介绍了STM32 的IO口操作,同时巩固了前面的学习,并进一步介绍了MDK的软件仿真功能。
实验二 按键输入实验
一.实验简介
在实验一的基础上,使用按键控制流水灯速度,及使用按键控制流水灯流水方向。
二.实验目的
熟练使用库函数操作GPIO,掌握中断配置和中断服务程序编写方法,掌握通过全局变量在中断服务程序和主程序间通信的方法。
三.实验内容
实现初始化GPIO,并配置中断,在中断服务程序中通过修改全局变量,达到控制流水灯速度及方向。
使用JLINK下载代码到目标板,查看运行结果,使用JLINK在线调试。
四.实验设备
硬件部分:PC计算机(宿主机)、亮点STM32实验板、JLINK、示波器。软件部分:PC机WINDOWS系统、MDK KEIL软件、ISP软件。
五.实验步骤
1在实验1代码的基础上,编写中断初始化代码
2在主程序中声明全局变量,用于和中断服务程序通信,编写完成主程序 3编写中断服务程序
4编译代码,使用JLINK下载到实验板 5.单步调试
6记录实验过程,撰写实验报告
六.实验结果及测试
源代码:
我们将通过MiniSTM32 板上载有的3个按钮,来控制板上的2个LED,其中KEY0控制LED0,按一次亮,再按一次,就灭。KEY1 控制LED1,效果同KEY0。KEY_2(KEY_UP),同时控制LED0 和LED1,按一次,他们的状态就翻转一次。
七.实验总结
通过本次实验,我学会了如何使用STM32 的IO 口作为输入用。TM32 的IO 口做输入使用的时候,是通过读取IDR 的内容来读取IO 口的状态的。这里需要注意的是 KEY0 和KEY1 是低电平有效的,而WK_UP 是高电平有效的,而且要确认WK_UP 按钮与DS18B20 的连接是否已经断开,要先断开,否则DS18B20 会干扰WK_UP按键!并且KEY0 和KEY1 连接在与JTAG 相关的IO 口上,所以在软件编写的时候要先禁用JTAG 功能,才能把这两个IO 口当成普通IO 口使用。
实验三 串口实验
一.实验简介
编写代码实现串口发送和接收,将通过串口发送来的数据回送回去。
二.实验目的
掌握STM32基本串口编程,进一步学习中断处理。
三.实验内容
编写主程序,初始化串口1,设置波特率为9600,无校验,数据位8位,停止位1位。编写中断服务程序代码实现将发送过来的数据回送。
四.实验设备
硬件部分:PC计算机(宿主机)、亮点STM32实验板、JLINK、示波器。
软件部分:PC机WINDOWS系统、MDK KEIL软件、ISP软件、串口调试助手。
五.实验步骤
1编写串口初始化代码
2编写中断服务程序代码
3编译代码,使用JLINK或ISP下载到实验板 4记录实验过程,撰写实验报告
六.实验结果及测试
源代码:
把代码下载到 MiniSTM32 开发板,可以看到板子上的LED0 开始闪烁,说明程序已经在跑了。接着我们打开串口调试助手,看到如下信息:
证明串口数据发送没问题。接着,我们在发送区输入上面的文字,输入完后按回车键。然后单击发送,可以得到如下结果:
七.实验总结
通过本次实验,我进一步了解了串口的使用,学会了通过串口发送和接收数据,将通过串口发送来的数据回送回去。该实验的硬件配置不同于前两个实验,串口 1 与USB 串口默认是分开的,并没有在PCB上连接在一起,需要通过跳线帽来连接一下。这里我们把P4 的RXD 和TXD 用跳线帽与P3 的PA9 和PA10 连接起来。
实验四 外部中断实验
一.实验简介
STM32 的 IO 口在本章第一节有详细介绍,而外部中断在第二章也有详细的阐述。这里我们将介绍如何将这两者结合起来,实现外部中断输入。
二.实验目的
进一步掌握串口编程,进一步学习外部中断编程,提高编程能力。
三.实验内容
初始化IO口的输入,开启复用时钟,设置IO与中断的映射关系,从而开启与IO口相对应的线上中断事件,设置触发条件。配置中断分组(NVIC),并使能中断,编写中断服务函数。
四.实验设备
硬件部分:PC计算机(宿主机)、亮点STM32实验板、JLINK、示波器。
软件部分:PC机WINDOWS系统、MDK KEIL软件、ISP软件、串口调试助手。
五.实验步骤
1.2.3.4.编写中断服务程序代码 使用ISP下载到实验板 测试运行结果
记录实验过程,撰写实验报告
六.实验结果及测试
源代码:
打开串口助手。
七.实验总结
首先需要将IO设置为中断输入口: 1)初始化 IO 口为输入。
2)开启 IO 口复用时钟,设置 IO 口与中断线的映射关系。
3)开启与该 IO口相对的线上中断/事件,设置触发条件。
4)配置中断分组(NVIC),并使能中断。
5)编写中断服务函数。
这一节,使用的是中断来检测按键,通过 WK_UP 按键实现按一次 LED0 和 LED 1 同时翻转,按 KEY0 翻转 LED0,按 KEY1 翻转 LED1。
试验中外部中断函数不能进入的原因分析 : 1)GPIO或者AFIO的时钟没有开启。2)GPIO和配置的中断线路不匹配。3)中断触发方式和实际不相符合。
4)中断处理函数用库函数时,写错,经常可能出现数字和字母之间没有下划线。5)外部中断是沿触发,有可能不能检测到沿,比如 中断线是低电平(浮空输入),触发是下降沿触发,可能会出现一直是低电平,高电平的时候是一样的情况,电平持续为高电平。
6)没有用软件中断来触发外部中断,调用函数EXTI_GenerateSWInterrupt;,因为软件中断先于边沿中断处理。
实验五 独立看门狗实验
一. 实验简介
独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效。窗口看门狗由从APB1时钟分频后得到的时钟驱动,通过可配置的时间窗口来检测应用程序非正常的过迟或过早的操作。
二.实验目的
通过编程,编写一个独立看门狗驱动程序
三.实验内容
启动 STM32 的独立看门狗,从而使能看门狗,在程序里面必须间隔一定时间喂狗,否则将导致程序复位。利用这一点,我们本章将通过一个 LED 灯来指示程序是否重启,来验证 STM32 的独立看门狗。
四.实验设备
硬件部分:PC计算机(宿主机)、亮点STM32实验板、JLINK。
软件部分:PC机WINDOWS系统、MDK KEIL软件、ISP软件、串口调试助手。
五.实验步骤
1.2.3.4.参考教材独立看门狗部分,编写独立看门狗驱动程序。建立和配置工程 编写代码
使用ISP下载到实验板
记录实验过程,撰写实验报告
六.实验结果及测试
源代码:
在配置看门狗后,看到LED0 不停的闪烁,如果WK_UP 按键按下,就喂狗,只要WK_UP 不停的按,看门狗就一直不会产生复位,保持LED0 的常亮,一旦超过看门狗定溢出时间(Tout)还没按,那么将会导致程序重启,这将导致LED0 熄灭一次。
七.实验总结
通过本次实验,我掌握了启动独立看门狗的步骤: 1)向 IWDG_KR 写入 0X5555。2)向 IWDG_KR 写入 0XAAAA。3)向 IWDG_KR 写入 0XCCCC。
通过上面 3个步骤,启动 STM32 的看门狗,从而使能看门狗,在程序里面就必须间隔一定时间喂狗,否则将导致程序复位。利用这一点,本章通过一个LED 灯来指示程序是否重启,来验证 STM32 的独立看门狗。在配置看门狗后,LED0 将常亮,如果 WK_UP 按键按下,就喂狗,只要 WK_UP 不停的按,看门狗就一直不会产生复位,保持 LED 0 的常亮,一旦超过看门狗溢出时间(Tout)还没按,那么将会导致程序重启,这将导致 LED 0 熄灭一次。
实验七 定时器中断实验
一. 实验简介
STM32 的定时器是一个通过可编程预分频器(PSC)驱动的 16 位自动装载计数器(CNT)构成。STM32 的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)等。使用定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形周期可以在几微秒到几毫秒间调整。STM32 的每个通用定时器都是完全独立的,没有互相共享的任何资源。
二.实验目的
熟练掌握定时器中断,学会对定时器中断的编程操作。
三.实验内容
使用定时器产生中断,然后在中断服务函数里面翻转 LED1 上的电平,来指示定时器中断的产生,修改中断时间。
四.实验设备
硬件部分:PC计算机(宿主机)、亮点STM32实验板、JLINK。
软件部分:PC机WINDOWS系统、MDK KEIL软件、ISP软件、串口调试助手。
五.实验步骤
1.参考教材定时器中断部分,编写定时器中断的驱动程序。2.编写主程序
3.编译代码,使用JLINK或ISP下载到实验板 4.记录实验过程,撰写实验报告
六.实验结果及测试
源代码:
七.实验总结
通过本次实验,认识到时间中断来控制LED灯的闪烁,同时也可以将时间中断应用到控制其他的程序块。
以TIME3为例产生中断的步骤为 1)TIM3 时钟使能。
2)设置 TIM3_ARR 和 TIM3_PSC 的值。
3)设置 TIM3_DIER 允许更新中断。
4)允许 TIM3 工作。
5)TIM3 中断分组设置。6)编写中断服务函数。
在中断产生后,通过状态寄存器的值来判断此次产生的中断属于什么类型。然后执行相关的操作,我们这里使用的是更新(溢出)中断,所以在状态寄存器 SR 的最低位。在处理完中断之后应该向 TIM3_SR 的最低位写 0,来清除该中断标志。
实验十三 ADC实验
一.实验简介
通过DAC将STM32系统的数字量转换为模拟量。使用ADC将模拟量转换为数字量。
二.实验目的
掌握DAC和ADC编程。
三.实验内容
编写代码实现简单的DAC单次发送
编写代码实现ADC采集DAC发送的数据,并发送到串口
四.实验设备
硬件部分:PC计算机(宿主机)、亮点STM32实验板、JLINK。
软件部分:PC机WINDOWS系统、MDK KEIL软件、ISP软件、串口调试助手。
五.实验步骤
1编写主程序
2编译代码,使用JLINK或ISP下载到实验板,使用串口调试助手观察数据 3记录实验过程,撰写实验报告
六.实验结果及测试
源代码:
七.实验总结
本节将利用 STM32的 ADC1 通道 0 来采样外部电压值,并在串口调试助手中显示出来。步骤如下:
1)开启 PA 口时钟,设置 PA0 为模拟输入。
2)使能 ADC1 时钟,并设置分频因子。
3)设置 ADC1 的工作模式。
4)设置 ADC1 规则序列的相关信息。
5)开启 AD 转换器,并校准。
6)读取 ADC 值。
在上面的校准完成之后,ADC 就算准备好了。接下来我们要做的就是设置规则序列 0 里面的通道,然后启动 ADC 转换。在转换结束后,读取 ADC1_DR 里面的值。
通过以上几个步骤的设置,可以正常的使用 STM32 的 ADC1 来执行 AD 转换操作。
通过本次实验的学习,我们了解了STM32 ADC的使用,但这仅仅是STM32强大的ADC 功能的一小点应用。STM32 的ADC 在很多地方都可以用到,其ADC 的DMA 功能是很不错的,实验十五 DMA实验
一. 实验简介
直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。
二.实验目的
熟练掌握DMA编程,学会对EPC02的读写操作,学习双缓冲兵乓操作,理解互斥资源。提高编程能力。
三.实验内容
利用外部按键KEY0 来控制DMA 的传送,每按一次KEY0,DMA 就传送一次数据
到USART1,然后在串口调试助手观察进度等信息。LED0 还是用来做为程序运行的指示灯。
这里我们使用到的硬件资源如下: 1)按键KEY0。2)指示灯LED0。
3)使用串口调试助手观察数据
四.实验设备
硬件部分:PC计算机(宿主机)、亮点STM32实验板、JLINK。
软件部分:PC机WINDOWS系统、MDK KEIL软件、ISP软件、网络调试助手。
五.实验步骤
1编写主程序
2编译代码,使用JLINK或ISP下载到实验板,使用串口调试助手观察数据 3记录实验过程,撰写实验报告
六.实验结果及测试
源代码:
伴随 LED0 的不停闪烁,提示程序在运行。我们打开串口调试助手,然后按KEY0,可以看到串口显示如下内容:
七.实验总结
本节利用 STM32 的 DMA 来实现串口数据传送,DMA通道的配置需要: 1)设置外设地址。
2)设置存储器地址。
3)设置传输数据量。
4)设置通道 4 的配置信息。
5)使能 DMA1 通道 4,启动传输。
通过以上 5 步设置,我们就可以启动一次 USART1 的 DMA 传输了。
DMA控制器对DMA请求判别优先级及屏蔽,向总线裁决逻辑提出总线请求。当CPU执行完当前总线周期即可释放总线控制权。此时,总线裁决逻辑输出总线应答,表示DMA已经响应,通过DMA控制器通知I/O接口开始DMA传输。
DMA控制器获得总线控制权后,CPU即刻挂起或只执行内部操作,由DMA控制器输出读写命令,直接控制RAM与I/O接口进行DMA传输。
在DMA控制器的控制下,在存储器和外部设备之间直接进行数据传送,在传送过中不需要中央处理器的参与。开始时需提供要传送的数据的起始位置和数据长度。
当完成规定的成批数据传送后,DMA控制器即释放总线控制权,并向I/O接口发出结束信号。当I/O接口收到结束信号后,一方面停 止I/O设备的工作,另一方面向CPU提出中断请求,使CPU从不介入的状态解脱,并执行一段检查本次DMA传输操作正确性的代码。最后,带着本次操作结果及状态继续执行原来的程序。
由此可见,DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为RAM与I/O设备开辟一条直接传送数据的通路,使CPU的效率大为提高。
实验十六 I2C实验
一.实验简介
编程实现对使用I2C接口的EPC02芯片进行写和读操作。
二.实验目的
熟练掌握I2C编程,学会对EPC02的读写操作。
三.实验内容
编写I2C驱动程序,使用驱动程序初始化EPC02,判断设备正确性。
写256个0x5A到EPC02,读出并发送给串口,通过串口调试助手判别是否读到的都是0x5A.四.实验设备
硬件部分:PC计算机(宿主机)、亮点STM32实验板、JLINK。
软件部分:PC机WINDOWS系统、MDK KEIL软件、ISP软件、串口调试助手。
五.实验步骤
1参考教材I2C部分,编写I2C驱动程序。2编写主程序
3编译代码,使用JLINK或ISP下载到实验板 4记录实验过程,撰写实验报告
六.实验结果及测试
伴随 LED0 的不停闪烁,提示程序在运行。我们先按下KEY0,可以看到如下所示的内容,证明数据已经被写入到24C02了。
接着我们按KEY2,可以看我们刚刚写入的数据被显示出来了,如下图所示:
源代码:
七.实验总结
IIC是由数据线 SDA 和时钟 SCL 构成的串行总线,可发送和接收数据。在 CPU 与被控 IC 之间、IC 与 IC 之间进行双向传送,高速 IIC 总线一般可达 400kbps 以上。
IIC总线在传送数据过程中共有三种类型信号,它们分别是:开始信号、结束信号和应答信号。这些信号中,起始信号是必需的,结束信号和应答信号,都可以不要。程序在开机的时候会检测 24C02 是否存在,如果不存在则会在TFTLCD 模块上显示错误信息,同时LED0 慢闪。大家可以通过跳线帽把PC11 和PC12 短接就可以看到报错了。通过本次实验,我掌握了如何使用IIC写入与读出数据,学习了编写I2C驱动程序,使用驱动程序初始化EPC02,判断设备正确性,以及如何在助手上显示。
实验十七 SPI实验
一.实验简介
编程实现对SPI接口的W25Q64进行读写操作。
二.实验目的
熟练掌握SPI编程,学会对的W25Q64读写操作。
三.实验内容
1.2.3.4.5.编写SPI驱动程序 初始化SPI接口
读取SPIFLASH的ID,如果正确继续,否则报错
向SPIFALSH地址0x12AB00开始写一串字符,再读出比较判断是否与写入的一致 向SPIFALSH地址0x12AB00开始写连续256个字节的0x5A,然后读出并发送给串口,通过串口调试助手判别是否读到的都是0x5A.四.实验设备
硬件部分:PC计算机(宿主机)、亮点STM32实验板、JLINK。
软件部分:PC机WINDOWS系统、MDK KEIL软件、ISP软件、串口调试助手。
五.实验步骤
1参考SPI及SPI FLASH部分,编写SPI及SPI FLASH驱动程序(可参考书上代码)。2编写主程序
3编译代码,使用JLINK或ISP下载到实验板 4记录实验过程,撰写实验报告
六.实验结果及测试
源代码:
伴随 LED0 的不停闪烁,提示程序在运行。我们先按下KEY0,可以看到如图13.17.4.2 所示的内容,证明数据已经被写入到W25X16了。
接着我们按KEY2,可以看我们刚刚写入的数据被显示出来了,如下图所示:
七.实验总结
SPI 接口主要应用在EEPROM,FLASH,实时时钟,AD 转换器,还有数字信号处理器和数字信号解码器之间。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为 PCB 的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议,STM32 也有 SPI 接口。
SPI 的设置步骤:
1)配置相关引脚的复用功能,使能 SPI时钟。
2)设置 SPI 工作模式。
3)使能 SPI。
程序在开机的时候会检测 W25X16 是否存在,如果不存在则会在TFTLCD 模块上显示错误信息,同时LED0 慢闪。大家可以通过跳线帽把PA5 和PA6 短接就可以看到报错了。通过本实验,我掌握了编写SPI程序写入和读取FLASH的方法,掌握了对学会对的W25Q64读写操作。对STM32开发板有了进一步的了解。
实验二十一 红外遥控实验
一. 实验简介
编程实现通过在 ALIENTEK MiniSTM32 开发板上实现红外遥控器的控制。
二.实验目的
掌握编程实现红外遥控控制开发板的方法。
三.实验内容
1.编写红外遥控驱动程序 2.编写红外遥控程序代码 3.使用红外遥控控制开发板
四.实验设备
硬件部分:PC计算机(宿主机)、亮点STM32实验板、JLINK。软件部分:PC机WINDOWS系统、MDK KEIL软件、ISP软件。
五.实验步骤
4.编写红外遥控驱动程序 5.编写红外遥控程序代码
6.编译代码,使用JLINK或ISP下载到实验板 7.记录实验过程,撰写实验报告
六.实验结果及测试
源代码:
使用串口调试助手观察数据
七.实验总结
红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用到计算机系统中。
通过本节实验,我学习到了如何编程使用红外遥控控制,在本程序中只是简单地输出一个数值,在以后的应用中可以实现更强大的功能,比如用红外远程输入控制开发板进行一些操作。对STM32有了进一步的认识。
实验二十二 DS18B20实验
一. 实验简介
一. 在ALIENTEK MiniSTM32 开发板上,通过 DS18B20 来读取环境温度值。
二.实验目的
巩固SPI编程。掌握使用感应器获取环境温度的方法。
三.实验内容
1.复位脉冲和应答脉冲
2.写时序
3.读时序
四.实验设备
硬件部分:PC计算机(宿主机)、亮点STM32实验板、JLINK。软件部分:PC机WINDOWS系统、MDK KEIL软件、ISP软件。
五.实验步骤
1.2.3.4.参考教材DS18B20编程部分,编写DS18B20驱动程序 编写主程序
编译代码,使用JLINK或ISP下载到实验板 记录实验过程,撰写实验报告
六.实验结果及测试
源代码:
使用串口调试助手观察数据:
七.实验总结
DS18B20 是由 DALLAS 半导体公司推出的一种的“一线总线”接口的温度传感器。与传统的热敏电阻等测温元件相比,它是一种新型的体积小、适用电压宽、与微处理器接口简单的数字化温度传感器。
通过本次实验,我认识到STM32的强大,在开发板上可以添加其他感应器从而实现更强大的功能。添加了DS18B20后的开发板可以感应外界的温度,通过公式计算显示出来。
第四篇:嵌入式实验报告
嵌入式系统及应用课 程设计报告
姓名:陈宥祎
班级:14级计算机01班 学号:1255010116 指导老师:黄卫红
按键输入实验
一.实验简介
在实验一的基础上,使用按键控制流水灯速度,及使用按键控制流水灯流水方向。
二.实验目的
熟练使用库函数操作GPIO,掌握中断配置和中断服务程序编写方法,掌握通过全局变量在中断服务程序和主程序间通信的方法。
三.实验内容
实现初始化GPIO,并配置中断,在中断服务程序中通过修改全局变量,达到控制流水灯速度及方向。
使用JLINK下载代码到目标板,查看运行结果,使用JLINK在线调试。
四.实验设备
硬件部分:PC计算机(宿主机)、亮点STM32实验板、JLINK、示波器。软件部分:PC机WINDOWS系统、MDK KEIL软件、ISP软件。
五.实验步骤
1在实验1代码的基础上,编写中断初始化代码
2在主程序中声明全局变量,用于和中断服务程序通信,编写完成主程序 3编写中断服务程序
4编译代码,使用JLINK下载到实验板 5.单步调试
6记录实验过程,撰写实验报告
六.实验结果及测试
源代码:
我们将通过MiniSTM32 板上载有的3个按钮,来控制板上的2个LED,其中KEY0控制LED0,按一次亮,再按一次,就灭。KEY1 控制LED1,效果同KEY0。KEY_2(KEY_UP),同时控制LED0 和LED1,按一次,他们的状态就翻转一次。
七.实验总结
通过本次实验,我学会了如何使用STM32 的IO 口作为输入用。TM32 的IO 口做输入使用的时候,是通过读取IDR 的内容来读取IO 口的状态的。这里需要注意的是 KEY0 和KEY1 是低电平有效的,而WK_UP 是高电平有效的,而且要确认WK_UP 按钮与DS18B20 的连接是否已经断开,要先断开,否则DS18B20 会干扰WK_UP按键!并且KEY0 和KEY1 连接在与JTAG 相关的IO 口上,所以在软件编写的时候要先禁用JTAG 功能,才能把这两个IO 口当成普通IO 口使用。
串口通信
一.实验简介
编写代码实现串口发送和接收,将通过串口发送来的数据回送回去。
二.实验目的
掌握STM32基本串口编程,进一步学习中断处理。
三.实验内容
编写主程序,初始化串口1,设置波特率为9600,无校验,数据位8位,停止位1位。编写中断服务程序代码实现将发送过来的数据回送。
四.实验设备
硬件部分:PC计算机(宿主机)、亮点STM32实验板、JLINK、示波器。
软件部分:PC机WINDOWS系统、MDK KEIL软件、ISP软件、串口调试助手。
五.实验步骤
1编写串口初始化代码
2编写中断服务程序代码
3编译代码,使用JLINK或ISP下载到实验板 4记录实验过程,撰写实验报告
六.实验结果及测试
源代码:
把代码下载到 MiniSTM32 开发板,可以看到板子上的LED0 开始闪烁,说明程序已经在跑了。接着我们打开串口调试助手,看到如下信息:
证明串口数据发送没问题。接着,我们在发送区输入上面的文字,输入完后按回车键。然后单击发送,可以得到如下结果:
七.实验总结
通过本次实验,我进一步了解了串口的使用,学会了通过串口发送和接收数据,将通过串
口发送来的数据回送回去。该实验的硬件配置不同于前两个实验,串口 1 与USB 串口默认是分开的,并没有在PCB上连接在一起,需要通过跳线帽来连接一下。这里我们把P4 的RXD 和TXD 用跳线帽与P3 的PA9 和PA10 连接起来。
外部中断
一.实验简介
STM32 的 IO 口在本章第一节有详细介绍,而外部中断在第二章也有详细的阐述。这里我们将介绍如何将这两者结合起来,实现外部中断输入。
二.实验目的
进一步掌握串口编程,进一步学习外部中断编程,提高编程能力。
三.实验内容
初始化IO口的输入,开启复用时钟,设置IO与中断的映射关系,从而开启与IO口相对应的线上中断事件,设置触发条件。配置中断分组(NVIC),并使能中断,编写中断服务函数。
四.实验设备
硬件部分:PC计算机(宿主机)、亮点STM32实验板、JLINK、示波器。
软件部分:PC机WINDOWS系统、MDK KEIL软件、ISP软件、串口调试助手。
五.实验步骤
1.2.3.4.编写中断服务程序代码 使用ISP下载到实验板 测试运行结果
记录实验过程,撰写实验报告
六.实验结果及测试
源代码:
打开串口助手。
七.实验总结
首先需要将IO设置为中断输入口: 1)初始化 IO 口为输入。
2)开启 IO 口复用时钟,设置 IO 口与中断线的映射关系。
3)开启与该 IO口相对的线上中断/事件,设置触发条件。
4)配置中断分组(NVIC),并使能中断。
5)编写中断服务函数。
这一节,使用的是中断来检测按键,通过 WK_UP 按键实现按一次 LED0 和 LED 1 同时翻转,按 KEY0 翻转 LED0,按 KEY1 翻转 LED1。试验中外部中断函数不能进入的原因分析 : 1)GPIO或者AFIO的时钟没有开启。2)GPIO和配置的中断线路不匹配。3)中断触发方式和实际不相符合。
4)中断处理函数用库函数时,写错,经常可能出现数字和字母之间没有下划线。5)外部中断是沿触发,有可能不能检测到沿,比如 中断线是低电平(浮空输入),触发是下降沿触发,可能会出现一直是低电平,高电平的时候是一样的情况,电平持续为高电平。
6)没有用软件中断来触发外部中断,调用函数EXTI_GenerateSWInterrupt;,因为软件中断先于边沿中断处理。
独立看门狗实验
一. 实验简介
独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效。窗口看门狗由从APB1时钟分频后得到的时钟驱动,通过可配置的时间窗口来检测应用程序非正常的过迟或过早的操作。
二.实验目的
通过编程,编写一个独立看门狗驱动程序
三.实验内容
启动 STM32 的独立看门狗,从而使能看门狗,在程序里面必须间隔一定时间喂狗,否则将导致程序复位。利用这一点,我们本章将通过一个 LED 灯来指示程序是否重启,来验证 STM32 的独立看门狗。
四.实验设备
硬件部分:PC计算机(宿主机)、亮点STM32实验板、JLINK。
软件部分:PC机WINDOWS系统、MDK KEIL软件、ISP软件、串口调试助手。
五.实验步骤
1.2.3.4.参考教材独立看门狗部分,编写独立看门狗驱动程序。建立和配置工程 编写代码
使用ISP下载到实验板
记录实验过程,撰写实验报告
六.实验结果及测试
源代码:
在配置看门狗后,看到LED0 不停的闪烁,如果WK_UP 按键按下,就喂狗,只要WK_UP 不停的按,看门狗就一直不会产生复位,保持LED0 的常亮,一旦超过看门狗定溢出时间(Tout)还没按,那么将会导致程序重启,这将导致LED0 熄灭一次。
七.实验总结
通过本次实验,我掌握了启动独立看门狗的步骤: 1)向 IWDG_KR 写入 0X5555。2)向 IWDG_KR 写入 0XAAAA。3)向 IWDG_KR 写入 0XCCCC。
通过上面 3个步骤,启动 STM32 的看门狗,从而使能看门狗,在程序里面就必须间隔一定时间喂狗,否则将导致程序复位。利用这一点,本章通过一个LED 灯来指示程序是否重启,来验证 STM32 的独立看门狗。在配置看门狗后,LED0 将常亮,如果 WK_UP 按键按下,就喂狗,只要 WK_UP 不停的按,看门狗就一直不会产生复位,保持 LED 0 的常亮,一旦超过看门狗溢出时间(Tout)还没按,那么将会导致程序重启,这将导致 LED 0 熄灭一次。
第五篇:嵌入式实验报告
西安邮电大学
嵌入式处理器及应用实验报告书
学院名称学生姓名专业名称班
级
: : : :
实验一
ADS 1.2 集成开发环境练习
一、实验目的:
了解ADS 1.2 集成开发环境的使用方法。
二、实验内容:
1.建立一个新的工程。
2.建立一个C源文件,并添加到工程中。3.设置文本编辑器支持中文。4.编译链接工程。5.调试工程。
三、实验步骤:
1.启动ADS 1.2 IDE集成开发环境,选择File—New,使用ARM Executable Image工程模板建立一个工程,工程名称为ADS。
2.选择File—New建立一个新的文件TEST1.S,设置直接添加到项目中,输入程序代码。3.由于ADS安装后默认字体是Courier New,对于中文支持不完善,因此建议修改字体。选择Edit—Perferences,在Font选项设置字体为Fixedsys,Script为CHINESE_GB2312。建议在Tab Inserts Spaces前打勾,使Tab键插入的是多个空格。
4.选择Edit—DebugRel Settings,在DebugRel Settings对话框的左边选择ARM Linker项,然后在Output页设置连接地址ROBase 为0x40000000,RW Base 为0x40003000,在Options页设置调试入口地址Image entry point 为 0x40000000。5.选择Project—Make,将编译链接整个工程。
6.选择Project—Debug,或单击快捷键F5,IDE环境就会启动AXD调试软件。
四、程序清单:
AREA
Example1,CODE,READONLY
;声明代码段Example1
ENTRY
;标识程序入口
CODE32
;声明32 位ARM 指令
START
MOV
R0,#15
;设置参数
MOV
R1,#8
ADDS
R0,R0,R1
;R0 = R0 + R1
B
START
END
五、心得体会:
通过本次实验,我熟悉了ADS 1.2 集成开发环境,学会了怎样建立工程,在工程里面建立文件和进行最基本的运行操作。我感触最深的是每次软件的开始使用是最关键的,想要掌握一个软件的使用必须进行多次的练习,多练几遍自然而然的会熟练的操作。
实验二
存储器访问指令练习实验
一、实验目的:
1.了解ADS 1.2 集成开发环境及ARMulator软件仿真。
2.掌握ARM7TDMI汇编指令的用法,并能编写简单的汇编程序。3.掌握指令的条件执行以及使用LDR/STR指令完成存储器的访问。
二、实验内容:
1.使用LDR指令读取0x40003100上的数据,将数据加1,若结果小于10,则使用STR指令把结果回写原地址;若结果大于或等于10,则把0写回原地址。
2.使用ADS 1.2软件仿真,单步、全速运行程序,设置断点,打开寄存器窗口(Processor Registers)监视R0和R1的值,打开存储器观察窗口(Memory)监视0x40003100上的值。
三、实验步骤:
1.启动ADS 1.2,使用ARM Executable Image工程模板建立一个工程Instruction2。2.建立汇编源文件TEST2.S,编写实验程序,然后添加到工程中。
3.设置工程链接地址ROBase 为0x40000000,RW Base 为0x40003000。设置调试入口地址Image entry point 为 0x40000000。
4.编译链接工程,选择Project —Debug,启动AXD进行软件仿真调试。
5.打开寄存器窗口(Processor Registers),选择Current 项监视R0和R1的值。打开存储器观察窗口(Memory)设置观察地址为0x40003100,显示方式Size为32Bit,监视0x40003100地址上的值。
四、程序清单:
COUNT
EQU
0x40003100
;定义一个变量,地址为0x40003100
AREA
Example2,CODE,READONLY;声明代码段Example2
ENTRY
;标识程序入口
CODE32
;声明32 位ARM 指令
START
LDR
R1,=COUNT
;R1 <= COUNT
MOV
R0,#0
;R0 <= 0
STR
R0,[R1]
;[R1] <= R0,即设置COUNT 为0
LOOP
LDR
R1,=COUNT
LDR
R0,[R1]
;R0 <= [R1]
ADD
R0,R0,#1
;R0 <= R0 + 1
CMP
R0,#10
;R0 与 10 比较,影响条件码标志
MOVHS
R0,#0
;若R0 大于等于 10,则此指令执行,R0 <= 0
STR
R0,[R1]
;[R1] <= R0,即保存COUNT
B
LOOP
END
五、心得体会:通过本次实验,让我更深一步的了解了ADS 1.2 集成开发环境及ARMulator软件仿真。通过对程序的解读,我掌握一些汇编指令的写法,同时也提高了我的读程序的能力。本次实验中我遇到了一个问题,在工程里加载文件的时候,没注意文件的后缀应为“。S”,结果造成文件加载失败。
实验三
数据处理指令练习实验
一、实验目的:
1.掌握ARM数据处理指令的使用方法。2.了解ARM指令灵活的第2个操作数。
二、实验内容:
1.使用MOV和MVN指令访问ARM通用寄存器。
2.使用ADD、SUB、AND、ORR、CMP和TST等指令完成数据加减运算及逻辑运算。
三、实验步骤:
1)启动ADS1.2,使用ARM Executable Image 工程模板建立一个工程Instruction3。2)建立汇编源文件TEST3.S ,编写实验程序,然后添加到工程中。
3)设置工程链接地址RO Base为0x40000000,RW Base为0x40003000。设置调试入口地址Image entry point 为 0x40000000。
4)编译链接工程,选择Project —Debug,启动AXD进行软件仿真调试。5)打开寄存器窗口(Processor Registers),选择Current 项监视各寄存器的值。6)单步运行程序,观察寄存器值的变化。
四、程序清单:
X
EQU
;定义X 的值为11
Y
EQU
;定义Y 的值为8
BIT23
EQU
(1<<23)
;定义BIT23 的值为0x00800000
AREA
Example3,CODE,READONLY
;声明代码段Example3
ENTRY
;标识程序入口
CODE32
;声明32 位ARM 指令
START
;使用MOV、ADD 指令实现:R8 = R3 = X + Y
MOV
R0,#X
;R0 <= X,X 的值必须是8 位图数据
MOV
R1,#Y
;R1 <= Y,Y 的值必须是8 位图数据
ADD
R3,R0,R1
;即是R3 = X + Y
MOV
R8,R3
;R8 <= R3
;使用MOV、MVN、SUB 指令实现:R5 = 0x5FFFFFF8y;
;
break;
;
case
7: x = key * y;
;
break;
;
default: x = 168;
SWITCH
CASE_0
CASE_2
CASE_3
CASE_5
CASE_7
;
break;;};设x 为R0,y 为R1,key 为R2(x、y、key 均为无符号整数)MOV
R1,#3
;初始化y 的值
MOV
R2,#2
;初始化key 的值
AND
R2,R2,#0x0F
;switch(key&0x0F)
CMP
R2,#0
;case 0:
CMPNE
R2,#2
;case 2:
MPNE
R2,#3
;case 3:
BNE
CASE_5
ADD
R0,R2,R1
;
x = key + y
B
SWITCH_END
;
break
CMP
R2,#5
;case 5:
BNE
CASE_7
SUB
R0,R2,R1
;
x = key1)*4 SvcStackSpace +(SVC_STACK_LEGTH1)*4 FiqStackSpace +(FIQ_STACK_LEGTH1)*4
UndtStackSpace +(UND_STACK_LEGTH-1)*4
;分配堆栈空间
AREA
MyStacks, DATA, NOINIT, ALIGN=2
UsrStackSpace
SPACE
USR_STACK_LEGTH * 4
;用户(系统)模式堆栈空间
SvcStackSpace
SPACE
SVC_STACK_LEGTH * 4
;管理模式堆栈空间
IrqStackSpace
SPACE
IRQ_STACK_LEGTH * 4
;中断模式堆栈空间
FiqStackSpace
SPACE
FIQ_STACK_LEGTH * 4
;快速中断模式堆栈空间
AbtStackSpace
SPACE
ABT_STACK_LEGTH * 4
;中止义模式堆栈空间
UndtStackSpace
SPACE
UND_STACK_LEGTH * 4
;未定义模式堆栈
END
五、心得体会:通过本次实验,我较好的掌握了如何使用MRS/MSR指令实现ARM微控制器工作模式的切换。较好的了解了在各个工作模式下的寄存器。
实验六
C语言程序实验
一、实验目的:
通过实验了解使用ADS 1.2编写C语言程序,并进行调试。
二、实验内容:
编写一个汇编程序文件和一个C程序文件。汇编程序的功能是初始化堆栈指针和初始化C程序的运行环境,然后跳转到C程序运行,这就是一个简单的启动程序。C程序使用加法运算来计算1+2+3+…+(N-1)+N的值(N为0时,结果为0;N为1时,结果为1)。
三、实验步骤:
1.启动ADS1.2,使用ARM Executable Image 工程模板建立一个工程ProgramC。2.建立汇编源文件Startup.s和Test.c,编写实验程序,然后添加到工程中。
3.设置工程链接地址RO Base为0x40000000,RW Base为0x40003000。设置调试入口地址Image entry point 为 0x40000000。
4.设置位于开始位置的起始代码段:选择Edit—DebugRel Settings,在DebugRel Settings对话框的左边选择ARM Linker项,然后在Layout页设置Object/Symbol为Startup.o,Section为Start。
5.编译链接工程,选择Project—Debug,启动AXD进行软件仿真调试。6.在Startup.s的“B Main”处设置断点,然后全速运行程序。
7.程序在断点处停止。单步运行程序,判断程序是否跳转到C程序中运行。
选择Processor Views—Variables打开变量观察窗口,观察全局变量的值,然后单步/全速运行程序,判断程序的运算结果是否正确。
四、程序清单:
#define uint8
unsigned char
#define uint32
unsigned int
#define N
uint32 sum;
// 使用加法运算来计算 1+2+3+...+(N-1)+N 的值。(N>0)
void Main(void)
{ uint32 i;
sum = 0;
for(i=0;i<=N;i++)
{ sum += i;
}
while(1);
}
程序清单3.9
简单的起动代码
;起动文件。初始化 C 程序的运行环境,然后进入C 程序代码。
IMPORT
|Image$$RO$$Limit|
IMPORT
|Image$$RW$$Base|
IMPORT
|Image$$ZI$$Base|
IMPORT
|Image$$ZI$$Limit|
IMPORT
Main
;声明C 程序中的Main()函数
AREA
Start,CODE,READONLY
;声明代码段Start
ENTRY
;标识程序入口
CODE32
;声明32 位ARM 指令
Reset
LDR
SP,=0x40003F00
;初始化C 程序的运行环境
LDR
R0,=|Image$$RO$$Limit|
LDR
R1,=|Image$$RW$$Base|
LDR
R3,=|Image$$ZI$$Base|
CMP
R0,R1
BEQ
LOOP1
LOOP0
CMP
R1,R3
LDRCC
R2,[R0],#4
STRCC
R2,[R1],#4
BCC
LOOP0
LOOP1
LDR
R1,=|Image$$ZI$$Limit|
MOV
R2,#0
LOOP2
CMP
R3,R1
STRCC
R2,[R3],#4
BCC
LOOP2
B
Main
;跳转到 C 程序代码Main()函数
END
五、心得体会:通过本次实验,我学会并掌握使用ADS 1.2编写C语言程序,并进行调试。这次实验不同于前几次,必须在一个工程里面同时加载两个文件,分别是“。c”和“.s”文件。