嵌入式实验报告.docx
《嵌入式实验报告.docx》由会员分享,可在线阅读,更多相关《嵌入式实验报告.docx(20页珍藏版)》请在冰点文库上搜索。
嵌入式实验报告
嵌入式系统设计实验
实验报告
2016.4
一使用μVision集成开发环境——C源代码
1实验步骤
新建一个嵌入式项目主要分为以下几个步骤:
•在菜单栏点击Project,选择新建工程,在打开的对话框中为项目选择所属文件夹和名称,再保存即可。
•在紧接着弹出的selectdevice窗口中选择目标(或使用的)微控制器芯片的型号。
之后软件会自动将相应的启动代码复制到项目所属的文件夹之中。
•按照使用情况设定属性。
•为项目添加文件。
这里我们加入新建的C源代码。
选择File–New菜单创建一个新的源文件。
在编辑器窗口中,我们可以为新建源文件输入源代码。
μVision支持根据文件后名的语法彩色高亮功能。
为了尽快使用该功能,我们在输入源代码前先将空文件保存。
选择File工具栏的保存按钮或使用File–Save菜单,将源文件保存。
•在左侧的文件列表右键点击SourceGroup1,在弹出菜单中选择AddFiletoGroup,按照提示一步步将新建源代码文件添加到当前工程中。
2C源代码
#defineN6
intmain(void)
{
unsignedcharc[6]={1,2,3,4,5,6};
unsignedcharx[6]={4,8,9,3,5,1};
unsignedchari,f;
for(i=0,f=0;i{f=f+c[i]*x[i];}return0;}3调试与运行从图一可以看到,LDSTM命令执行之前,R0地址已经安排好了0-6,此时C数组内还没有赋值,所以其各个元素仍然是任意值。但是到第二步,可以看到,C数组已经完成赋值。图三这一步刚进入循环体,此时f还是初值0x00,i为1。图四循环已经运行一遍,计算得f=f(=0)+c[0]*x[0]=4。循环运行结束时,i=5,f=0x54.二使用μVision集成开发环境——汇编源代码1实验步骤与C语言的工程步骤不同的是,新建文件以.s为后缀。另外,在新建项目这一步不需要添加启动代码。2实验代码AREAFIR,CODE,READONLYCODE32ENTRYMOVR0,#0MOVR8,#0ADRR2,NLDRR1,[R2]MOVR2,#0ADRR3,CADRR5,XLOOPLDRR4,[R3,R8]LDRR6,[R5,R8]MULR9,R4,R6ADDR2,R2,R9ADDR8,R8,#4ADDR0,R0,#1CMPR0,R1BLTLOOPB.ALIGNNDCD&0ACDCD&01,&02,&03,&04,&05,&06,&07,&08,&09,&0AXDCD&01,&02,&03,&04,&05,&06,&07,&08,&09,&0AEND3调试与运行三基于ARM处理器的I/O接口实验——流水灯1实验步骤新建工程等步骤同实验一,在SelectDevice对话框选择NUC710芯片。2实验代码#defineWriteReg(Address,Value)*(unsignedintvolatile*)(Address)=Value#defineuintunsignedint#defineREG_EXT0CON0xFFF01018#defineEBILED_ADDRESS0x78000000voidEBILedSet(uintValue);voidDelay(uintt);intmain(){uinti;WriteReg(REG_EXT0CON,0xF0078003);while(1){for(i=0;i<8;i++){EBILedSet(0x1<Delay(10000000);}}return0;}voidDelay(uintt){do{t--;}while(t);}voidEBILedSet(uintValue){WriteReg(EBILED_ADDRESS,~Value);}3调试与结果通过对0x01的移位操作控制不同led灯亮。部分时刻如下图所示:四基于ARM处理器的I/O接口实验——键盘1实验步骤同实验三。2实验代码#defineu32unsignedint#defineREG_GPIO_CFG20xFFF83020#defineREG_AIC_SCR290xFFF82074#defineREG_AIC_MECR0xFFF82120#defineREG_KPICONF0xFFF88000#defineREG_KPISTATUS0xFFF8800C#defineEBILED_ADDRESS0x78000000#defineREG_EXT0CON0xFFF01018#defineEBI_EXT0_VALUE0xF0078003#defineWriteReg(Address,Value)*(unsignedintvolatile*)(Address)=Value#defineReadReg(Address)*(unsignedintvolatile*)(Address)__irqvoidIRQ_Handler(void){u32KeyValue,temp,temp2;temp=ReadReg(REG_KPISTATUS);temp&=0x0000000f;if(temp>0xB){KeyValue=temp-0xC;}elseif(temp<0x4){KeyValue=temp+0xC;}else{KeyValue=temp;}WriteReg(EBILED_ADDRESS,~KeyValue);}voidKPIInit(void);intmain(void){WriteReg(REG_EXT0CON,EBI_EXT0_VALUE);KPIInit();while(1);return0;}voidKPIInit(void){WriteReg(REG_GPIO_CFG2,0x000aaaaa);WriteReg(REG_AIC_SCR29,0x00000045);WriteReg(REG_AIC_MECR,0x20000000);WriteReg(REG_KPICONF,0x00142fff);}3调试与结果由程序可以分析不同按键对应的二进制码值,进而分析得到对应LED灯的亮灭情况。假设从键盘矩阵左上角的第一个按键从左到右,自上而下编号为:0x00~0x0F,则其对应码值为:(码值为一对应的LED灯亮)0x000x010x020x030x040x050x060x0700001100000011010000111000001111000010000000100100001010000010110x080x090x0A0x0B0x0C0x0D0x0E0x0F0000010000000101000001100000011100000000000000010000001000000011比如按下0x00,0x04,0x05,0x06,0x08几个按键,对比上表可知分别是LED3、4,LED4,LED1、4,LED2、4和LED3亮,分别如下图所示:五基于ARM处理器的I/O接口实验——LCD显示1实验步骤实验步骤与“LED灯闪烁实验”类似,但有两个不同点:在步骤3中不需要新建源文件,直接将“LCD显示实验”提供的实验文件拷贝到实验目录的新建文件夹LCD中;步骤4中将LCD文件夹中的所有文件添加到工程目录中。除此之外,需要利用专门的工具将待显示的图片转化为纯数据格式。2实验源码LCD.c#include/*WinbondW90P710definitions*/#include"GLCD.h"#defineLED_ALL0xffexternunsignedcharBackground[];intmain(void){/*MainFunction*/Reg8(0x78000000)=LED_ALL;/*TurnoffallLEDs*/GLCD_bitmap(0,0,320,240,Background);GLCD_init();}GLCD.c#include/*WinbondW90P710definitions*/#include/*WinbondW90P710LCDdefinitions*/#include#include#ifndef_GLCD_H#define_GLCD_H#defineDELAY_2N4/*----------------------GraphicLCDsizedefinitions------------------------*/#defineWIDTH320/*ScreenWidth(inpixels)*/#defineHEIGHT240/*ScreenHight(inpixels)*/#defineBPP16/*Bitsperpixel*/#defineBYPP((BPP+7)/8)/*Bytesperpixel*/#defineFB_WIDTH(3*WIDTH)/*Framebufferwidth*/#defineFB_HEIGHT240/*Framebufferheight*/#defineFB_SIZE(FB_WIDTH*FB_HEIGHT*BYPP)/*Framebuffersize(inbytes)*//*---------------GraphicLCDinterfacehardwaredefinitions-----------------*//*----------------------------Globalvariables------------------------------*/unsignedchar*fb_start;/*Startaddressofframebuffer*//************************Localauxiliaryfunctions***************************//********************************************************************************Delayinwhileloopcycles**Parameter:cnt:numberofwhilecyclestodelay*嵌入式系统设计*Return:********************************************************************************/staticvoiddelay(intcnt){cnt<<=DELAY_2N;while(cnt--);}/********************************************************************************Waitwhilecontrolofdisplayisbusy**Parameter:**Return:********************************************************************************/staticvoidwait_while_busy(void){Reg32(REG_USI_CNTRL)|=0x01;while(Reg32(REG_USI_CNTRL)&0x01);}/************************Exportedfunctions**********************************//********************************************************************************InitializetheGraphicLCDcontroller**Parameter:**Return:********************************************************************************/voidGLCD_init(void){//unsignedintp;Reg32(REG_GPIO_CFG6)=0x00555555;/*ConfigureLCDGPIO(GPIO30-41)*//*ConfigureLCDcontrollercontrolregister*/Reg32(REG_LCD_LCDCON)|=LCD_LCDCON_LCDTFT|LCD_LCDCON_LCDBUS_24|LCD_LCDCON_CASIOSHOWTYPE_R1G1B1R2G2B2|LCD_LCDCON_LCDTFTTYPE|LCD_LCDCON_RGBSEQ_RBG|LCD_LCDCON_BPP_16;//Reg32(REG_LCD_LCDCON)|=0x000B0C05;delay(200);/*Configuredummydisplaycolorpatternregister*/Reg32(REG_LCD_DDISPCP)=0;/*Configurevaliddisplaywindowstartingcoordinate*/Reg32(REG_LCD_DISPWINS)=0;/*Configurevaliddisplaywindowendingcoordinate*/Reg32(REG_LCD_DISPWINE)=(FB_HEIGHT<<16)|FB_WIDTH;/*ConfigureLCDtiminggeneration*/Reg32(REG_LCD_LCDTCON1)=0x0003B166;Reg32(REG_LCD_LCDTCON2)=0x03BF00F1;Reg32(REG_LCD_LCDTCON3)=0x00105401;Reg32(REG_LCD_LCDTCON4)=0x00020101;Reg32(REG_LCD_LCDTCON5)=0x0000000E;/*ConfigureLCDFIFO1transferparameters*/Reg32(REG_LCD_FIFO1PRM)=LCD_FIFO1PRM_F1BURSTY_16DATABURST|LCD_FIFO1PRM_F1TRANSZ_4BYTE;//0xa/*FIFO1transferdatacountregister*/Reg32(REG_LCD_F1DREQCNT)=((FB_WIDTH<<16)>>1)|FB_HEIGHT;嵌入式系统设计/*FIFO1realcolumncountregister*/Reg32(REG_LCD_FIFO1RELACOLCNT)=FB_WIDTH>>1;/*FIFO1startaddressregister*/Reg32(REG_LCD_F1SADDR)=(unsignedlong)fb_start;/*ConfigureLCDFIFOscontrollerregisterandtiggertheengine*/Reg32(REG_LCD_FIFOCON)=LCD_FIFOCON_FIFOEN_FIFO1;/*LCDControllerEnable*/Reg32(REG_LCD_LCDCON)|=LCD_LCDCON_LCDCEN;/*EnableUSIpinsforcommunicationwithdisplay*/Reg32(REG_GPIO_CFG5)&=0xFFF00FFF;Reg32(REG_GPIO_CFG5)|=0x000AA000;/*Setupcommunicationparameters*/Reg32(REG_USI_DIVIDER)=0x27;/*SCLK=PCLK/80=1MHz*/Reg32(REG_USI_SSR)=0;/*CSactivelow*/Reg32(REG_USI_CNTRL)=0x84;/*16bits;Txfall,Rxriseedge*/Reg32(REG_USI_SSR)|=0x01;/*ActivateCS0*/Reg32(REG_USI_Tx0)=0x0596;/*SetregisterR5*/wait_while_busy();Reg32(REG_USI_SSR)&=0xFE;/*DeactivateCS0*/delay(1);Reg32(REG_USI_SSR)|=0x01;/*ActivateCS0*/Reg32(REG_USI_Tx0)=0x0408;/*SetregisterR4*/wait_while_busy();Reg32(REG_USI_SSR)&=0xFE;/*DeactivateCS0*/delay(1);Reg32(REG_USI_SSR)|=0x01;/*ActivateCS0*/Reg32(REG_USI_Tx0)=0x07F1;/*SetregisterR7*/wait_while_busy();Reg32(REG_USI_SSR)&=0xFE;/*DeactivateCS0*/delay(1);Reg32(REG_USI_SSR)|=0x01;/*ActivateCS0*/Reg32(REG_USI_Tx0)=0x08C0;/*SetregisterR8*/wait_while_busy();Reg32(REG_USI_SSR)&=0xFE;/*DeactivateCS0*/delay(1);Reg32(REG_USI_SSR)|=0x01;/*ActivateCS0*/Reg32(REG_USI_Tx0)=0x0616;/*SetregisterR6*/wait_while_busy();Reg32(REG_USI_SSR)&=0xFE;/*DeactivateCS0*/delay(1);Reg32(REG_USI_SSR)|=0x01;/*ActivateCS0*/Reg32(REG_USI_Tx0)=0x05D7;/*SetregisterR5*/wait_while_busy();Reg32(REG_USI_SSR)&=0xFE;/*DeactivateCS0*/}voidGLCD_bitmap(unsignedintx,unsignedinty,unsignedintw,unsignedinth,unsignedchar*bitmap){unsignedinti,j;unsignedchar*disp_start;unsignedchar*disp_ptr0;unsignedchar*disp_ptr1;unsignedchar*disp_ptr2;unsignedchar*bitmap_ptr;unsignedcharpixel;fb_start=malloc(FB_SIZE);/*InitializeFrameBuffer*/memset(fb_start,0x00,FB_SIZE);/*ClearFrameBuffer*/disp_start=fb_start+(x+y*WIDTH)*BYPP;嵌入式系统设计disp_ptr0=disp_start;disp_ptr1=disp_start+WIDTH*HEIGHT*BYPP;disp_ptr2=disp_start+2*WIDTH*HEIGHT*BYPP;bitmap_ptr=bitmap;for(j=0;jfor(i=0;i
f=f+c[i]*x[i];
}
return0;
3调试与运行
从图一可以看到,LDSTM命令执行之前,R0地址已经安排好了0-6,此时C数组内还没有赋值,所以其各个元素仍然是任意值。
但是到第二步,可以看到,C数组已经完成赋值。
图三这一步刚进入循环体,此时f还是初值0x00,i为1。
图四循环已经运行一遍,计算得f=f(=0)+c[0]*x[0]=4。
循环运行结束时,i=5,f=0x54.
二使用μVision集成开发环境——汇编源代码
与C语言的工程步骤不同的是,新建文件以.s为后缀。
另外,在新建项目这一步不需要添加启动代码。
2实验代码
AREAFIR,CODE,READONLY
CODE32
ENTRY
MOVR0,#0
MOVR8,#0
ADRR2,N
LDRR1,[R2]
MOVR2,#0
ADRR3,C
ADRR5,X
LOOP
LDRR4,[R3,R8]
LDRR6,[R5,R8]
MULR9,R4,R6
ADDR2,R2,R9
ADDR8,R8,#4
ADDR0,R0,#1
CMPR0,R1
BLTLOOP
B.
ALIGN
NDCD&0A
CDCD&01,&02,&03,&04,&05,&06,&07,&08,&09,&0A
XDCD&01,&02,&03,&04,&05,&06,&07,&08,&09,&0A
END
三基于ARM处理器的I/O接口实验——流水灯
新建工程等步骤同实验一,在SelectDevice对话框选择NUC710芯片。
#defineWriteReg(Address,Value)*(unsignedintvolatile*)(Address)=Value
#defineuintunsignedint
#defineREG_EXT0CON0xFFF01018
#defineEBILED_ADDRESS0x78000000
voidEBILedSet(uintValue);
voidDelay(uintt);
intmain()
uinti;
WriteReg(REG_EXT0CON,0xF0078003);
while
(1)
for(i=0;i<8;i++)
EBILedSet(0x1<
Delay(10000000);
voidDelay(uintt)
do
t--;
}while(t);
voidEBILedSet(uintValue)
WriteReg(EBILED_ADDRESS,~Value);
3调试与结果
通过对0x01的移位操作控制不同led灯亮。
部分时刻如下图所示:
四基于ARM处理器的I/O接口实验——键盘
同实验三。
#defineu32unsignedint
#defineREG_GPIO_CFG20xFFF83020
#defineREG_AIC_SCR290xFFF82074
#defineREG_AIC_MECR0xFFF82120
#defineREG_KPICONF0xFFF88000
#defineREG_KPISTATUS0xFFF8800C
#defineEBI_EXT0_VALUE0xF0078003
#defineReadReg(Address)*(unsignedintvolatile*)(Address)
__irqvoidIRQ_Handler(void)
u32KeyValue,temp,temp2;
temp=ReadReg(REG_KPISTATUS);
temp&=0x0000000f;
if(temp>0xB)
KeyValue=temp-0xC;
elseif(temp<0x4)
KeyValue=temp+0xC;
else
KeyValue=temp;
WriteReg(EBILED_ADDRESS,~KeyValue);
voidKPIInit(void);
WriteReg(REG_EXT0CON,EBI_EXT0_VALUE);
KPIInit();
(1);
voidKPIInit(void)
WriteReg(REG_GPIO_CFG2,0x000aaaaa);
WriteReg(REG_AIC_SCR29,0x00000045);
WriteReg(REG_AIC_MECR,0x20000000);
WriteReg(REG_KPICONF,0x00142fff);
由程序可以分析不同按键对应的二进制码值,进而分析得到对应LED灯的亮灭情况。
假设从键盘矩阵左上角的第一个按键从左到右,自上而下编号为:
0x00~0x0F,则其对应码值为:
(码值为一对应的LED灯亮)
0x00
0x01
0x02
0x03
0x04
0x05
0x06
0x07
00001100
00001101
00001110
00001111
00001000
00001001
00001010
00001011
0x08
0x09
0x0A
0x0B
0x0C
0x0D
0x0E
0x0F
00000100
00000101
00000110
00000111
00000000
00000001
00000010
00000011
比如按下0x00,0x04,0x05,0x06,0x08几个按键,对比上表可知分别是LED3、4,LED4,LED1、4,LED2、4和LED3亮,分别如下图所示:
五基于ARM处理器的I/O接口实验——LCD显示
实验步骤与“LED灯闪烁实验”类似,但有两个不同点:
在步骤3中不需要新建源文件,直接将“LCD显示实验”提供的实验文件拷贝到实验目录的新建文件夹LCD中;步骤4中将LCD文件夹中的所有文件添加到工程目录中。
除此之外,需要利用专门的工具将待显示的图片转化为纯数据格式。
2实验源码
LCD.c
#include/*WinbondW90P710definitions*/
#include"GLCD.h"
#defineLED_ALL0xff
externunsignedcharBackground[];
intmain(void){/*MainFunction*/
Reg8(0x78000000)=LED_ALL;/*TurnoffallLEDs*/
GLCD_bitmap(0,0,320,240,Background);
GLCD_init();
GLCD.c
#include/*WinbondW90P710LCDdefinitions*/
#include
#ifndef_GLCD_H
#define_GLCD_H
#defineDELAY_2N4
/*----------------------GraphicLCDsizedefinitions------------------------*/
#defineWIDTH320/*ScreenWidth(inpixels)*/
#defineHEIGHT240/*ScreenHight(inpixels)*/
#defineBPP16/*Bitsperpixel*/
#defineBYPP((BPP+7)/8)/*Bytesperpixel*/
#defineFB_WIDTH(3*WIDTH)/*Framebufferwidth*/
#defineFB_HEIGHT240/*Framebufferheight*/
#defineFB_SIZE(FB_WIDTH*FB_HEIGHT*BYPP)/*Framebuffersize(inbytes)*/
/*---------------GraphicLCDinterfacehardwaredefinitions-----------------*/
/*----------------------------Globalvariables------------------------------*/
unsignedchar*fb_start;/*Startaddressofframebuffer*/
/************************Localauxiliaryfunctions***************************/
/*******************************************************************************
*Delayinwhileloopcycles*
*Parameter:
cnt:
numberofwhilecyclestodelay*嵌入式系统设计
*Return:
*
*******************************************************************************/
staticvoiddelay(intcnt){
cnt<<=DELAY_2N;
while(cnt--);
*Waitwhilecontrolofdisplayisbusy*
staticvoidwait_while_busy(void){
Reg32(REG_USI_CNTRL)|=0x01;
while(Reg32(REG_USI_CNTRL)&0x01);
/************************Exportedfunctions**********************************/
*InitializetheGraphicLCDcontroller*
voidGLCD_init(void){
//unsignedintp;
Reg32(REG_GPIO_CFG6)=0x00555555;/*ConfigureLCDGPIO(GPIO30-41)*/
/*ConfigureLCDcontrollercontrolregister*/
Reg32(REG_LCD_LCDCON)|=LCD_LCDCON_LCDTFT|
LCD_LCDCON_LCDBUS_24|
LCD_LCDCON_CASIOSHOWTYPE_R1G1B1R2G2B2|
LCD_LCDCON_LCDTFTTYPE|
LCD_LCDCON_RGBSEQ_RBG|
LCD_LCDCON_BPP_16;
//Reg32(REG_LCD_LCDCON)|=0x000B0C05;
delay(200);
/*Configuredummydisplaycolorpatternregister*/
Reg32(REG_LCD_DDISPCP)=0;
/*Configurevaliddisplaywindowstartingcoordinate*/
Reg32(REG_LCD_DISPWINS)=0;
/*Configurevaliddisplaywindowendingcoordinate*/
Reg32(REG_LCD_DISPWINE)=(FB_HEIGHT<<16)|FB_WIDTH;
/*ConfigureLCDtiminggeneration*/
Reg32(REG_LCD_LCDTCON1)=0x0003B166;
Reg32(REG_LCD_LCDTCON2)=0x03BF00F1;
Reg32(REG_LCD_LCDTCON3)=0x00105401;
Reg32(REG_LCD_LCDTCON4)=0x00020101;
Reg32(REG_LCD_LCDTCON5)=0x0000000E;
/*ConfigureLCDFIFO1transferparameters*/
Reg32(REG_LCD_FIFO1PRM)=LCD_FIFO1PRM_F1BURSTY_16DATABURST|
LCD_FIFO1PRM_F1TRANSZ_4BYTE;//0xa
/*FIFO1transferdatacountregister*/
Reg32(REG_LCD_F1DREQCNT)=((FB_WIDTH<<16)>>1)|FB_HEIGHT;嵌入式系统设计
/*FIFO1realcolumncountregister*/
Reg32(REG_LCD_FIFO1RELACOLCNT)=FB_WIDTH>>1;
/*FIFO1startaddressregister*/
Reg32(REG_LCD_F1SADDR)=(unsignedlong)fb_start;
/*ConfigureLCDFIFOscontrollerregisterandtiggertheengine*/
Reg32(REG_LCD_FIFOCON)=LCD_FIFOCON_FIFOEN_FIFO1;
/*LCDControllerEnable*/
Reg32(REG_LCD_LCDCON)|=LCD_LCDCON_LCDCEN;
/*EnableUSIpinsforcommunicationwithdisplay*/
Reg32(REG_GPIO_CFG5)&=0xFFF00FFF;
Reg32(REG_GPIO_CFG5)|=0x000AA000;
/*Setupcommunicationparameters*/
Reg32(REG_USI_DIVIDER)=0x27;/*SCLK=PCLK/80=1MHz*/
Reg32(REG_USI_SSR)=0;/*CSactivelow*/
Reg32(REG_USI_CNTRL)=0x84;/*16bits;Txfall,Rxriseedge*/
Reg32(REG_USI_SSR)|=0x01;/*ActivateCS0*/
Reg32(REG_USI_Tx0)=0x0596;/*SetregisterR5*/
wait_while_busy();
Reg32(REG_USI_SSR)&=0xFE;/*DeactivateCS0*/
delay
Reg32(REG_USI_Tx0)=0x0408;/*SetregisterR4*/
Reg32(REG_USI_Tx0)=0x07F1;/*SetregisterR7*/
Reg32(REG_USI_Tx0)=0x08C0;/*SetregisterR8*/
Reg32(REG_USI_Tx0)=0x0616;/*SetregisterR6*/
Reg32(REG_USI_Tx0)=0x05D7;/*SetregisterR5*/
voidGLCD_bitmap(unsignedintx,unsignedinty,unsignedintw,unsignedinth,unsignedchar*bitmap){
unsignedinti,j;
unsignedchar*disp_start;
unsignedchar*disp_ptr0;
unsignedchar*disp_ptr1;
unsignedchar*disp_ptr2;
unsignedchar*bitmap_ptr;
unsignedcharpixel;
fb_start=malloc(FB_SIZE);/*InitializeFrameBuffer*/
memset(fb_start,0x00,FB_SIZE);/*ClearFrameBuffer*/
disp_start=fb_start+(x+y*WIDTH)*BYPP;嵌入式系统设计
disp_ptr0=disp_start;
disp_ptr1=disp_start+WIDTH*HEIGHT*BYPP;
disp_ptr2=disp_start+2*WIDTH*HEIGHT*BYPP;
bitmap_ptr=bitmap;
for(j=0;jfor(i=0;i
for(i=0;i
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2