嵌入式系统实验报告

嵌入式系统设计实验报告

班 级:学 号:姓 名:

成 绩:指导教师:

20120614 2012061411 刘群峰 赵国冬 、孟昭林

1. 实验一

1.1 实验名称

博创UP-3000实验台基本结构及使用方法

1.2 实验目的

1.熟悉UP-net3000实验平台的核心硬件电路和外设

2.ARM JTAG的安装与使用

1.3 实验环境

1.ADS 1.2开发环境

2. UarmJtag 并口仿真器驱动程序

3. uCOS-II 操作系统

1.4 实验内容及要求

1. 通过操作系统自带的通讯软件超级终端,检验各个外设的工作状态

2. 要求通过本次课程对各个外设的了解,为今后各个接口实验打下基础

1.5 实验设计与实验步骤

1、运行Windows 系统下的超级终端(HyperTerminal)应用程序,新建一个通信终端。 为所建超级终端取名为arm ,并设置相应的属性.

2、完成新建超级终端的设置以后,可以选择超级终端文件菜单中的保存,将当前设置 保存为一个特定超级终端到桌面上,以备后用。用串口线将PC 机串口和平台UART0正确 连接后,就可以在超级终端上看到程序输出的信息了,比如本实验的“Hello world !”。

3、启动开发板,按住开发板上键盘的任意按键,使开发板进入BIOS 设置状态。超级终端出现shell menu检测菜单。

4、按超级终端的提示尝试各部分测试功能,键盘逐个输入各部分提示的命令,测试其功能。

1.6 实验过程与分析

本次实验是初步验证一下超级终端和开发平台,按照实验步骤成功连接实验平台后,逐个测试实验功能。

1.7 实验结果总结

经逐个测试实验台功能,实验环境平台功能完好。

1.8 心得体会

通过本次实验,.熟悉了UP-net3000实验平台的核心硬件电路和外设以及ARM JTAG的安装与使用,对外设功能有了更全面的了解。

2. 实验二

2.1 实验名称

ADS1.2软件开发环境使用方法

2.2 实验目的

1.ADS 1.2开发环境使用

2.AXD Debugger使用方法

3.掌握ARM 的串行口工作原理

4.学习编程实现 ARM 的UART 通讯

5.掌握 CPU 利用串口通讯的方法

6.熟悉ARM 系统硬件的UART 相关接口

2.3 实验环境

1.ADS 1.2开发环境 2. UarmJtag 并口仿真器驱动程序 3. uCOS-II 操作系统

2.4 实验内容及要求

1.学习串行通讯原理,了解串行通讯控制器,阅读ARM 芯片文档,掌握ARM UART相关寄存器的功能,熟悉ARM 系统硬件的UART 相关接口。

2.编程实现ARM 和计算机之间的串行通讯:

1) ARM 监视串行口;

2) 将接收到的字符再发送给串口(计算机与开发板是通过超级终端通讯的);

3) 按PC 键盘通过超级终端发送数据,开发板将接收到的数据再返送给PC,在超级终端上显示。

2.5 实验设计与实验步骤

1 .新建工程,将“Exp2 ARM 串口实验”中的文件添加到工程中,这些是启动时所需要的文件。

2 .定义与UART 有关的各个寄存器地址和一些特殊的位命令。主要有以下各寄存器 (44b.h):

/* UART的全部功能寄存器 */

#define rULCON0 (*(volatile unsigned *)0x1d00000)

#define rULCON1 (*(volatile unsigned *)0x1d04000)

#define rUCON0 (*(volatile unsigned *)0x1d00004)

#define rUCON1 (*(volatile unsigned *)0x1d04004)

#define rUFCON0 (*(volatile unsigned *)0x1d00008)

#define rUFCON1 (*(volatile unsigned *)0x1d04008)

#define rUMCON0 (*(volatile unsigned *)0x1d0000c)

#define rUMCON1 (*(volatile unsigned *)0x1d0400c)

#define rUTRSTAT0 (*(volatile unsigned *)0x1d00010)

#define rUTRSTAT1 (*(volatile unsigned *)0x1d04010)

#define rUERSTAT0 (*(volatile unsigned *)0x1d00014)

#define rUERSTAT1 (*(volatile unsigned *)0x1d04014)

#define rUFSTAT0 (*(volatile unsigned *)0x1d00018)

#define rUFSTAT1 (*(volatile unsigned *)0x1d04018)

#define rUMSTAT0 (*(volatile unsigned *)0x1d0001c)

#define rUMSTAT1 (*(volatile unsigned *)0x1d0401c)

#define rUBRDIV0 (*(volatile unsigned *)0x1d00028)

#define rUBRDIV1 (*(volatile unsigned *)0x1d04028)

#ifdef __BIG_ENDIAN //大端摸式

#define rUTXH0 (*(volatile unsigned char *)0x1d00023)

#define rUTXH1 (*(volatile unsigned char *)0x1d04023)

#define rURXH0 (*(volatile unsigned char *)0x1d00027)

#define rURXH1 (*(volatile unsigned char *)0x1d04027)

#define WrUTXH0(ch) (*(volatile unsigned char *)(0x1d00023))=(unsigned char)(ch) #define WrUTXH1(ch) (*(volatile unsigned char *)(0x1d04023))=(unsigned char)(ch) #define RdURXH0() (*(volatile unsigned char *)(0x1d00027))

#define RdURXH1() (*(volatile unsigned char *)(0x1d04027))

#define UTXH0 (0x1d00020+3) //byte_access address by BDMA

#define UTXH1 (0x1d04020+3)

#define URXH0 (0x1d00024+3)

#define URXH1 (0x1d04024+3)

#else //小端摸式

#define rUTXH0 (*(volatile unsigned char *)0x1d00020)

#define rUTXH1 (*(volatile unsigned char *)0x1d04020)

#define rURXH0 (*(volatile unsigned char *)0x1d00024)

#define rURXH1 (*(volatile unsigned char *)0x1d04024)

#define WrUTXH0(ch) (*(volatile unsigned char *)0x1d00020)=(unsigned char)(ch) #define WrUTXH1(ch) (*(volatile unsigned char *)0x1d04020)=(unsigned char)(ch) #define RdURXH0() (*(volatile unsigned char *)0x1d00024)

#define RdURXH1() (*(volatile unsigned char *)0x1d04024)

#define UTXH0 (0x1d00020) //byte_access address by BDMA

#define UTXH1 (0x1d04020)

#define URXH0 (0x1d00024)

#define URXH1 (0x1d04024)

#endif

3 .编写串口驱动函数(MyUart.c):

4 .在主函数中实现将从串口0 接收到的数据发送到串口0 (Main.c):

2.6 实验过程与分析

打开开发环境,新建工程,编写相关指令,打开超级终端连接外设,运行程序。

2.7 实验结果总结

打开开发环境,新建工程,编写相关指令,打开超级终端连接外设,运行程序。在pc键盘上输入,成功在超级终端显示,完成串口实验。

2.8 心得体会

通过本次串口实验实验,对串行通讯原理有了进一步的学习和认识。

3. 实验三

3.1 实验名称

键盘控制方法及LED驱动设计

3.2 实验目的

1.熟悉ZLG7289芯片的内部结构

2.掌握用ZLG7289驱动键盘和LED的方法

3.掌握ARM汇编语言和C语言的编程方法

3.3 实验环境

1.ADS 1.2开发环境 2. UarmJtag 并口仿真器驱动程序

3. uCOS-II 操作系统

3.4 实验内容及要求

编写出一段程序,要求能在LED上显示出小键盘上按下的4位数字

实验要求:注意消除键盘按键带来的抖动

3.5 实验设计与实验步骤

1 .新建工程,将“Exp3键盘及LED 驱动实验”中的文件添加到工程。

2 .定义ZLG7289 寄存器(ZLG7289.h )

#define ZLG7289_CS (0x20) //GPB5

#define ZLG7289_KEY (0x10) //GPG4

#define

ZLG7289_ENABLE()

do{

ZLG7289SIOBand=rSBRDR;

ZLG7289SIOCtrl=rSIOCON;

rSIOCON=0x31;

rSBRDR=0xff;

rPDATB&=(~ZLG7289_CS);

}while(0)

#define ZLG7289_DISABLE()

do{rPDATB|=ZLG7289_CS

;rSBRDR=ZLG7289SIOBand;

rSIOCON=ZLG7289SIOCtrl;

}while(0)

3.编写ZLG7289 驱动函数

4.定义键盘映射表:(Keyboard16.c)

unsigned int KeyBoard_Map[]={

7,4,1,0,0,0,0,0,8,5,

2,0,1,0,0,0,9,6,3,16,

2,3,0,0,7,0,14,0,0,0,

0,0,0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,0,0,

0,0,0,0 };

//64 键值映射表,通过查找键盘映射表来确定键盘扫描码对应的按键值。 5 .定义键值读取函数

6.编写主函数,将按键值在数码管上显示。

int main(void)

{

U32 sum=0, key;

ARMTargetInit(); //开发版初始化

Uart_Printf("\nArm Target Init OK.");

Zlg7289_Reset();//zlg7289复位

while(1)

{

key=GetKey();//得到按键值

sum = key + sum * 10;

sum = sum % 10000000;

Delay(1);

ZLG7289_ENABLE();//使zlg7289占有同步串口

Delay(1);//延时

WriteSDIO(ZLG7289_CMD_DATA0|0);//数码管以方式0译码,第一个数码管亮 WriteSDIO(sum%10);//显示个位

Delay(1);//延时

WriteSDIO(ZLG7289_CMD_DATA0|1);

WriteSDIO(sum/10%10);//显示十位

Delay(1);//延时

WriteSDIO(ZLG7289_CMD_DATA0|2);

WriteSDIO(sum/100%10);//显示百位

Delay(1);//延时

WriteSDIO(ZLG7289_CMD_DATA0|3);

WriteSDIO(sum/1000%10);//显示千位

Delay(1);//延时

WriteSDIO(ZLG7289_CMD_DATA0|4);

WriteSDIO(sum/10000%10);//显示 位

Delay(1);//延时

WriteSDIO(ZLG7289_CMD_DATA0|5);

WriteSDIO(sum/100000%10);//显示 位

Delay(1);//延时

WriteSDIO(ZLG7289_CMD_DATA0|6);

WriteSDIO(sum/1000000%10);//显示 位

Delay(1);//延时

//WriteSDIO(ZLG7289_CMD_DATA0|7);

//WriteSDIO(sum/10000000);//显示 位

//Delay(1);//延时

/*Delay(1);//延时

if(key>9)

{//键值大于9显示十位

WriteSDIO(ZLG7289_CMD_DATA0|1);//发送十位数据

WriteSDIO((unsigned char)(key/10));

Delay(1);

WriteSDIO(ZLG7289_CMD_HIDE);//使一、二两位数码管显示

WriteSDIO(3);

}

else

{//键值小于10不显示十位

WriteSDIO(ZLG7289_CMD_HIDE);//使个位数码管显示

WriteSDIO(1);

}*/

ZLG7289_DISABLE();//zlg7289放弃同步串口控制权

}

return 0;

}

3.6 实验过程与分析

1.打开原有工程,监听键盘按下动作,修改键盘映射表

2.编写循环左移函数

3.在LED上显示数字

3.7 实验结果总结

本次实验最后,修改好了按键的值,当按下开发板上的任意键则会显示其具体所对应的值(如按下3键,则数码管上显示3)并且消除了抖动与闪烁,还能实现键盘输入并且有4位循环左移led数字显示。

3.8 心得体会

通过本次实验,基本了解了键盘的具体实现方法,提高了自己分析问题能力与阅读代码能力。

4. 实验四

4.1 实验名称

电机转动控制及中断实验

4.2 实验目的

1 .熟悉ARM本身自带的六路即三对PWM,掌握相应寄存器的配置。

2 .编程实现 ARM系统的PWM 输出和I/O 输出,前者用于控制直流电机,后者用于控制步进电机。

3 .了解直流电机和步进电机的工作原理,学会用软件的方法实现步进电机的脉冲分配, 即用软件的方法代替硬件的脉冲分配器。

4 .掌握带有PWM 和I/O 的CPU 编程实现其相应功能的主要方法

4.3 实验环境

1.ADS 1.2开发环境 2. UarmJtag 并口仿真器驱动程序

3. uCOS-II 操作系统

4.4 实验内容及要求

1、利用A/D转换器实现对直流电机和步进电机的控制

2、利用实验设备上自带的小键盘实现A/D转换器对两个电机控制的切换

3、学习S3C44B0上定时器中断应用方法

4、综合键盘、LED、A/D以及电机等外设,编写出单一的中断应用

5、编写出多个不同优先级中断应用嵌套的应用系统

4.5 实验设计与实验步骤

1、新建中断控制的工程,将Exp4D/A实验的文件添加到新的项目中 2、编写中断程序,判断是否有按键按下 3、如果按键合法,那么就利用goto语句跳转到另一函数,使得另外一个电机转动。 4、编写两个电机的转动函数,监测旋钮的旋转角度以及方向,分别控制转速,转向以

及转角。

5、如果没有按键在一个电机控制函数中死循环即可,用goto语句跳出循环。

for(;;)

{

begin:

Uart_Printf("\nBegin control DC motor.\t\tPress any key to control step motor.\n"); for(;;)

{

ADData=GetADresult(0);

Delay(10);

SetPWM((ADData-512)*MOTOR_CONT/1024);

Delay(10);

if(!(rPDATG&ZLG7289_KEY)) //有输入,则跳出

//if(rPDATG&ZLG7289_KEY )

{

Delay(10000);

*Revdata=RdURXH0();

goto next;

}

}

next:

SetPWM(0);

Uart_Printf("\nBegin control step motor.\tPress any key to control DC motor.\n"); lastADData=GetADresult(0);

Delay(10);

for(;;)

{

loop: if(!(rPDATG&ZLG7289_KEY)) //有输入,则返回

{

Delay(10000);

*Revdata=RdURXH0();

goto begin;

}

Delay(10);

ADData=GetADresult(0);

if(abs(lastADData-ADData)<20)

goto loop;

Delay(10);

count=-(ADData-lastADData)*3;

//(ADData-lastADData)*270/1024为ad旋钮转过的角度,360/512为步距角,

//由于接了1/8减速器,两者之商再乘以8为步进电机相应转过的角度 if(count>=0)

{//转角大于零

for(j=0;j<count/8;j++)

{

for(i=0;i<=7;i++)

{

SETEXIOBITMASK(stepdata[i], 0xf0);

Delay(200);

}

}

}

else

{//转角小于零

count=-count;

for(j=0;j<count/8;j++)

{

for(i=7;i>=0;i--)

{

SETEXIOBITMASK(stepdata[i], 0xf0);

Delay(200);

}

}

}

lastADData=ADData;

}

}

4.6 实验过程与分析

1.监测键盘是否有按键按下,如果有就将一个设好的标志位取反,达到切换的目的。

2.监测旋钮,对于直流电机来说,要监测到旋钮的旋转的角度以及方向,以此来控制电机的转动。

4.7 实验结果总结

实现中断控制,直流电机转动,通过按键控制停止,实现A/D转换器对两个电机控制的切换功能。

4.8 心得体会

通过本次实验,了解直流电机和步进电机的工作原理,学会了如何通过A/D转换器对电机进行切换控制。

5. 实验五

5.1 实验名称

LCD驱动及触摸屏实验

5.2 实验目的

1.了解LCD 基本概念与原理。

2.理解LCD 的驱动控制。

3.熟悉用总线方式驱动LCD 模块

4.熟悉用ARM 内置的LCD 控制器驱动LCD。

5.掌握LCD显示原理及显示驱动的嵌入式系统编程实现方法

6.学习基于ARM的LCD 显示驱动控制方法,通过对ARM 内置的LCD 控制器进行编程实现驱动LCD显示屏。

7.学习触摸屏基本原理,理解触摸屏的输出标定以及与LCD 显示器配合的过程

5.3 实验环境

1.ADS 1.2开发环境

2. UarmJtag 并口仿真器驱动程序

3. uCOS-II 操作系统

5.4 实验内容及要求

1.学习LCD 显示器的基本原理,理解其驱动控制方法。掌握两种LCD 驱动方式的基本原理和方法。并用编程实现:

1) 用总线方式直接驱动带有驱动模块的LCD。

2) 用ARM 内置的LCD 控制器来驱动LCD。

2.编程对触摸屏进行控制,实现:

1) 点击触摸屏上两点后,两点之间画出一条直线。

2) 点击触摸屏并在其上移动,显示移动轨迹。

5.5 实验设计与实验步骤

1.新建工程“LCD驱动及触摸屏实验”。

2.编写tchscr.h文件代码定义一些触摸屏动作宏如下:

#define TCHSCR_ACTION_NULL 0

#define TCHSCR_ACTION_CLICK 1 //触摸屏单击

#define TCHSCR_ACTION_DBCLICK 2 //触摸屏双击

#define TCHSCR_ACTION_DOWN 3 //触摸屏按下

#define TCHSCR_ACTION_UP 4 //触摸屏抬起

#define TCHSCR_ACTION_MOVE 5 //触摸屏移动

3.编写tchscr.c文件函数对响应的触摸屏动作做相应的操作

3.1获取当前点击触摸屏上点的坐标在终端显示出来,并判断点击类型,若为单击操作则绘制直线,若为移动操作,则绘制移动轨迹。

3.2判断是否为第一个点,若是则等待获取下一个点击点坐标;否则根据该点与前一个点击点坐标求出直线斜率并根据直线公式绘制直线。

3.3 若为移动操作,则每隔一段时间获取依次点击点坐标,根据相邻两点按照绘制直线方法画线。这样很多较短直线相连就绘制出移动轨迹。

4.显示的时候,要对BufferLcd[][]进行初始化,然后赋值,最后调用Lcdfresh()函数,这样才可以将需要的点显示出来。

5.6 实验过程与分析

1.获取当前点并保存起来,与下次获取的点一起来确定所绘直线的两个点,由于计算直线斜率时存在误差导致绘制的直线不准确,我们通过在两点间插入点的方式来绘制直线。这样也解决了斜率无法计算的问题。然后再直线上的点赋值,使其显示出来。代码如下: case TCHSCR_ACTION_CLICK:

//点击触摸屏上两点后,两点之间画出一条直线。

Uart_Printf("Action=click:x1=%d,\ty1=%d\n",x1,y1);

Uart_Printf("Action=click:x2=%d,\ty2=%d\n",x2,y2);

if(x2!=0&&y2!=0)

{

for(k=1;k<10001;k++)

for(i=1;i<6;i++)

for(j=1;j<6;j++)

{

LCDBuffer[y1+(y2-y1)*k/10000+i][x1+(x2-x1)*k/10000+j]=jcolor; LCDBuffer[y1+i][x1+j]=jcolor;

}

}

LCD_Refresh();

x2=x1;

y2=y1;

break;

2.绘制移动轨迹时,先获取的一系列点的坐标,然后通过在相邻两点间插入点来绘制直线,最后各个直线连接起来来绘制轨迹,代码如下:

case TCHSCR_ACTION_MOVE:

//点击触摸屏并在其上移动,显示移动轨迹。

Uart_Printf("Action=move:x=%d,\ty=%d\n",x1,y1);

if(x2!=0&&y2!=0)

{

for(k=1;k<101;k++)

{

LCDBuffer[y1+(y2-y1)*k/100][x1+(x2-x1)*k/100]=jcolor;

LCDBuffer[y1][x1]=jcolor;

}

}

x2=x1;

y2=y1;

LCD_Refresh();

break;

5.7 实验结果总结

通过编程对触摸屏进行控制,实现:

1.点击触摸屏上两点后,两点之间画出一条直线。

2.点击触摸屏并在其上移动,显示移动轨迹。

5.8 心得体会

通过本实验的学习,掌握了LCD显示原理及显示驱动的嵌入式系统编程实现方法及基于ARM的LCD 显示驱动控制方法并通过对ARM 内置的LCD 控制器进行编程实现驱动LCD显示屏最后通过学习触摸屏基本原理,理解触摸屏的输出标定以及与LCD 显示器配合的过程完成了实现了点击触摸屏上两点后,两点之间画出一条直线。及点击触摸屏并在其上移动,显示移动轨迹的工程。

6. 实验六

6.1 实验名称

ucos-II裁剪实验

6.2 实验目的

1、掌握μcos-II裁剪的基本原理与嵌入式编程实现方法

2、学习如何根据具体情况对μcos-II操作系统进行裁剪,从而得到即满足需要,又非常紧凑的应用软件系统。

6.3 实验环境

1.ADS 1.2开发环境 2. UarmJtag 并口仿真器驱动程序

3. uCOS-II 操作系统

6.4 实验内容及要求

1、通过对μcos-II配置文件(OS_CFG.H)中相关的配置常量进行设置,实现对μcos-II的裁剪。

2、给出裁剪的详细过程与裁剪结果说明,并生成裁剪后的操作系统文件。

6.5 实验设计与实验步骤

1.找到一个已有的工程 2.找到UC/OS的配置文件OS_CFG.H,然后打开文件,找到相关功能的配置。 3.对不需要的功能进行删除,不需要的配置设置成0,需要的设置成1. 4.运行工程,可以使得工程更加紧凑,减小空间。

6.6 实验过程与分析

根据实际需要通过删减系统中许多没有到的功能代码,使得生成的系统更加节省空间。

#define OS_TASK_STAT_EN 1 /* Enable (1) or Disable(0) the statistics task */

#define OS_TASK_STAT_STK_SIZE 512 /* Statistics task stack size (# of OS_STK wide entries) */

#define OS_ARG_CHK_EN 1 /* Enable (1) or Disable (0) argument checking */

#define OS_CPU_HOOKS_EN 1 /* uC/OS-II hooks are found in the processor port files */

/* ----------------------- EVENT FLAGS ------------------------ */

#define OS_FLAG_EN 1 /* Enable (1) or Disable (0) code generation for EVENT FLAGS */

#define OS_FLAG_WAIT_CLR_EN 1 /* Include code for Wait on Clear EVENT FLAGS */

#define OS_FLAG_ACCEPT_EN 1 /* Include code for

OSFlagAccept() */

如上所示,对系统配置文件中的功能进行定义,若使用则置1;不用则置0。

6.7 实验结果总结

通过对系统进行裁剪,生成运行更快,更省空间的系统代码。

6.8 心得体会

通过本次试验,我掌握μcos-II裁剪的基本原理与嵌入式编程实现方法,学习到了如何根据具体情况对μcos-II操作系统进行裁剪,从而得到即满足需要,又非常紧凑的应用软件系统通。最后通过对μcos-II配置文件(OS_CFG.H)中相关的配置常量进行设置,实现对μcos-II的裁剪。

7. 实验七

7.1 实验名称

ucos-II移植实验

7.2 实验目的

1、了解?C/OS-II 内核的主要结构,掌握ARM的C语言和汇编语言的编程方法

2、了解ARM7处理器结构,掌握将?C/OS-II 内核移植到ARM 7 处理器上的基本原理与嵌入式编程实现方法

7.3 实验环境

1.ADS 1.2开发环境 2. UarmJtag 并口仿真器驱动程序 3. uCOS-II 操作系统

7.4 实验内容及要求

1、将?C/OS-II 内核移植到ARM7 微处理器S3C44B0上。

2、编写两个简单任务,在超级终端上观察两个任务的切换。

7.5 实验设计与实验步骤

1.该实验的文件分为两类,其一是 STARTUP 目录下的系统初始化、配置等文件,其二是 uCOS-II 的全部源码,arch 目录下的 3 个文件是和处理器架构相关的。

2.设置 os_cpu.h 中与处理器和编译器相关的代码

3.用 C 语言编写 6 个操作系统相关的函数

4.用汇编语言编写 4 个与处理器相关的函数

5.编写一个简单的多任务程序来测试一下移植是否成功。

6.编译并下载移植后的uCOS-II

7.6 实验过程与分析

1.将各个任务加入到一个堆栈中,并且指明任务的性质,如下所示: OSTaskCreate(SYS_Task, (void *)0, (OS_STK *)&SYS_Task_Stack[STACKSIZE-1],

SYS_Task_Prio);

OSTaskCreate(Task2, (void *)0, (OS_STK *)&Task2_Stack[STACKSIZE-1], Task2_Prio);

OSTaskCreate(Task1, (void *)0, (OS_STK *)&Task1_Stack[STACKSIZE-1], Task1_Prio );

2.定义不同的任务,使得各任务之间相互切换。

void Task1(void *Id)

{

for(;;){

Uart_Printf("run task1\n");

OSTimeDly(1000);

}

}

void Task2(void *Id)

{

for (;;)

{

Uart_Printf("run task2\n");

OSTimeDly(2000);

}

}

如上是自己定义的两个任务,这样通过不同的延迟时间可以发现能够正常进行切换。

7.7 实验结果总结

通过编写两个简单任务,在超级终端上实现了task1与task2两个任务的切换

7.8 心得体会

通过本实验的学习,使我们了解了?C/OS-II 内核的主要结构及ARM7处理器结构并掌握了ARM的C语言和汇编语言的编程方法和将?C/OS-II 内核移植到ARM 7 处理器上的基本原理与嵌入式编程实现方法,然后实现了将?C/OS-II 内核移植到ARM7 微处理器S3C44B0上的目的最后通过编写两个简单任务,在超级终端上实现了两个任务的切换。

8. 实验八

8.1 实验名称

各接口模块相互衔接综合实验

8.2 实验目的

学习编写一个比较复杂的应用程序的方法及其框架结构,结合以前几个实验中所学到的知识,实现一个综合的应用。

8.3 实验环境

1.ADS 1.2开发环境

2. UarmJtag 并口仿真器驱动程序

3. uCOS-II 操作系统

8.4 实验内容及要求

1、回顾串口、键盘、LED接口、A/D、电机转动、定时器中断、LCD接口及触摸屏驱动控制等接口模块驱动设计及开发方法

2、综合应用以上全部或者部分模块,实现一个嵌入式综合应用系统,要求至少用到8个模块中的5个

3、尽量使综合应用系统具备合理的功能

8.5 实验设计与实验步骤

1、新建一个工程

2、将LCD驱动及触摸屏实验、电机转动控制及中断实验和键盘控制方法及LED驱动设计实验工程整合在一起。

3、向led传送电机转动的速度变量,通过按键改变速度值,改变电机的转速,并在led上显示。

4、通过键入‘*’键中断电机,切入lcd和触摸屏画线函数,双击触摸屏,转回电机转动,如此进行循环切换。

具体代码实现:

1.Getkey()函数,获取键值,在led上显示

U32 GetKey()

{

U16 key;

U32 sum=0;

while(1)

{

Delay(20000);

while((rPDATG&ZLG7289_KEY));//有键按下

key=Zlg7289_ReadKey();//得到按键扫描码

Uart_Printf("\n%d",key);

LCD_printf("\n%d",key);

if(key<=64)

{//按键值有效

key=KeyBoard_Map[key];//通过键盘映射表得到按键值

sum = key + sum * 10;

sum = sum % 10000000;

Delay(1);

ZLG7289_ENABLE();//使zlg7289占有同步串口

Delay(1);//延时

WriteSDIO(ZLG7289_CMD_DATA0|0);

WriteSDIO(sum%10);//显示个位

Delay(1);//延时

WriteSDIO(ZLG7289_CMD_DATA0|1);

WriteSDIO(sum/10%10);//显示十位

Delay(1);//延时

WriteSDIO(ZLG7289_CMD_DATA0|2);

WriteSDIO(sum/100%10);//显示百位

Delay(1);//延时

WriteSDIO(ZLG7289_CMD_DATA0|3);

WriteSDIO(sum/1000%10);//显示千位

Delay(1);//延时

WriteSDIO(ZLG7289_CMD_DATA0|4);

WriteSDIO(sum/10000%10);//显示 位

Delay(1);//延时

WriteSDIO(ZLG7289_CMD_DATA0|5);

WriteSDIO(sum/100000%10);//显示 位

Delay(1);//延时

WriteSDIO(ZLG7289_CMD_DATA0|6);

WriteSDIO(sum/1000000%10);//显示 位

Delay(1);//延时

ZLG7289_DISABLE();//zlg7289放弃同步串口控制权

if(key!='*') //如果按键不为’*’,则显示电机速度,否者转为画线 SetPWM(key*1000); //电机速度通过key值来改变

else

{

SetPWM(0); //电机停止转动

LCD_ChangeMode(DspGraMode);

TchScr_Test(); //转入屏幕画线

}

//break;

}

Delay(1000);

}

return key;

}

2. TchScr_Test()函数的实现:

void TchScr_Test()

{

U32 mode;

int xOld,yOld;

int temp=1;

int m,n;

int xDis,yDis;

int dis;

int x,y;

int i,j;

int num = 0;

U32 jcolor;

jcolor=0x0000e0e0;

Uart_Printf("\nplease touch the screen\n");

for(;;){

mode=TchScr_GetOSXY(&x, &y);

switch(mode){

case TCHSCR_ACTION_CLICK: //在屏幕上任点两处画出一条直线

Uart_Printf("Action=click:x=%d,\ty=%d\n",x,y);

if(num==0)

{

xOld = x;

yOld = y;

LCDBuffer[y][x]=jcolor;

LCD_Refresh();

num=1;

}

else

{

LCDBuffer[y][x]=jcolor;

xDis = x-xOld;

yDis = y-yOld;

if(abs(xDis)>=abs(yOld))

dis = abs(xDis);

else

dis = abs(yDis);

for(i=0;i<=dis;i++)

LCDBuffer[(int)(yOld+i*yDis/dis)][(int)(xOld+i*xDis/dis)] = jcolor;

LCD_Refresh();

xOld = x;

yOld = y;

}

break;

case TCHSCR_ACTION_DBCLICK: //双击屏幕,清屏并转入getkey( )函数 Uart_Printf("Action=double click:x=%d,\ty=%d\n",x,y);

for(m=0;m<=320;m++)

for(n=0;n<=240;n++)

LCDBuffer[n][m]=0x00000000; //将颜色设为0,实现清屏 LCD_Refresh();

GetKey(); //转入电机转动

break;

case TCHSCR_ACTION_DOWN:

Uart_Printf("Action=down:x=%d,\ty=%d\n",x,y);

break;

case TCHSCR_ACTION_UP:

Uart_Printf("Action=up:x=%d,\ty=%d\n",x,y);

break;

case TCHSCR_ACTION_MOVE: //在触摸屏上移动画出轨迹 Uart_Printf("Action=move:x=%d,\ty=%d\n",x,y);

if(num==0)

{

xOld = x;

yOld = y;

LCDBuffer[y][x]=jcolor;

LCD_Refresh();

num=1;

}

else

{

LCDBuffer[y][x]=jcolor;

xDis = x-xOld;

yDis = y-yOld;

if(abs(xDis)>=abs(yOld))

dis = abs(xDis);

else

dis = abs(yDis);

for(i=0;i<=dis;i++)

LCDBuffer[(int)(yOld+i*yDis/dis)][(int)(xOld+i*xDis/dis)] = jcolor; LCD_Refresh();

xOld = x;

yOld = y;

}

break;

}

Delay(1000);

}

}

8.6 实验过程与分析

打开实验平台,运行程序,电机转动,按键改变速度,按切换键进入画线,双击触摸屏转回电机。

在实验过程中也遇到了问题,刚开始把getkey()函数写在了主函数里实现,结果导致由电机转动切换到画线功能后无法返回到电机控制,因为主函数不能被调用,后来经过仔细研究解决了这个问题。

8.7 实验结果总结

在本实验中,我们综合应用键盘、LED接口、A/D、电机转动、定时器中断、LCD接口及触摸屏驱动控制等模块实现一个嵌入式综合应用系统。

8.8 心得体会

在本实验中,我们通过回顾串口、键盘、LED接口、A/D、电机转动、定时器中断、LCD接口及触摸屏驱动控制等接口模块驱动设计及开发方法综合应用以上的键盘、LED接口、A/D、电机转动、定时器中断、LCD接口及触摸屏驱动控制等模块,实现一个嵌入式综合应用系统。

9. 实验总结与心得体会

通过一周的学习实践,我们先对UP-net3000实验平台的核心硬件电路和外设及ADS1.2软件开发环境进行初步的了解,然后依次学习了串口、键盘、LED接口、A/D、电机转动、定时器中断、LCD接口及触摸屏驱动控制等接口模块驱动设计及开发方法并通过亲自编码实现了一些模块功能,最后综合应用以上的键盘、LED接口、A/D、电机转动、定时器中断、LCD接口及触摸屏驱动控制等模块,实现一个简单的嵌入式综合应用系统。

相关推荐