arm9开发板实验报告1
- 格式:doc
- 大小:416.50 KB
- 文档页数:34
郑州轻工业学院实训报告实训名称:项目一:编写从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位置模式,选择进入到触摸屏驱动函数。
实时操作系统实验报告专业:电子信息工程学号: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有了更深的认识并对老师上课所讲的内容有了更深的理解。
实验一: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 实验报告:实验 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、调试与测试通过单步调试、查看变量值和输出信息等方式,对系统的运行情况进行调试和测试,确保任务的执行符合预期。
实验一数码管实验一、实验目的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”,可分辨出轮流显示。
集美大学计算机工程学院实验报告课程名称:嵌入式系统概论班级:软件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实验设计题目基于ARM9的数据采集应用程序设计。
1.2 设计目的巩固、实践本课程所学理论知识,由于这门课程是理论与实践相结合且实践性很强的课程,该课程的学习目标是培养学生嵌入式开发的基本能力,通过实验设计培养学生查阅、合理运用参考资料的能力。
1.3 设计任务及要求1.3.1 设计任务通过S3C2410X(ARM9)的ADC采集实验箱电位器的值,旋转电位器时可在屏幕上看到当前采集值的变化。
实验箱有三个电位器,学生可自选一个或多个。
可增功能:(1)中断功能:按下中断按键触发中断,中断时三个LED灯闪烁一次,且屏幕上打印正在中断的提示。
(2)报警功能:设定一个临界值(如500),当采集的值超过此临界值时,灯闪烁报警,三个电位器可与三个灯一一对应。
、1.3.2 报告要求(1)实现的功能(2)软硬件平台(3)硬件原理分析及原理图(4)硬件驱动的实现步骤及分析(5)代码设计:所有需要编写的代码(如adc.c、adc.h、main.c、Makefile等)、代码的注释。
(6)运行及调试的步骤(7)心得体会1.4 实验平台硬件平台:博创经典UP-NETARM2410实验箱(S3C2410处理器)。
软件平台:eclipse+keil+PUTTY(串口调试助手)。
2.1硬件原理在ADC这章中相应的硬件原理图截图如下:图1 硬件原理图2.2设计原理由硬件原理图可知AD和DA转化与AIN0,AIN1,AIN2三个引脚有关,在gpio一章中查找可知这三个引脚均不是多功能引脚。
在AD和DA转化时也不需要用到时钟信号。
A/D转换器是模拟信号和CPU之间联系的接口,它将连续变化的模拟信号转换为数字信号,以供计算机和数字系统进行分析、处理、存储、控制和显示。
在编写驱动是可以通过查找数据手册。
2.3选择通道通过底板AD-DA-CAN图可知三个ADC电位器对应AINO2,所以选择通道2。
ADCCON[5:3]=010;ADCCON&=~(0x7<<3);ADCCON|=0x1<<4;2.4时钟配置与分频ADC控制寄存器(ADCCON)地址为0x58000000。
ARM 实验报告学院:计算机科学与工程学院班级: 070603 学号: 070603115 姓名:张鑫实验一:工程配置一、处理器配置选择菜单项Project > Settings…或快捷键Alt+F7,弹出工程设置对话框。
在工程设置对话框中,选择Processor设置对话框,如下图,可进行目标板所用处理器的配置。
图1 处理器配置对话框用户选择对应的工程文件名进行相应的配置。
图中各项设置定义如下:处理器模块(CPU Module)选择当前所使用的处理器模块,不同的处理器模块将支持不同的处理器系列,目前Embest IDE for ARM 支持ARM7、ARM9核系列处理器。
处理器系列(CPU Family)选择用户使用的处理器所属处理器系列。
处理器成员(CPU Member)设置处理器系列中具体的处理器成员。
字节排列方式(Endian)设置该处理器当前所支持的存储区字节排列方式是大字节结尾(Big Endian)还是小字节结尾方式(Little Endian)。
处理器制造商(Peripheral Maker)选择处理器生产厂家。
处理器型号(Peripheral Chip)选择相应的处理器型号。
编译工具(Build Tools)设置该处理器对应的编译链接器。
Embest IDE for ARM 支持ARM核系列处理器。
开发ARM7核系列处理器,按照图5-11中设置;开发ARM9核系列处理器,可依照图5-11设置作相应的改变。
二、仿真器配置选择菜单项Project>Settings…,弹出工程设置对话框。
在工程设置对话框中,选择Remote设置对话框,如下图,可进行仿真器的连接配置。
图2 仿真器的连接配置在该对话框中,有两项设置:远程连接设备(Remote device)设置连接的调试设备,例如Embest IDE for ARM支持英蓓特公司的Embest Emulator for ARM和Embest PowerICE for ARM。
轻工业学院实训报告实训名称:项目一:编写从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}。