arm9开发板实验报告1

合集下载

arm9开发板实验报告1

arm9开发板实验报告1

郑州轻工业学院实训报告实训名称:项目一:编写从A/D转换器的通道x获取模拟数据,并将转换后的数字量以波形的形式在LCD上显示的程序项目二:触摸屏驱动程序设计姓名:张克歌院(系):计算机与通信工程学院专业班级:嵌入式09--01学号: 0151指导教师:韩雪琴成绩:时间:2011年 8月 29日至 2011年 9 月 7 日一、需求说明1.巩固和强化学生的嵌入式系统的基本概念和开发流程,掌握基本知识和基本技能。

2.掌握硬件开发平台、开发资源和软件开发环境,尤其是裸机嵌入式系统开发方法。

掌握汇编和C语言混合编程技巧,熟悉系统启动引导过程,能够成功移植嵌入式系统引导程序。

培养和训练学生综合利用所学基本知识和基本技能进行小型裸机程序开发的技能。

3.明确思路和任务,查询相关书籍、资料,综合了解ARM的AD转换器和LCD 驱动器,重点分析时S3C2440的LCD 驱动器的工作原理和初始化方法。

分析与AD转换相关的寄存器,编写AD转换器的初始化函数,编写获取AD转换结果的函数。

分析与LCD相关的寄存器,编写LCD 驱动器的初始化函数,配置显示方式。

分析LCD绘图的API函数。

编写主函数,将AD转换结果在LCD上以波形的方式显示,同时以串口输出到PC机。

进入调试。

实现转换数据实时输出,实现串口输出数据与LCD 波形显示的一致。

4.明确思路和任务,查询相关书籍、资料,重点分析S3C2440的触摸屏接口工作原理和相关寄存器。

编写触摸屏初始化函数,确定XY位置转换模式。

编写触摸屏中断初始化函数,中断服务函数。

编写屏幕校准函数。

确定坐标计算公式。

编写触点数据采集函数。

编写主函数,进入调试。

实现触摸屏坐标点x、y的正确读取。

二、功能描述项目一:编写从A/D转换器的通道x获取模拟数据,并将转换后的数字量以波形的形式在LCD上显示的程序。

项目二:通过对AD转换器的配置——触摸屏自动测试x/y位置模式,选择进入到触摸屏驱动函数。

ARM9无操作系统实验(一)LED部分

ARM9无操作系统实验(一)LED部分
Led0.c 主程序 程序控制流程:
开始
设置 GPB5 为输出状态
置位 GPB5,LED0 熄灭
设置 GPB 端口禁止上拉
清零 GPB5,点亮 LED0
结束
将程序加载到开发板上,就可以看实验的结果了,其它 LED 灯的控制和 LED0 一样,只是 寄存器的设置值不同罢了。
实验二、流水灯 终于能点亮一个 LED 灯了,那么它有什么用呢?它的主要用途在于一些状态的显示上,
GPB5 LED0 GPB6 LED1 GPB8 LED2 GPB10 LED3 ********************************************/
/*---------地址声明----------*/
#include "2440addr.h"
注释:在本程序的开头,引入一个 2440addr.h 的头文件,该文件中定义了我们要常用的 寄存器的地址,以后的程序中,只需引入即可。引入的方法是将这个头文件直接放在 ADS 安装文件的 include 中就行了。
S3C2440 无操作系统实验——LED 部分
S3C2440 无操作系统实验(一)——LED 部分
小小达摩 2011-6-23
硬件:飞凌 FL2440 开发板 软件:ADS1.2
拿到 ARM 开发板,应该从哪儿开始学习呢?困扰了很多初学者,当然也正在困扰我, 因为我也是初学者。所以我想与其困惑,还不如先做些自己能做的,将会做的做熟悉了,也 许就找到学习的方向了吧。那么从哪儿入手呢,想来想去,那就从点亮一个 LED 灯作为学 习的起点。虽然很多人,不推荐用学习单片机的模式来学习 ARM,但是我感觉基础还是重 要的,再说高级的学习暂时也不会呀,呵呵。虽然这样学习会慢点,但是总比开发板落厚厚 一层灰要划得来吧(开发板买了快 2 年了,拿来玩的时间不超过 2 个月,也许很多朋友都有 这样的经历吧)。所以,把它拿出来,开始学习吧。

ARM9实验报告

ARM9实验报告

实时操作系统实验报告专业:电子信息工程学号:20110310215姓名: 杨雪指导老师:申屠浩实验一ARM9入门实验1、实验目的:1、熟悉软件的使用,工程的创建、编译、下载及调试程序的方法。

2、理解实验源代码每一句所代表的含义。

2、实验要求与思路:该实验要求熟练地掌握ARM9软件的使用方法以及实验程序每一步所代表的含义,了解集成开发环境的主框架窗口由标题栏、菜单条、工具条、工程管理窗口、源文件窗口、输出窗口和状态条等组成。

标题栏显示当前打开的文件名。

工程管理窗口用于显示当前打开工程的有关信息,包括工程的文件组成等内容。

说明:源文件窗口用于文本编辑器进行C、汇编等源文件的编辑以及调试时的源代码执行跟踪。

输出窗口输出编译信息、调试信息、命令行输入输出和输出一些查询结果信息等。

主框架窗口的最底端为状态栏,用于显示关于菜单条、工具条等的简单说明信息以及文本编辑器中当前光标所在的行列号等。

用户可以通过鼠标拖动,将菜单条、工具条、工程管理窗口、源文件窗口和输出窗口等随意更换顺序和位置,也可以隐藏其中的某些窗口。

在调试过程中,可以根据需要打开和关闭寄存器窗口、函数栈窗口、变量窗口、存储器窗口、数据观察窗口以及反汇编窗。

3、实验程序:程序1源代码如下:/*------------------------------------------------------------------------------------------*//* constant define*//*------------------------------------------------------------------------------------------*/.equ x, 45 /* x=45 */.equ y, 64 /* y=64 */.equ stack_top, 0x1000 /* define the top address for stacks */.global _start/*------------------------------------------------------------------------------------------*//* code*//*------------------------------------------------------------------------------------------*/.text_start: /* code start */mov sp, #stack_topmov r0, #x /* put x value into R0 */str r0, [sp] /* save the value of R0 into stacks */mov r0, #y /* put y value into R0 */ldr r1, [sp] /* read the data from stack,and put it into R1 */ADD r0, r0, r1STR r0, [sp]stop:b stop /* end the code ,cycling */.end程序2源代码如下:.equ x, 45 /* x=45 */.equ y, 64 /* y=64 */.equ z, 87 /* z=87 */.equ stack_top, 0x1000 /* define the top address for stacks */.global _start/*------------------------------------------------------------------------------------------*//* code*//*------------------------------------------------------------------------------------------*/.text_start: /* code start */mov r0, #x /* put x value into R0 */mov r0, r0, lsl #8 /* R0 = R0 << 8 */mov r1, #y /* put y value into R1 */add r2, r0, r1, lsr #1 /* R2 = (R1>>1) + R0 */MOV sp, #0x1000STR r2, [sp]mov r0, #z /* put z value into R0 */and r0, r0, #0xFF /* get low 8 bit from R0 */mov r1, #y /* put y value into R1 */add r2, r0, r1, lsr #1 /* R2 = (R1>>1) + R0 */LDR r0, [sp] /* put y value into R1 */MOV r1, #0x01ORR r0, r0, r1mov r1, R2 /* put y value into R1 */add r2, r0, r1, lsr #1 /* R2 = (R1>>1) + R0 */stop:b stop /* end the code ,cycling*/.end4、实验分析程序1部分代码解释如下:mov sp, #stack_topmov r0, #x /* 把x的值移到r0*/str r0, [sp] /* 把r0的值放入堆栈*/mov r0, #y /*把y的值移到r0 */ldr r1, [sp] /*从堆栈中读取数据并放入r1 */ADD r0, r0, r1 /*把r0和r1的值相加并赋值给r0*/STR r0, [sp]程序2部分代码解释如下:.equ x, 45 /* x=45 */.equ y, 64 /* y=64 */.equ z, 87 /* z=87 */.equ stack_top, 0x1000 /* 给堆栈定义首地址*/.global _start/*------------------------------------------------------------------------------------------*//* code*//*------------------------------------------------------------------------------------------*/.text_start: /* code start */mov r0, #x /*把x=2Dh赋给r0 */mov r0, r0, lsl #8 /* r0左移八位为2d00h */mov r1, #y /*把y=40h赋给r1 */add r2, r0, r1, lsr #1 /*r2= r1右移一位2dh+r0 =2d20h*/MOV sp, #0x1000 /*sp的地址为08h*/STR r2, [sp] /*读sp的内容赋给r2/mov r0, #z /*把z=57h赋给r0 */and r0, r0, #0xFF /* 把r0和FF相与得到r0的低八位*/mov r1, #y /*把y=40h赋给r1 */add r2, r0, r1, lsr #1 /* r2= r1右移一位20h+r0 =77h */LDR r0, [sp] /*将sp 地址处的数据读出,保存到r0 中*/ MOV r1, #0x01 /*把01h赋给r1*/ORR r0, r0, r1 /*r0与r1相或,得到2d21h存入r0*/mov r1, R2 /* 把r2=77h赋给r1 */add r2, r0, r1, lsr #1 /* R2 = r1右移一位+ R0=2d5ch */5、实验截图:程序1截图实验2截图6、实验感想通过该实验,我熟悉了软件的使用,熟练地掌握了工程的创建、编译、下载及调试程序的方法,理解了实验源代码每一句所代表的含义,对于ARM9有了更深的认识并对老师上课所讲的内容有了更深的理解。

arm9实验报告

arm9实验报告
for(i=0;i<1000000;i++); //延时
rGPGCON = rGPGCON & 0xfff0ffff | 0x00050000;
rGPGDAT = rGPGDAT & 0xeff | 0x200;
for(i=0;i<10000000;i++); //延时
2、掌握三星S3C2410UART相关寄存器的配置;
3、能够用C语言编写三星S3C2410相应的串口程序;
4、学习A/D转换的接口电路;
5、掌握三星S3C2410的A/D转换器相关的寄存器配置方法和编程方法。
二、实验仪器设备
1、EL-ARM-830教学实验箱,奔腾E系列PC机,仿真调试电缆;
data = 0x55; //给全局变量赋值
while(1)
{
Uart_Printf("%x ", data); //串口0输出
Delay(1000);
2、PC操作系统WINXP,ADS1.2集成开发环境,仿真调试电缆驱动程序。
三、实验原理
ARM的UART实验
三星S3C2410的UART单元提供3个独立的异步串行I/O口,都可以运行于中断模式或DMA模式,它最高可支持115200bps的传输速率。三星S3C2410中每个UART通道包含两个用于接收和发送数据的16位FIFO队列。
3、了解ARM9的中断原理,能够对三星S3C2410的中断资源及其相关中断寄存器进行合理配置;掌握三星S3C2410中断的编箱,奔腾E系列PC机,仿真调试电缆;
2、PC操作系统WINXP,ADS1.2集成开发环境,仿真调试电缆驱动程序。

ARM9实验

ARM9实验

实验一:ADS 1.2集成开发环境练习1.1 实验目的:了解ADS1.2集成开发环境的使用方法1.2 实验设备:①硬件:PC机②软件:Windows xp系统,ADS1.2集成开发环境1.3 实验内容:①建立一个新的工程;②建立一个汇编文件,并添加到工程中;③设置文本编辑器支持中文;④设置编译链接控制选项;⑤编译链接工程;⑥调试工程1.4 实验步骤①新建一个目录。

启动ADS1.2,选择File-New,使用ARM Executable Image 工程模板建立一个工程;②选择File-New中的File新建一个新的汇编文件*.s,并添加到刚才的项目中,并选中三种生成文件。

③编写*.s中的内容:把R0和R1中的内容相加并保存到R0中④设置Edit-Perference-Font & Tabs:Font:Fixedsys;选中Tab Inserts Spaces⑤设置Edit-DebugRel Settings-ARM Linker:Output-Simple:ROBase-0x40000000,RW Base-0x40003000Options-Image entry point:0x40000000⑥P roject-Make:编译链接工程⑦P roject-Debug:调试追踪程序1.5 思考强行重新编译工程的所有文件:Project-Remove Object code,删除工程中的*.obj文件*.s 文件程序参考:AREA Example1, CODE,READONL Y ;声明代码段ExampleENTRY ;声明程序入口CODE32 ;声明32位ARM指令STARTMOV R0, #15 ;设置参数MOV R1,#8ADDS R0,R0,R1 ;R0=R0+R1B STARTEND实验二:汇编指令实验2.1 实验目的:①了解ADS1.2集成开发环境的使用方法;②掌握ARM 汇编指令的用法,并能编写简单的汇编程序;③掌握指令的条件执行和使用LDR/STR指令完成存储器的访问2.2 实验设备:①硬件:PC机②软件:Windows xp系统,ADS1.2集成开发环境2.3 实验内容:①使用LDR指令读取0x40003100上的数据,将数据加1,若结果小于10则使用STR指令把结果写回原地址,若结果大于等于10,则把0写原地址。

北航ARM9实验报告:实验3uCOS-II实验

北航ARM9实验报告:实验3uCOS-II实验

北航ARM9实验报告:实验3uCOS-II实验北航 ARM9 实验报告:实验 3uCOSII 实验一、实验目的本次实验的主要目的是深入了解和掌握 uCOSII 实时操作系统在ARM9 平台上的移植和应用。

通过实际操作,熟悉 uCOSII 的任务管理、内存管理、中断处理等核心机制,提高对实时操作系统的理解和应用能力,为后续的嵌入式系统开发打下坚实的基础。

二、实验环境1、硬件环境:ARM9 开发板、PC 机。

2、软件环境:Keil MDK 集成开发环境、uCOSII 源代码。

三、实验原理uCOSII 是一个可裁剪、可剥夺型的多任务实时内核,具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点。

其基本原理包括任务管理、任务调度、时间管理、内存管理和中断管理等。

任务管理:uCOSII 中的任务是一个独立的执行流,每个任务都有自己的堆栈空间和任务控制块(TCB)。

任务可以处于就绪、运行、等待、挂起等状态。

任务调度:采用基于优先级的抢占式调度算法,始终让优先级最高的就绪任务运行。

时间管理:通过系统时钟节拍来实现任务的延时和定时功能。

内存管理:提供了简单的内存分区管理和内存块管理机制。

中断管理:支持中断嵌套,在中断服务程序中可以进行任务切换。

四、实验步骤1、建立工程在 Keil MDK 中创建一个新的工程,选择对应的 ARM9 芯片型号,并配置相关的编译选项。

2、导入 uCOSII 源代码将 uCOSII 的源代码导入到工程中,并对相关的文件进行配置,如设置任务堆栈大小、系统时钟节拍频率等。

3、编写任务函数根据实验要求,编写多个任务函数,每个任务实现不同的功能。

4、创建任务在主函数中使用 uCOSII 提供的 API 函数创建任务,并设置任务的优先级。

5、启动操作系统调用 uCOSII 的启动函数,使操作系统开始运行,进行任务调度。

6、调试与测试通过单步调试、查看变量值和输出信息等方式,对系统的运行情况进行调试和测试,确保任务的执行符合预期。

单片机(arm9)实验报告

单片机(arm9)实验报告

实验一数码管实验一、实验目的1. 了解数码管的显示原理;2. 掌握JXARM9-2440 中数码管显示编程方法二、实验原理7段LED由7个发光二极管按“日”字形排列,所有发光二极管的阳极连在一起称共阳极接法,阴极连在一起称为共阴极接法。

LED显示器的接口一般有静态显示与动态显示接口两种方式。

本实验中采用的是动态显示接口,其中数码管扫描控制地址为0x20007000,位0-位5每位分别对应一个数码管,将其中某位清0 来选择相应的数码管,地址0x20006000 为数码管的数据寄存器。

数码管采用共阳方式,向该地址写一个数据就可以控制LED 的显示,其原理图如图所示。

三、实验内容1、六个数码管同时正向显示0-F ,然后反向显示F-0。

2、在六个数码管上依次显示“HELLO”,可分辨出轮流显示。

3、在六个数码管上依次显示“HELLO”,分辨不出轮流显示。

4*、在每个数码管上递增显示0-9 。

步骤同上。

四、实验程序1、六个数码管同时正向显示0-F ,然后反向显示F-0。

/****************************************************************************/ /*文件名称:LEDSEG7.C */ /*实验现象:数码管依次显示出0、1,2、……9、a、b、C、d、E、F */ /****************************************************************************/ #define U8 unsigned charunsigned char seg7table[16] = {/* 0 1 2 3 4 5 6 7*/0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,/* 8 9 A B C D E F*/0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e,};void Delay(int time);/****************************************************************************/ /* 函数说明: JXARM9-2410 7段构共阳数码管测试*//* 功能描述: 依次在7段数码管上显示0123456789ABCDEF */ /* 返回代码: 无*/ /* 参数说明: 无*/ /****************************************************************************/ void Test_Seg7(void){int i;*((U8*)0x20007000)=0x00;for( ; ;){for(i=0;i<10;i++){*((U8*)0x20006000)=seg7table[i];Delay(5000);}for(i=0xf;i>=0;i--){*((U8*)0x20006000)=seg7table[i];Delay(5000);}}}/****************************************************************************/ /* Function name : 循环延时子程序*//* Description : 循环'time' 次*//* Return type :void *//* Argument : 循环延时计数器*//****************************************************************************/ void Delay(int time) {int i;int delayLoopCount=1000;for(;time>0;time--);for(i=0;i<delayLoopCount;i++);}2、在六个数码管上依次显示“HELLO”,可分辨出轮流显示。

集美大学ARM实验一报告

集美大学ARM实验一报告

集美大学计算机工程学院实验报告课程名称:嵌入式系统概论班级:软件1191实验成绩:指导教师:万春姓名:实验项目名称:了解ARM 学号:上机实践日期:实验项目编号:实验一组号:上机实践时间:学时一、目的(本次实验所涉及并要求掌握的知识点)1. 了解ARM,公司2. 认识ARM公司产品二、实验内容(本次实验所使用的平台和相关软件)1. 了解ARM的历史;2. 了解ARM的现状;3. 了解ARM的未来。

三、实验设备1. 硬件:PC机四、实验步骤1. ARM的历史、1978年12月5日,物理学家赫尔曼·豪泽(Hermann Hauser)和工程师Chris Curry,在英国剑桥创办了CPU公司(Cambridge Processing Unit),主要业务是为当地市场供应电子设备。

1979年,CPU公司改名为Acorn计算机公司。

起初,Acom公司打算使用16位摩托罗拉芯片,但发现芯片是太慢,太贵了。

“价格500英镑的机器,不能使用CPU价格100英镑!“他们转而索要80286英特尔芯片设计数据,但被拒绝,然后被迫自行研发。

1985年,Roger Wilson和Steve Furber设计了他们自己的第一代32位、6M Hz的处理器,用它做出了一台RISC指令集的计算机,简称ARM(Acorn RISC Machine)。

这就是ARM这个名字的由来。

RISC的全称是"精简指令集计算机"(reduced instruction set computer),它支持的指令比较简单,所以功耗小、价格便宜,特别合适移动设备。

早期使用ARM芯片的典型设备,就是苹果公司的牛顿PDA。

1990年11月27日,Acorn公司正式改组为ARM计算机公司。

公司成立后,业务一度很不景气,工程师们人心惶惶,担心将要失业。

由于缺乏资金,ARM做出了一个意义深远的决定:自己不制造芯片,只将芯片的设计方案授权(licensing)给其他公司,由它们来生产。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

轻工业学院实训报告实训名称:项目一:编写从A/D转换器的通道x获取模拟数据,并将转换后的数字量以波形的形式在LCD上显示的程序项目二:触摸屏驱动程序设计姓名:克歌院(系):计算机与通信工程学院专业班级:嵌入式09--01学号: 1指导教师:雪琴成绩:时间:2011年 8月 29日至 2011年 9 月 7 日一、需求说明1.巩固和强化学生的嵌入式系统的基本概念和开发流程,掌握基本知识和基本技能。

2.掌握硬件开发平台、开发资源和软件开发环境,尤其是裸机嵌入式系统开发方法。

掌握汇编和C语言混合编程技巧,熟悉系统启动引导过程,能够成功移植嵌入式系统引导程序。

培养和训练学生综合利用所学基本知识和基本技能进行小型裸机程序开发的技能。

3.明确思路和任务,查询相关书籍、资料,综合了解ARM的AD转换器和LCD 驱动器,重点分析时S3C2440的LCD 驱动器的工作原理和初始化方法。

分析与AD转换相关的寄存器,编写AD转换器的初始化函数,编写获取AD转换结果的函数。

分析与LCD相关的寄存器,编写LCD 驱动器的初始化函数,配置显示方式。

分析LCD绘图的API函数。

编写主函数,将AD转换结果在LCD上以波形的方式显示,同时以串口输出到PC机。

进入调试。

实现转换数据实时输出,实现串口输出数据与LCD 波形显示的一致。

4.明确思路和任务,查询相关书籍、资料,重点分析S3C2440的触摸屏接口工作原理和相关寄存器。

编写触摸屏初始化函数,确定XY位置转换模式。

编写触摸屏中断初始化函数,中断服务函数。

编写屏幕校准函数。

确定坐标计算公式。

编写触点数据采集函数。

编写主函数,进入调试。

实现触摸屏坐标点x、y的正确读取。

二、功能描述项目一:编写从A/D转换器的通道x获取模拟数据,并将转换后的数字量以波形的形式在LCD上显示的程序。

项目二:通过对AD转换器的配置——触摸屏自动测试x/y位置模式,选择进入到触摸屏驱动函数。

在进行触摸屏测试时,先进入函数判断是否启动A/D转换,如果不是的话就跳出此函数,如果是的话进行下面的判断,看A/D转换是否结束,如果是,跳出函数,如果不是运行程序,并输出x、y的值。

再回到触摸屏驱动函数,测试结束,清屏。

三、系统设计及实现项目一:一.项目一系统设计1. 编写AD转换器的初始化函数;2. 设计函数,获取AD转换的结果;3. 初始化LCD相关寄存器;4. 设计函数,使单个象素的显示数据输出,在LCD上显示。

二.项目一流程图三.项目一实现LCD清屏及单个像素显示函数编写Test Adc函数,期间调用了Lcd_ClearScr PutPixe两个函数添加H-JTag选择.axf文件,并打开将其程序下载到开发板中实验程序代码经过调试,没有错误,进入运行阶段在超级终端中显示测试结果在LCD中显示的结果,由于没有改变电阻,因此看到了在极小围变化的点项目二:一.项目二系统设计1. 对触摸屏相关寄存器进行初始化,确定XY位置转换模式;2. 对中断初始化,设计中断服务函数;3. 通过校正函数和坐标计算公式,得出坐标。

二.项目二流程图NYN Y 三.项目二实现对ADC相关寄存器,中断进行设置开始在main函数中调用Test_Touchpanel函数对ADC相关寄存器进行配设置中断,进行数据采集开中断,AD转换是否开启AD转换是否结束进行数据转换,并输出数据等待中断结束中断服务函数在主函数中直接调用Test_Touchpanel函数最终测试结果,每碰触一下触摸屏,就在终端中显示一对XP,YP值四、实训心得两周时间转瞬即逝,在这两周里,我们潜心研究,以MINI2440开发板为实验硬件平台,采用ADS集成开发环境,是我们在课程容基础上,加强对嵌入式系统的理解和裸机应用的设计。

在此过程中,需要我们分析嵌入式CPU引导程序的功能和引导过程,学会裸机驱动程序的开发以及简单应用程序的设计。

从而深化我们的专业基本技能,加强我们的动手能力。

通过本次实训,我们了解到了团队的力量。

小组以积极认真的态度应对,遵纪守纪,发现问题,解决问题,同时也培养了自己的独立工作能力。

通过本次实训,我们基本掌握了嵌入式系统的特点,性能,掌握了开发板的硬件资源,熟悉了S3C2440的功能和接口。

通过本次实训,我们还熟练了ADS集成开发环境的使用,掌握了ADS开发和调试裸机程序的过程和方法。

同时,实训培养了我们学生一定的查阅教材,数据手册和各类相关资料的能力,进而养成自我学习的习惯,掌握底层硬件资源的驱动开发过程。

在此实训中也遇到了很多问题。

比如,在函数调用中会出现没有提前声明函数;在使用时会出现重复定义;尤其是在触摸屏程序设计中,一直对校正函数无法下手,后来才了解到在MINI2440中是直接转化的。

总之,本次实训对我们作用巨大,影响深远,不仅巩固了现阶段所学的知识,而且为以后的工作生活做足充分准备。

也对“学海无涯”有了更深一步的体会,在以后的学习中,要更加踏实,更加努力!五、附录(代码)/**********************项目一代码******************************************NAME: u2440mon.cDESC: u2440mon entry point,menu,downloadHISTORY:Mar.25.2002:purnnamu: S3C2400X profile.c is ported for S3C2410X.Mar.27.2002:purnnamu: DMA is enabled.Apr.01.2002:purnnamu: isDownloadReady flag is added.Apr.10.2002:purnnamu: - Selecting menu is available in the waiting loop.So, isDownloadReady flag gets not needed- UART ch.1 can be selected for the console.Aug.20.2002:purnnamu: revision number change 0.2 -> R1.1Sep.03.2002:purnnamu: To remove the power noise in the USB signal, the unused CLKOUT0,1 is disabled.****************************************************************/#define GLOBAL_CLK 1#include <stdlib.h>#include <string.h>#include "def.h"#include "option.h"#include "2440addr.h"#include "2440lib.h"#include "2440slib.h"#include "mmu.h"#include "profile.h"#include "memtest.h"extern char Image$$RO$$Limit[];extern char Image$$RO$$Base[];extern char Image$$RW$$Limit[];extern char Image$$RW$$Base[];extern char Image$$ZI$$Limit[];extern char Image$$ZI$$Base[];void Isr_Init(void);void HaltUndef(void);void HaltSwi(void);void HaltPabort(void);void HaltDabort(void);void ClearMemory(void);void Clk0_Enable(int clock_sel);void Clk1_Enable(int clock_sel);void Clk0_Disable(void);void Clk1_Disable(void);//extern void TFT_LCD_Init(void);//extern void TFT_LCD_Test(void);extern void TFT_LCD_Init(void);extern void TFT_LCD_Test(void);extern void Test_Touchpanel(void) ;extern void Test_Adc(void) ; //adc test extern void KeyScan_Test(void) ;extern void RTC_Display(void) ;extern void Test_IrDA_Tx(void) ;extern void PlayMusicTest(void) ;extern void RecordTest( void ) ;extern void Test_Iic(void) ;extern void Test_SDI(void) ;extern void Camera_Test( void ) ;volatile U32 downloadAddress;void (*restart)(void)=(void (*)(void))0x0;volatile unsigned char *downPt;volatile U32 downloadFileSize;volatile U16 checkSum;volatile unsigned int err=0;volatile U32 totalDmaCount;volatile int isUsbdSetConfiguration;int download_run=0;U32 tempDownloadAddress;int menuUsed=0;extern char Image$$RW$$Limit[];U32 *pMagicNum=(U32 *)Image$$RW$$Limit;int consoleNum;static U32 cpu_freq;static U32 UPLL;static void cal_cpu_bus_clk(void){U32 val;U8 m, p, s;val = rMPLLCON;m = (val>>12)&0xff;p = (val>>4)&0x3f;s = val&3;//(m+8)*FIN*2 不要超出32位数!FCLK = ((m+8)*(FIN/100)*2)/((p+2)*(1<<s))*100;val = rCLKDIVN;m = (val>>1)&3;p = val&1;val = rCAMDIVN;s = val>>8;switch (m) {case 0:HCLK = FCLK;break;case 1:HCLK = FCLK>>1;break;case 2:if(s&2)HCLK = FCLK>>3;elseHCLK = FCLK>>2;break;if(s&1)HCLK = FCLK/6;elseHCLK = FCLK/3;break;}if(p)PCLK = HCLK>>1;elsePCLK = HCLK;if(s&0x10)cpu_freq = HCLK;elsecpu_freq = FCLK;val = rUPLLCON;m = (val>>12)&0xff;p = (val>>4)&0x3f;s = val&3;UPLL = ((m+8)*FIN)/((p+2)*(1<<s));UCLK = (rCLKDIVN&8)?(UPLL>>1):UPLL;}void Temp_function() { Uart_Printf("\nPlease input 1-16 to select test!!!\n"); }struct {void (*fun)(void);}CmdTip[] = {{ Temp_function, "Please input 1-16 to select test" } ,{ BUZZER_PWM_Test, "Test PWM" } ,{ RTC_Display, "RTC time display" } ,{ Test_Adc, "Test ADC" } ,{ KeyScan_Test, "Test interrupt and key scan" } ,{ Test_Touchpanel, "Test Touchpanel" } ,{ TFT_LCD_Test, "Test TFT-LCD or VGA1024x768 module" } ,{ Test_Iic, "Test IIC EEPROM, if use QQ2440, please remove the LCD" } ,{ PlayMusicTest, "UDA1341 play music" } ,{ Test_SDI, "Test SD Card" } ,{ Camera_Test, "Test CMOS Camera"},{ 0, 0}};/**************************************************************640×480 TFT LCD单个象素的显示数据输出**************************************************************/void PutPixel(U32 x,U32 y,U16 c){if(x<SCR_XSIZE && y<SCR_YSIZE)LCD_BUFFER[(y)][(x)] = c;}/**************************************************************640×480 TFT LCD全屏填充特定颜色单元或清屏**************************************************************/void Lcd_ClearScr( U16 c){unsigned int x,y ;for( y = 0 ; y < SCR_YSIZE ; y++ ){for( x = 0 ; x < SCR_XSIZE ; x++ ){LCD_BUFFER[y][x] = c ;}}}void Test_Adc(void){int a0=0, a1=0; //Initialize variablesU32 rADCCON_save = rADCCON;Uart_Printf( "ADC INPUT Test, press ESC key to exit !\n" ) ;preScaler = ADC_FREQ;Uart_Printf("ADC conv. freq. = %dHz\n",preScaler);preScaler = 50000000/ADC_FREQ -1; //PCLK:50.7MHz Uart_Printf("PCLK/ADC_FREQ - 1 = %d\n",preScaler);Lcd_ClearScr( (0x1f<<11) | (0x3f<<5) | (0x1f) ) ;while( Uart_GetKey() != ESC_KEY ){a0=ReadAdc(0); //对应开发板上W1可调电阻//a1=ReadAdc(1); //对应开发板上W2可调电阻a1+=1;Uart_Printf( "AIN0: %04d, AIN1: %04d\n", a0, a1 );PutPixel(a0-400,a1,0x0000);Delay( 500 ) ;}//rADCCON=(0<<14)|(19<<6)|(7<<3)|(1<<2); //stand by mode to reduce power consumption rADCCON = rADCCON_save;Uart_Printf("\nrADCCON = 0x%x\n", rADCCON);}void Main(void){char *mode;int i;U8 key;U32 mpll_val = 0 ;//U32 divn_upll = 0 ;#if ADS10// __rt_lib_init(); //for ADS 1.0#endifPort_Init();Isr_Init();i = 2 ; //don't use 100M!//boot_params.cpu_clk.val = 3;switch ( i ) {case 0: //200key = 12;mpll_val = (92<<12)|(4<<4)|(1);break;case 1: //300key = 13;mpll_val = (67<<12)|(1<<4)|(1);break;case 2: //400key = 14;mpll_val = (92<<12)|(1<<4)|(1);break;case 3: //440!!!key = 14;mpll_val = (102<<12)|(1<<4)|(1);break;default:key = 14;mpll_val = (92<<12)|(1<<4)|(1);break;}//init FCLK=400M, so change MPLL firstChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3); ChangeClockDivider(key, 12);cal_cpu_bus_clk();consoleNum = 0; // Uart 1 select for debug.Uart_Init( 0,115200 );Uart_Select( consoleNum );Beep(2000, 100);Uart_SendByte('\n');Uart_Printf("<***********************************************>\n");Uart_Printf(" SBC2440 Test Program VER1.0\n");Uart_Printf(" \n");Uart_Printf(" Build time is: %s %s\n", __DATE__ , __TIME__ );Uart_Printf( " Image$$RO$$Base = 0x%x\n", Image$$RO$$Base );Uart_Printf( " Image$$RO$$Limit = 0x%x\n", Image$$RO$$Limit );Uart_Printf( " Image$$RW$$Base = 0x%x\n", Image$$RW$$Base );Uart_Printf( " Image$$RW$$Limit = 0x%x\n", Image$$RW$$Limit ); Uart_Printf( " Image$$ZI$$Base = 0x%x\n", Image$$ZI$$Base ); Uart_Printf( " Image$$ZI$$Limit = 0x%x\n", Image$$ZI$$Limit );Uart_Printf("<***********************************************>\n");rMISCCR=rMISCCR&~(1<<3); // USBD is selected instead of USBH1rMISCCR=rMISCCR&~(1<<13); // USB port 1 is enabled.//// USBD should be initialized first of all.//// isUsbdSetConfiguration=0;// rd_dm9000_id(); //// rGPBCON &= ~(3<<20); //CF_CARD Power// rGPBCON |= 1<<20;// rGPBDAT |= 1<<10;// rDSC0 = 0x155;// rDSC1 = 0x15555555;rDSC0 = 0x2aa;rDSC1 = 0x2aaaaaaa;//Enable NAND, USBD, PWM TImer, UART0,1 and GPIO clock,//the others must be enabled in OS!!!rCLKCON = 0xfffff0;//MMU_EnableICache();MMU_Init(); ////Uart_Printf("NOR Flash ID is 0x%08x\n", GetFlashID());pISR_SWI=(_ISR_STARTADDRESS+0xf0); //for pSOSLed_Display(0x66);#if USBDMAmode="DMA";#elsemode="Int";#endif// CLKOUT0/1 select.//Uart_Printf("CLKOUT0:MPLL in, CLKOUT1:RTC clock.\n");//Clk0_Enable(0); // 0:MPLLin, 1:UPLL, 2:FCLK, 3:HCLK, 4:PCLK, 5:DCLK0 //Clk1_Enable(2); // 0:MPLLout, 1:UPLL, 2:RTC, 3:HCLK, 4:PCLK, 5:DCLK1 Clk0_Disable();Clk1_Disable();mpll_val = rMPLLCON;TFT_LCD_Init();// TFT_LCD_Init();download_run=1; //The default menu is the Download & Run mode.while(1){U8 idx;Uart_Printf("\nPlease select function : \n");for(i=0; CmdTip[i].fun!=0; i++)Uart_Printf("%d : %s\n", i, CmdTip[i].tip);idx = Uart_GetIntNum_GJ() ;if(idx<i){(*CmdTip[idx].fun)();Delay(20);Uart_Init( 0,115200 );}}}void Isr_Init(void){pISR_UNDEF=(unsigned)HaltUndef;pISR_SWI =(unsigned)HaltSwi;pISR_PABORT=(unsigned)HaltPabort;pISR_DABORT=(unsigned)HaltDabort;rINTMOD=0x0; // All=IRQ moderINTMSK=BIT_ALLMSK; // All interrupt is masked.//pISR_URXD0=(unsigned)Uart0_RxInt;//rINTMSK=~(BIT_URXD0); //enable UART0 RX Default value=0xffffffff//#if 1// pISR_USBD =(unsigned)IsrUsbd;// pISR_DMA2 =(unsigned)IsrDma2;//#else// pISR_IRQ =(unsigned)IsrUsbd;//Why doesn't it receive the big file if use this. (???)//It always stops when 327680 bytes are received.//#endif// ClearPending(BIT_DMA2);// ClearPending(BIT_USBD);//rINTMSK&=~(BIT_USBD);//pISR_FIQ,pISR_IRQ must be initialized}void HaltUndef(void){Uart_Printf("Undefined instruction exception!!!\n");while(1);}void HaltSwi(void){Uart_Printf("SWI exception!!!\n");while(1);}void HaltPabort(void){Uart_Printf("Pabort exception!!!\n");while(1);}void HaltDabort(void){Uart_Printf("Dabort exception!!!\n");while(1);}void ClearMemory(void){//int i;//U32 data;int memError=0;U32 *pt;Uart_Printf("Clear Memory (%xh-%xh):WR",_RAM_STARTADDRESS,HEAPEND);pt=(U32 *)_RAM_STARTADDRESS;while((U32)pt < HEAPEND){*pt=(U32)0x0;pt++;}if(memError==0)Uart_Printf("\b\bO.K.\n");}void Clk0_Enable(int clock_sel){ // 0:MPLLin, 1:UPLL, 2:FCLK, 3:HCLK, 4:PCLK, 5:DCLK0 rMISCCR = rMISCCR&~(7<<4) | (clock_sel<<4);rGPHCON = rGPHCON&~(3<<18) | (2<<18);}void Clk1_Enable(int clock_sel){ // 0:MPLLout, 1:UPLL, 2:RTC, 3:HCLK, 4:PCLK, 5:DCLK1 rMISCCR = rMISCCR&~(7<<8) | (clock_sel<<8);rGPHCON = rGPHCON&~(3<<20) | (2<<20);}void Clk0_Disable(void){rGPHCON = rGPHCON&~(3<<18); // GPH9 Input}void Clk1_Disable(void){rGPHCON = rGPHCON&~(3<<20); // GPH10 Input}/*****************项目二代码*********************************************** NAME: u2440mon.cDESC: u2440mon entry point,menu,downloadHISTORY:Mar.25.2002:purnnamu: S3C2400X profile.c is ported for S3C2410X.Mar.27.2002:purnnamu: DMA is enabled.Apr.01.2002:purnnamu: isDownloadReady flag is added.Apr.10.2002:purnnamu: - Selecting menu is available in the waiting loop.So, isDownloadReady flag gets not needed- UART ch.1 can be selected for the console.Aug.20.2002:purnnamu: revision number change 0.2 -> R1.1Sep.03.2002:purnnamu: To remove the power noise in the USB signal, the unused CLKOUT0,1 is disabled.****************************************************************/#define GLOBAL_CLK 1#include <stdlib.h>#include <string.h>#include "def.h"#include "option.h"#include "2440addr.h"#include "2440lib.h"#include "2440slib.h"#include "mmu.h"#include "profile.h"#include "memtest.h"extern char Image$$RO$$Limit[];extern char Image$$RO$$Base[];extern char Image$$RW$$Limit[];extern char Image$$RW$$Base[];extern char Image$$ZI$$Limit[];extern char Image$$ZI$$Base[];void Isr_Init(void);void HaltUndef(void);void HaltSwi(void);void HaltPabort(void);void HaltDabort(void);void ClearMemory(void);void Clk0_Enable(int clock_sel);void Clk1_Enable(int clock_sel);void Clk0_Disable(void);void Clk1_Disable(void);//extern void TFT_LCD_Init(void);//extern void TFT_LCD_Test(void);extern void TFT_LCD_Init(void);extern void TFT_LCD_Test(void);extern void Test_Touchpanel(void) ;extern void Test_Adc(void) ; //adc test extern void KeyScan_Test(void) ;extern void RTC_Display(void) ;extern void Test_IrDA_Tx(void) ;extern void PlayMusicTest(void) ;extern void RecordTest( void ) ;extern void Test_Iic(void) ;extern void Test_SDI(void) ;extern void Camera_Test( void ) ;volatile U32 downloadAddress;void (*restart)(void)=(void (*)(void))0x0;volatile unsigned char *downPt;volatile U32 downloadFileSize;volatile U16 checkSum;volatile unsigned int err=0;volatile U32 totalDmaCount;volatile int isUsbdSetConfiguration;int download_run=0;U32 tempDownloadAddress;int menuUsed=0;extern char Image$$RW$$Limit[];U32 *pMagicNum=(U32 *)Image$$RW$$Limit;int consoleNum;static U32 cpu_freq;static U32 UPLL;static void cal_cpu_bus_clk(void){U32 val;U8 m, p, s;val = rMPLLCON;m = (val>>12)&0xff;p = (val>>4)&0x3f;s = val&3;//(m+8)*FIN*2 不要超出32位数!FCLK = ((m+8)*(FIN/100)*2)/((p+2)*(1<<s))*100;val = rCLKDIVN;m = (val>>1)&3;p = val&1;val = rCAMDIVN;s = val>>8;switch (m) {case 0:HCLK = FCLK;break;case 1:HCLK = FCLK>>1;break;case 2:if(s&2)HCLK = FCLK>>3;elseHCLK = FCLK>>2;break;case 3:if(s&1)HCLK = FCLK/6;elseHCLK = FCLK/3;break;}if(p)PCLK = HCLK>>1;elsePCLK = HCLK;if(s&0x10)cpu_freq = HCLK;elsecpu_freq = FCLK;val = rUPLLCON;m = (val>>12)&0xff;p = (val>>4)&0x3f;s = val&3;UPLL = ((m+8)*FIN)/((p+2)*(1<<s));UCLK = (rCLKDIVN&8)?(UPLL>>1):UPLL;}void Temp_function() { Uart_Printf("\nPlease input 1-16 to select test!!!\n"); }struct {void (*fun)(void);char *tip;}CmdTip[] = {{ Temp_function, "Please input 1-16 to select test" } ,{ BUZZER_PWM_Test, "Test PWM" } ,{ RTC_Display, "RTC time display" } ,{ Test_Adc, "Test ADC" } ,{ KeyScan_Test, "Test interrupt and key scan" } ,{ Test_Touchpanel, "Test Touchpanel" } ,{ TFT_LCD_Test, "Test TFT-LCD or VGA1024x768 module" } ,{ Test_Iic, "Test IIC EEPROM, if use QQ2440, please remove the LCD" } ,{ PlayMusicTest, "UDA1341 play music" } ,{ Test_SDI, "Test SD Card" } ,{ Camera_Test, "Test CMOS Camera"},{ 0, 0}};void __irq AdcTsAuto(void){int i;U32 saveAdcdly;if(rADCDAT0&0x8000){//Uart_Printf("\nStylus Up!!\n");rADCTSC&=0xff; // Set stylus down interrupt bit}//else//Uart_Printf("\nStylus Down!!\n");rADCTSC=(1<<3)|(1<<2); //Pull-up disable, Seq. X,Y postion measure.saveAdcdly=rADCDLY;rADCDLY=40000; //Normal conversion mode delay about (1/50M)*40000=0.8msrADCCON|=0x1; //start ADCwhile(rADCCON & 0x1); //check if Enable_start is lowwhile(!(rADCCON & 0x8000)); //check if EC(End of Conversion) flagis high, This line is necessary~!!while(!(rSRCPND & (BIT_ADC))); //check if ADC is finished with interrupt bitxdata=(rADCDAT0&0x3ff);ydata=(rADCDAT1&0x3ff);//YH 0627, To check Stylus Up Interrupt.rSUBSRCPND|=BIT_SUB_TC;ClearPending(BIT_ADC);rINTSUBMSK=~(BIT_SUB_TC);rINTMSK=~(BIT_ADC);rADCTSC =0xd3; //Waiting for interruptrADCTSC=rADCTSC|(1<<8); // Detect stylus up interrupt signal.while(1) //to check Pen-up state{if(rSUBSRCPND & (BIT_SUB_TC)) //check if ADC is finished with interrupt bit{//Uart_Printf("Stylus Up Interrupt~!\n");break; //if Stylus is up(1) state}}Uart_Printf("count=%03d XP=%04d, YP=%04d\n", count++, xdata, ydata); //X-position Conversion datarADCDLY=saveAdcdly;rADCTSC=rADCTSC&~(1<<8); // Detect stylus Down interrupt signal.rSUBSRCPND|=BIT_SUB_TC;rINTSUBMSK=~(BIT_SUB_TC); // Unmask sub interrupt (TC)ClearPending(BIT_ADC);}void Test_Touchpanel(void){rADCDLY=50000; //Normal conversion mode delay about (1/3.6864M)*50000=13.56msrADCCON=(1<<14)+(ADCPRS<<6); //ADCPRS En, ADCPRS ValueUart_Printf("ADC touch screen test\n");rADCTSC=0xd3; //Wfait,XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_EnpISR_ADC = (int)AdcTsAuto;rINTMSK=~BIT_ADC; //ADC Touch Screen Mask bit clearrINTSUBMSK=~(BIT_SUB_TC);Uart_Printf("\nType any key to exit!!!\n");Uart_Printf("\nStylus Down, please...... \n");Uart_Getch();rINTSUBMSK|=BIT_SUB_TC;rINTMSK|=BIT_ADC;Uart_Printf("Touch Screen Test is Finished!!!\n");}void Main(void){char *mode;int i;U8 key;U32 mpll_val = 0 ;//U32 divn_upll = 0 ;#if ADS10// __rt_lib_init(); //for ADS 1.0#endifPort_Init();Isr_Init();i = 2 ; //don't use 100M!//boot_params.cpu_clk.val = 3;switch ( i ) {case 0: //200key = 12;mpll_val = (92<<12)|(4<<4)|(1);break;case 1: //300key = 13;mpll_val = (67<<12)|(1<<4)|(1);break;case 2: //400key = 14;mpll_val = (92<<12)|(1<<4)|(1);break;case 3: //440!!!key = 14;mpll_val = (102<<12)|(1<<4)|(1);break;default:key = 14;mpll_val = (92<<12)|(1<<4)|(1);break;}//init FCLK=400M, so change MPLL firstChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3); ChangeClockDivider(key, 12);cal_cpu_bus_clk();consoleNum = 0; // Uart 1 select for debug.Uart_Init( 0,115200 );Uart_Select( consoleNum );rMISCCR=rMISCCR&~(1<<3); // USBD is selected instead of USBH1 rMISCCR=rMISCCR&~(1<<13); // USB port 1 is enabled.rDSC0 = 0x2aa;rDSC1 = 0x2aaaaaaa;rCLKCON = 0xfffff0;//MMU_EnableICache();MMU_Init(); ////Uart_Printf("NOR Flash ID is 0x%08x\n", GetFlashID());pISR_SWI=(_ISR_STARTADDRESS+0xf0); //for pSOSLed_Display(0x66);#if USBDMAmode="DMA";#elsemode="Int";#endifClk0_Disable();Clk1_Disable();mpll_val = rMPLLCON;TFT_LCD_Init();// TFT_LCD_Init();download_run=1; //The default menu is the Download & Run mode.Test_Touchpanel();}void Isr_Init(void){pISR_UNDEF=(unsigned)HaltUndef;pISR_SWI =(unsigned)HaltSwi;pISR_PABORT=(unsigned)HaltPabort;pISR_DABORT=(unsigned)HaltDabort;rINTMOD=0x0; // All=IRQ moderINTMSK=BIT_ALLMSK; // All interrupt is masked.}void HaltUndef(void){Uart_Printf("Undefined instruction exception!!!\n");while(1);}void HaltSwi(void){Uart_Printf("SWI exception!!!\n");while(1);}void HaltPabort(void){Uart_Printf("Pabort exception!!!\n");while(1);}void HaltDabort(void){Uart_Printf("Dabort exception!!!\n");while(1);}void ClearMemory(void){//int i;//U32 data;int memError=0;U32 *pt;Uart_Printf("Clear Memory (%xh-%xh):WR",_RAM_STARTADDRESS,HEAPEND);pt=(U32 *)_RAM_STARTADDRESS;while((U32)pt < HEAPEND){*pt=(U32)0x0;pt++;}if(memError==0)Uart_Printf("\b\bO.K.\n");}void Clk0_Enable(int clock_sel){ // 0:MPLLin, 1:UPLL, 2:FCLK, 3:HCLK, 4:PCLK, 5:DCLK0 rMISCCR = rMISCCR&~(7<<4) | (clock_sel<<4);rGPHCON = rGPHCON&~(3<<18) | (2<<18);}void Clk1_Enable(int clock_sel){ // 0:MPLLout, 1:UPLL, 2:RTC, 3:HCLK, 4:PCLK, 5:DCLK1 rMISCCR = rMISCCR&~(7<<8) | (clock_sel<<8);rGPHCON = rGPHCON&~(3<<20) | (2<<20);}void Clk0_Disable(void){rGPHCON = rGPHCON&~(3<<18); // GPH9 Input}void Clk1_Disable(void){rGPHCON = rGPHCON&~(3<<20); // GPH10 Input}。

相关文档
最新文档