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部分
开始
设置 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实验报告
实时操作系统实验报告专业:电子信息工程学号: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实验报告
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实验
实验一: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 实验报告:实验 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)实验报告
实验一数码管实验一、实验目的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实验一报告
集美大学计算机工程学院实验报告课程名称:嵌入式系统概论班级:软件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)给其他公司,由它们来生产。
ARM9报告-基于ARM9的数据采集应用程序设计
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实验报告
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。
ARM9:按键控制开关实验报告
// P1INP &= ~ 0X04; //P1INP第3位为0,P1.2为"上拉/下拉"模式
// P2INP &= ~ 0X40; //P2INP第6位为0,设置p1口为上拉模式
LED3= 0; // LED3灭
}
{
init();
实验报告
姓名:陈超群班级:14物联网应用技术2班学号:146308201
同组实验者:
实验名称
按键控制开关
实验时间
2016.04.19
实验地点
流321
指导教师
李璐
实验目的与要求:
1.掌握按键应用这一常用人机交互方法;
2.学会使用按键控制外设LED灯。
实验内容:
1.编写IAR程序,实现按键控制LED灯,当按下“SW1”键,LED3灯亮;松开“SW1”键,LED3灯灭。
while(1)
{
if(SW1 == 0) //低电平有效
{delay(100); //检测到按键
if(SW1 == 0) //前面定义了#define SW1 P1.2
{
while(!SW1) LED3= 1; //按键按住期间,LED3灯亮
LED3= 0; //LED3灭
}}}}
6.配置工程选项:1)在General Options选项分别对Target、Data Pointer、Stack/Heap进行设置;2)在linker连接器选项对Output、Config进行设置;3)在Debugger下对Setup标签进行相应设置;设置完毕,单击OK命令按钮
7.下载程序到CC2530,编译和调试:选择菜单Project→Rebuild All对工程进行编译,选择Project→Download and Debug进入调试状态。
北航ARM9实验报告:实验4多任务综合实验
实验四多任务综合实验一、实验目的学习周期任务、任务的同步和任务间通信。
二、实验内容1.运行实验十,删除任务四、任务定义和OSTaskCreate(Task4…),任务三for循环体内仅保留以下两句BSPprintf(0,“run task3\n”); OSTimeDly(3000),在超级终端上观察任务运行情况。
2.使用系统定时中断实现周期任务,任务1 、2、3进入for循环就挂起,在定时钩子函数中定时1秒、2秒和4秒后将其恢复。
3.创建信号量管理数组实现任务间同步,在主函数中定义一个INT16U的两维数组a[2][3],不同的任务往数组内写不同的值,连同任务号一起打印在超级终端上。
4.创建消息邮箱实现任务间通信,Task1记录任务执行的次数,通过消息邮箱在Task2里显示。
5.附加题文件的使用三、实验设备硬件:ARM嵌入式开发平台、用于ARM920T的JTAG仿真器、PC机Pentium100以上。
软件:PC机操作系统Win2000或WinXP、ARM ADS1.2集成开发环境、仿真器驱动程序、超级终端通讯程序。
四、实验原理1、任务间通信的管理:事件控制块ECB。
2、同步与互斥:为了实现资源共享,一个操作系统必须提供临界区操作的功能。
μC/OS采用关闭/打开中断的方式来处理临界区代码,从而避免竞争条件,实现任务间的互斥。
3、信号量:信号量在多任务系统中的功能,实现对共享资源的互斥访问(包括单个共享资源或多个相同的资源),实现任务之间的行为同步。
4、邮箱:一个任务或ISR可以通过邮箱向另一个任务发送一个指针型的变量,该指针指向一个包含了特定“消息”(message)的数据结构;5、消息队列:消息队列可以使一个任务或ISR向另一个任务发送多个以指针方式定义的变量。
图4.1任务、ISR和消息邮箱的关系五、实验步骤1. 以实验十为模板。
2. 将任务函数内的OSTimeDly()删除,在打印语句之前悬挂任务1~3,OSTaskSuspend(Taskn_Prio),按以下路径ucos-ii->arch->os_cpu_c.c 找到钩子函数void OSTimeTickHook (void),用计数器控制恢复任务操作,编写OSTaskResume(Taskn_Prio);3. 信号量管理声明信号量OS_EVENT *Fun_Semp;在Main函数里创建信号量Fun_Semp=OSSemCreate(1);在各个Task里执行下列操作OSSemPend(Fun_Semp,0,&err);………….OSSemPost(Fun_Semp);定义变量INT8U err;4 . 定义事件控制块指针OS_EVENT *Str_Box,在main函数里创建消息邮箱,Str_Box=OSMboxCreate((void*)在Task1里发送消息Times+=1; s=&Times; OSMboxPost(Str_Box,s);在Task2里请求消息邮箱ss=OSMboxPend(Str_Box,0,&err);printf("%d\n",*ss);5.文件的使用文件使用的关键是加载文本文件,用记事本创建test.txt文件,文件的内容不包含汉字。
ARM9实验报告
班级学号姓名日期实验一Linux命令的使用及演示程序的运行一、实验目的:掌握超级终端的使用,熟悉常用Linux命令的使用,并在Linux环境下运行演示程序。
二、实验内容:1、掌握超级终端的使用,自行建立超级终端并与ARM9开发系统连接;2、熟悉常用Linux命令,理解Linux文件系统;3、在Linux下运行系统提供的演示程序,观察程序运行情况。
三、实验设备及工具(包括软件调试工具)硬件:ARM 嵌入式开发平台、PC 机、串口线。
软件:PC 机操作系统Win2000 或WinXP、超级终端通讯程序。
四、实验过程记录:五、回答下列问题:1、列举常用Linux命令并解释功能及用法2、超级终端的作用是什么?如何建立一个超级终端3、请列举运行演示程序需要哪些步骤。
班级学号姓名日期实验二ADS1.2开发环境及绘图API函数实验一、实验目的:ADS1.2开发环境的使用。
并进行绘图API函数的实验。
二、实验内容:1、掌握ADS1.2开发环境和调试环境AXD的使用。
2、打开系统移植试验工程文件,并调试观察运行结果。
3、进一步掌握ADS1.2开发环境的使用及调试方法。
4、打开绘图API函数工程文件,调试并观察运行的结果;5、修改该工程文件调试并观察运行的结果。
三、实验设备及工具(包括软件调试工具)硬件:ARM 嵌入式开发平台、PC 机、用于ARM9开发平台的JTAG 仿真器、串口线。
软件:PC 机操作系统Win2000 或WinXP、ARM ADS1.2 集成开发环境、仿真器驱动程序。
四、实验过程记录:五、回答下列问题:1、UarmJtag.exe的作用是什么。
在ARM9开发平台上使用时应该如何设置。
2、AXD是什么工具?在和UarmJtag配合使用时应该如何设置。
3、简述ADS1.2工程文件的结构,及建立一个工程的大致步骤。
4、什么是API函数,其作用如何?5、AXD的使用大致有哪些步骤?如何设置及取消断点。
6、简单描述绘图API函数的使用。
ARM9实验报告(一)
实验一ARM串行口实验一、实验目的1.掌握ARM的串行口工作原理2.学习编程实现ARM的UART通讯3.掌握S3C2410寄存器配置方法。
二、预备知识1.了解EWARM集成开发环境的基本功能2.学习串口通讯的基本知识3.熟悉S3C2410串口有关的寄存器三、实验设备1.2410s教学实验箱2.ARM920T的JTAG仿真器3.ARM EWARM5.3集成开发环境4.串口连接线四、实验内容1.熟悉打开已有工程的步骤,掌握仿真调试的方法。
2.建立一个新工程,熟练掌握编译器和链接器的设置方法。
3.从串口输入字符串,将0~9数字在超级终端上连续显示,“Enter”键换行。
4.将第三步得到的字符转换成BCD码,限制在0~1023,用于控制直流电机。
五、实验步骤1.创建新工程(1)在D盘根目录创建一个newproj的目录,将ARM串口实验的5个文件夹和2个文件拷入,如上图所示,这5个文件夹是:inc(库文件)、init(初始化文件)、src(源文件)、startup(启动文件)和uhal(串口文件),这2个文件是:s3c2410_ram.icf和上从410_ram.mac(2)运行IAR Embedded Workbench,执行file>new>workspace,工程名newproj1.ewp,保存在d:\newproj下,保存Workspace,和工程名一样,存在同一目录。
此时编译,出现错误。
(3)有3个头文件做以下修改:#include “../inc/macro.h”,#include“../inc/drivers.h“,#include ”../uhal/isr.h“ General Option>Library configuration选Full,C/C++ Compiler>Code>Processor mode选ARM,编译通过。
(4)选CPU,选仿真器RDI、“Run to Main”打勾、选mac文件s3c2410_ram.mac,选链接器配置文件s3c2410_ram.icf,配置仿真器的动态链接库H-JTAG.dll,IAR 生成的out文件供RDI等仿真器使用,通过输出转换可生成bin文件,供vivi 烧写Flash使用。
基于ARM9-S3C2410嵌入式MDK开发实验报告 嵌入式实验报告 MDK ARM9
学校代码: 10128学 号: 20101105二 〇 一 一 年 七 月嵌入式实验报告 题 目:基于A R M 9-S3C2410嵌入式MDK开发实验报告 学生姓名:刁玉贤 学 院:电力学院 专 业:检测技术与自动化装置 学 号:20101105 指导教师:刘志强1实验目的本次实验是在上完ARM理论课后进行的,主要目的有以下几个方面:1、了解EduKit-IV开发平台,掌握其硬件连接和使用方法,初步熟悉MDK;2、掌握有关矩阵LED的原理,以及对常用矩阵LED控制方法;4、通过实验掌握基于S3C2410X MDK程序设计;5、通过实验掌握对处理器S3C2410X中GPIO模块电路的控制方法;2实验设备1 硬件:Embest EduKit-IV平台,ULINK2仿真器套件,PC机;2 软件:μVision IDE for ARM集成开发环境,Windows 98/2000/NT/XP。
3实验内容1、观察演示程序,了解在MDK环境下开发的例程:(1)设置超级终端;运行PC机上Windows XP系统自带的超级终端软件,“开始 -> 所有程序 -> 附件 -> 通讯 -> 超级终端”,设置每秒位数115200、数据位8、奇偶校验无、停止位1、数据流控制无图4-1 超级终端配置(2)将EduKit-IV实验平台的电源的拨动开关拨向向上端的加电状态,给实验平台上电,1-2秒后将会在EduKit-IV实验平台的LCD屏上显示出DEMO起始界面,同时在超级终端上也可以看到串口打印的启动信息。
(3)根据提示,对固化在存储器上的程序进行演示。
2、熟悉RealView开发环境,参见实验指导书“第三章 RealView MDK开发基础”3、学习实验“5. 2 LED控制实验(179页)”,参照本实验,自己创建一个类似的工程。
通过新建一个简单的工程文件,并编译这个工程文件。
学习ARM 仿真器的使用和开发环境的设置。
ARM开发板的认识实习报告
ARM开发板的认识实习报告1:实习目的通过本次认识实习初步认识ARM开发板,学习如何在虚拟机上加载驱动程序,如何在虚拟机上编译C语言源程序生成可执行程序,并在ARM开发板上执行。
学习应用一些常见的汇编指令。
2:实习地点北区电子电工实验中心 101室3:实习时间2011年7月5号 8:00—17:004:实习任务用ARM开发板完成三个设计任务(源程序已有指导老师事先编好):(1)温度传感器(2)蜂鸣器(3)跑马灯5:实习的具体过程(1)首先完成相关程序的安装,接着是熟悉程序的操作界面,了解程序的相关功能,为后续工作做准备。
(2)当天上午,按照实验指导书的要求,在指导老师的帮助下,完成了第一个任务——用ARM开发板设计出的温度传感器。
实验的具体过程为:加载驱动程序,在虚拟机上编译C源程序,生成可执行程序,将可执行程序拷贝到U盘中,将U盘挂载到ARM开发板上,在ARM终端输入指令生成目录,将U盘中的可执行程序拷贝到生成的目录中,输入指令运行程序,将传感器按照正确的接法接到ARM板上。
用温度传感器测量了实验室的室内温度和人手的温度,温度符合实际,说明程序运行正确。
(3)当天下午,我们完成了用ARM开发板设计蜂鸣器和跑马灯的工作,温度传感器的设计使我们有了一些经验,因此下午的设计工作中我们遇到的问题较少,任务完成的较顺利。
具体的实验过程和温度传感器的实验过程相似。
6:实习收获和体会此次实习主要是学生自己动手操作,老师帮助解答操作过程中遇到的问题。
实验中用到的ARM开发板是我们以前从没接触过的,然而,短时间的认识后就要应用它,所以这次实习不仅极大的锻炼了我们的动手能力,还锻炼了我们学习新知识、应用新知识的能力。
注重细节,安全第一,端正态度,耐心坚持是我在这次实习中学到的。
一个细微的环节出错,就会影响整个实验的结果,严重时甚至会烧坏板子,因此,时刻注重细节,做事认真,不仅是我们应该持有的态度,更是我们的一种责任。
arm9开发板实验报告1
轻工业学院实训报告实训名称:项目一:编写从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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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}。