嵌入式实验报告.docx
- 文档编号:9627191
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:22
- 大小:536.57KB
嵌入式实验报告.docx
《嵌入式实验报告.docx》由会员分享,可在线阅读,更多相关《嵌入式实验报告.docx(22页珍藏版)》请在冰豆网上搜索。
嵌入式实验报告
南京邮电大学通达学院
实验报告
实验名称:
____实验一基于ADS开发环境的程序设计
实验二开发板的认知和GPIO实验____
实验三串行口实验
实验四Linux交叉开发环境的建立___
实验五Makefile编程实验
课程名称嵌入式系统A
班级学号12000401
姓名王婷婷
开课时间2014/2015学年第2学期
实验一基于ADS开发环境的程序设计
一、实验目的
1、学习ADS开发环境的使用;
2、学习和掌握ADS环境下的汇编语言及C语言程序设计;
3、学习和掌握汇编语言及C语言的混合编程方法。
二、实验内容
1、编写和调试汇编语言程序;
2、编写和调试C语言程序;
3、编写和调试汇编语言及C语言的混合程序;
4、编写程序测试多寄存器传送指令的用法。
三、实验原理
汇编语言的基础知识、C语言编程的基础知识
四、实验过程与关键代码分析
例3-5在汇编中使用C定义的全局变量
实验程序:
C程序:
Asm程序:
实验结果:
五、实验小结
通过本次试验,我基本了解了ADS开发环境的使用方法,掌握了如何在ADS开发环境下建立工程、添加C源程序到工程、编译链接和调试C程序,对之前学过的C语言有了更进一步的理解。
实验二开发板的认知和GPIO实验
LED跑马灯
一、实验目的
1、熟悉ADS开发环境。
2、掌握S3C2440A内部相关寄存器的操作方法,最终实现对外部设备的控制。
3、熟悉在ARM裸机环境下的C语言编程。
二、实验设备
FL2440开发板、PC机、JTAG调试板。
三、实验内容
1、建立ADS开发环境。
2、编程实现对开发板上发光二极管LED的跑马灯控制。
四、实验原理
从电路图上我们可以看到,发光二极管LED的一端连接到了ARM的GPIO,另一端经过一个限流电阻接电源VCC。
当GPIO口为低电平时,LED两端产生电压降,这时LED有电流通过并发光。
反之当GPIO为高电平时,LED将熄灭。
注意亮灭之间要有一定的延时,以便人眼能够区分出来。
五、实验过程
实验步骤:
1.准备好实验环境,将JTAG调试板的一端与PC的并口相连,另一端连接到开发板的JTAG接口(在串口0附近)。
2.将串口线的一端插在PC的串口上,另一端插在开发板的‘COM0’上。
打开DNW.EXE软件,给开发板上电,使Bootloader停在菜单处(在系统引导时按空格键)。
3.打开软件‘ADSCodeWarrior’,新建工程‘led.mcp’,并添加两个程序文件‘led.c’和‘init.S’(汇编文件)。
4.对工程文件进行相应设置(参考《开发板准备实验》1.7节)
5.编译该工程,成功后将生成映像文件‘led.axf’。
打开AXD,装载映像文件‘led.axf’。
6.运行程序,观察结果。
实验电路:
如上图所示,通过控制4个GPIO口GPB5、GPB6、GPB8、GPB10,来实现对四个发光二极管LED0、LED1、LED2、LED3亮灭的控制。
实验程序:
/*
本实验接口说明
GPB5------LED0
GPB6------LED1
GPB8------LED2
GPB10------LED3
*/
/*------------------------地址声明---------------------------*/
#defineGPBCON(*(volatileunsigned*)0x56000010)
#defineGPBDAT(*(volatileunsigned*)0x56000014)
#defineGPBUP(*(volatileunsigned*)0x56000018)
#defineucharunsignedchar
#defineuintunsignedint
/*-----------------------定义全局变量------------------------*/
/*-----------------------函数声明----------------------------*/
voidDelay(intx);
/*------------------------------------------------------------/
函数名称:
Delay
功能描述:
延时函数
传参:
intx
返回值:
无
-------------------------------------------------------------*/
voidDelay(intx)
{
intk,j;
while(x)
{
for(k=0;k<=0xff;k++)
for(j=0;j<=0xff;j++);
x--;
}
}
/*-------------------------------------------------------------
函数名称:
ledMain
功能描述:
入口程序
初始化后,进入跑马灯死循环
传参:
无
返回值:
int0
-------------------------------------------------------------*/
intledMain(void)
{
GPBCON=0x1dd7fc;//GPB5,GPB6,GPB8,GPB10设置为输出
GPBDAT=((1<<5)|(1<<6)|(1<<8)|(1<<10));//使LED全灭
GPBDAT&=0xffe;//关闭蜂鸣器
GPBUP=0x00;
while
(1)//死循环
{
GPBDAT=~(1<<5);//LED0亮
Delay(500);
GPBDAT=~(1<<6);//LED1亮
Delay(500);
GPBDAT=~(1<<8);//LED2亮
Delay(500);
GPBDAT=~(1<<10);//LED3亮
Delay(500);
}
return0;
}
AREA|DATA|,CODE,READONLY
ENTRY
ldrr13,=0x1000
IMPORTledMain
bledMain
END
实验结果:
四个发光二极管LED轮流闪烁,最终实现流水灯效果。
修改程序中Delay函数调用的值将改变它们显示的速度,值越大,显示越慢。
六、实验小结
本次实验是第一次做有关开发板的实验,我对实验器材和实验步骤都不太了解,在实验的过程中遇到很多问题。
后来,在老师和同学的帮助下,我连接好开发板,运行程序,观察到实验板上的四个发光二极管轮流闪烁。
除此之外,我还掌握了S3C2440A内部相关寄存器的操作方法,实现了对外部设备的控制。
实验三串行口实验
一、实验目的
1、掌握ARM处理器的串行通信原理
2、通过编程,实现开发板与PC机之间的串行收发数据
二、实验设备
FL2440开发板、ADS1.2开发环境、JTAG调试板、串口连接线。
三、实验内容
编写串口程序,使开发板收到数据后再把数据发回。
四、实验原理
开始前,线路处于空闲状态,送出连续“1”。
传送开始时首先发一个“0”作为起始位,然后出现在通信线桑的时字符的二进制编码数据。
每个字符的数据位长可以约定为:
5位、6位、7位或8位,一般采用ASCII编码,后面时奇偶校验位,根据约定,用奇偶校验位将所传的字符中为“1”的位数凑成奇数个或偶数个。
也可以约定不要奇偶校验,这样就取消奇偶校验位。
最后时表示停止位的“1”信号,这个停止位可以约定连续1位、1.5位或2位的时间宽度。
至此一个字符传送完毕,线路又进入空闲,持续为“1”。
经过一段随机的时间后,下一个字符开始传送。
传输速率:
每一个数据位的宽度定于发送波特率的倒数。
微机异步串行通信中,常用的波特率为110、150、300、600、1200、2400、4800、9600、57600、115200等。
波特率发生器
每个UART的波特率发生器为传输提供了串行移位时钟。
波特率产生器的时钟源可以从S3C2440A的内部系统时钟或UEXTCLK中来选择。
波特率由时钟源(PCLK、FCLK或UEXTCLK)16分频和UART波特率除数寄存器(UBRDIVn)指定的16位除数决定。
UBRDIVn的置可以按照下式确定:
UBRDIVn=(int)(UARTclock/(bps*16))-1
(UARTclock:
PCLK、FCLK或UEXTCLK)
除数的范围为1到(216-1)。
例如,如果波特率为115200bps,UART为40MHz,则UBRDIVn为:
UBRDIVn=(int)(40000000/(115200×16))-1
=(int)(21.7)-1
=22-1
=21
五、实验过程
实验电路:
实验步骤:
1.准备实验环境,将JTAG调试板的25针端与PC的并口相连,另一端(WIGGLER口)通
过20P排线与开发板的JTAG接口(在串口0附近)相连。
2.将串口线的一端插在PC的串口上,另一端插在开发板的COM0上。
打开DNW.EXE软件,
进行相应设置。
给开发板上电并在Bootloader启动时停在菜单处。
3.打开‘ADSCodeWarrior’,在ADSCodeWarrior中打开实验工程serial.mcp.
4.对工程文件进行相应设置(参考《开发板准备实验》1.7节),并对工程进行编译。
5.打开ARM的开发环境AXDDebugger,在AXDDebugger中加载可执行映象文件
‘serial.Axf’。
6.执行映象文件,观察实验结果。
实验程序:
#defineULCON0(*(volatileunsigned*)0X50000000)//UART线控制寄存器
#defineUCON0(*(volatileunsigned*)0X50000004)//UART控制寄存器
#defineUFCON0(*(volatileunsigned*)0X50000008)//FIFO控制寄存器
#defineUTRSTAT0(*(volatileunsigned*)0X50000010)//UART状态寄存器
#defineUBRDIV0(*(volatileunsigned*)0X50000028)//波特率
#defineUTXH0(*(volatileunsigned*)0X50000020)
#defineURXH0(*(volatileunsigned*)0X50000024)
#defineGPBDAT(*(volatileunsigned*)0X58000054)
intTSmain()
{
charbuf;
ULCON0&=0XFFFFFF00;
ULCON0|=0X03;//1位起始位,8位数据位
UCON0=0X0805;//串口时钟PCLK,查询方式
UBRDIV0=0X1A;//波特率115200
while
(1)
{
if(UTRSTAT0&0X01)//接收是否完毕=1结束
{
buf=URXH0;//读取数据
while(!
(UTRSTAT0&0X04));//是否允许发送=1允许
UTXH0=buf;
}
}
return0;
}
AREA|DATA|,CODE,READONLY
ENTRY
ldrr13,=0x1000
IMPORTTSmain
bTSmain
END
实验结果:
六、实验小结
通过本次试验,我了解了ARM处理器的串行通信的原理、传输格式和电气特性,掌握了相关寄存器的配置方法。
此外,我还通过编写串口程序,实现了开发板接收数据后又发回数据。
这为我以后的实验奠定了基础。
实验四Linux交叉开发环境的建立
一、实验目的
1、了解什么是交叉编译。
2、了解交叉编译工具。
3、学会安装及使用交叉编译器。
二、实验设备
PC机
三、实验内容
1、安装交叉编译器。
2、使用交叉编译器编译程序。
四、实验原理
什么是交叉编译
在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。
这个编译过程就叫交叉编译。
简单地说,就是在一个平台上生成另一个平台上的可执行代码。
如keil软件,在keil上编译,但在单片机上运行,典型的交叉编译。
我们在开发板上运行的程序,是在PC机上编译的,所以是交叉编译。
安装交叉编译器
安装交叉编译器,只需将该编译器的解压缩文件放在指定的目录下边。
指定目录为:
/usr/local/arm/
若local下没有arm文件夹,则需要自己建一个。
在使用的时候有两种方式:
(以编译hello.c程序为例,生成可执行文件hello)
1.#/usr/local/arm/3.4.1/bin/arm-linux-gcchello.c–ohello
2.编辑/etc/bashrc文件,
在最后增加路径:
exportPATH=/usr/local/arm/3.4.1/bin:
$PATH,
这样就把/usr/local/arm/3.4.1/bin添加到命令的默认路径,在编译的时候则可直接用如下的命令
#arm-linux-gcchello.c–ohello
五、实验过程、
HelloWorld:
实验程序:
实验结果:
挂载:
六、实验小结
通过这次实验,我对Linux系统有了一个初步的了解,对于课堂学习的知识也有了一定的应用,因此,我实现了理论与实践相结合。
通过实验操作,我了解了嵌入式基本设置及其读写程序,我对硬件设备的设计也有了一定的了解。
在刚开始学习建立Linux交叉开发环境时,我遇到了不少的问题,对于较为复杂的编程以及Linux环境下的很多技巧都知道得很少,花费了很多时间。
我深知,这一块儿知识正是我所欠缺的,在以后的学习中要加强。
实验五Makefile编程实验
一、实验目的
1、了解make命令。
2、了解Makefile。
3、熟悉Makefile编程。
二、实验设备
PC机
三、实验内容
使用Makefile编译程序。
四、实验原理
Makefile文件包含了五部分内容:
显示规则、隐式规则、变量定义、文件指示和注释。
Makefile里的变量就像一个环境变量。
事实上,环境变量在make中也被解释成make的变量。
这些变量对大小写敏感,一般使用大写宇母。
几乎可以从任何地方引用定义的变量。
Makefile中的变量是用一个文本串在Makefile中定义的,这个文本串就是变量的值。
只要在一行的开始写下这个变量的名字,后面跟一个“=”号,以及要设定这个变量的值即可定义变量,下面是定义变量的语法:
VARNAME=string
Make工作时的执行步骤:
(1)读入所有的makefile文件
(2)读入被include包括的其他的makefile文件
(3)初始化文件中的变量
(4)推到隐式规则,并分析所有规则
(5)为所有的目标文件创建依赖关键链
(6)根据依赖关系,决定哪些目标要重新生成
(7)执行生成命令
第
(1)~(5)步为第一个阶段,第(6)~(7)步为第二个阶段。
第一个阶段中,如果定义的变量被使用了,make会在它使用的位置把它展开。
但make并不会马上完全展开,make使用的是拖延战术。
如果变量出现在依赖关系的规则中,进当这条依赖关系决定要使用时,变量才会在其内部展开。
五、实验过程
实验步骤:
1.在某一目录下编辑上述l六个文件test.c、prog.c、code.c、prog.h、code.h、Makefile
2.运行命令#make,生成可执行文件test
3.运行程序./test
实验程序:
#include
externarea(float);
externcircle(float);
main()
{
printf("dgjdkfhgkjfdg\n");
area(2.5);
circle(2.5);
return0;
}
/*******************prog.c****************************************/
#include"prog.h"
#include"code.h"
#include
area(floatr)
{
printf("r=%f\n",r);
printf(format_area,PI*r*r);
printf("gfhfghfh\n");
}
/*************************code.c**********************************/
#include"code.h"
#include
voidcircle(floatr)
{
printf(format_circle,2*PI*r);
}
/************************code.h*************************************/
#definePI3.1415926
#defineformat_circle"circle=%f\n"
/*******************************prog.h*********************************/
#defineformat_area"area=%f\n"
/******************************Makefile**********************************/
test:
prog.ocode.omain.o
gcc-otestprog.ocode.omain.o//注意是tab键缩进
main.o:
test.c
gcc-omain.o-ctest.c
prog.o:
prog.cprog.hcode.h
gcc-cprog.c-oprog.o
code.o:
code.ccode.h
gcc-ccode.c-ocode.o
clean:
rm-f*.o
/*******************makefile(利用预定义变量)另外一种写法*************************/
OBJS=prog.ocode.omain.o
CC=gcc
test:
${OBJS}
${CC}–o$@$^
main.otest.c
prog.o:
prog.cprog.hcode.h
code.o:
code.ccode.h
clean:
rm–f*.o
实验结果:
dgjdkfhgkjfdg
r=2.500000
area=19.634954
gfhfghfh
circle=15.707963
六、实验小结
经过这次实验,我了解了make命令工作时的运行过程,知道了Makefile文件的组成及其变量。
我还学习了Makefile编程,并且通过实验,我认识到,嵌入式系统上C语言编程与普通PC机上C语言编程是不同的。
除此之外,我还掌握了在交叉编译环境下编译嵌入式系统程序的方法。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 实验 报告