利用地心吸力加上体重实验箱所带小键盘,加上一个开关作为功能选项键,实现A-H八个大写母,以 及 a-h 八个小写

您现在的位置: >> 嵌入式系统实验报告 >> 嵌入式实验报告一
嵌入式实验报告一
来源: 时间:
【嵌入式实验报告一】嵌入式实验报告专 业电子信息工程 班 级学 号姓 名:2014年5月 实验一、LED控制实验一、实验目的1、通过实验掌握LED 的显示控制方法; 2、通过实验加深对数码管动态显示工作原理的掌握。二、实验内容编写程序使实验板上八数码管显示任意四位0到9的字符。三、实验原理1) 八段数码管 嵌入式系统中, 经常使用八段数码管来显示数字或符号,由于它具有显示清 晰、亮度高、使用电压低、寿命长的特点,因此使用非常广泛。? 结构 八段数码管由八个发光二极管组成,其中七个长条形的发光管排列成“日” 字形, 右下角一个点形的发光管作为显示小数点用,八段数码管能显示所有数字 及部份英文字母。见图1。图1 ? 工作原理 以共阳极八段数码管为例, 当控制某段发光二极管的信号为低电平时,对应 的发光二极管点亮,当需要显示某字符时,就将该字符对应的所有二极管点亮; 共阴极二极管则相反,控制信号为高电平时点亮。2) 电路原理 本实验电路中使用的是共阴极八段数码管。数码管的显示由芯片74ls40进行 驱动,它的DIG1~DIG8 引脚输出LED显示所需的位驱动信号,而SEGA~SEGG 及DP 引脚输出LED 显示所需的段驱动信号。图2 八段数码管连接电路 四、实验步骤使用USB下载线连接实验平台主板上的Jtag口和PC机的USB口,并用USB连接 线连接实验平台主板上的USB口和主机的另一个USB口(作为电源连接)使用杜邦 线连接实验主板的扩展口和数码管多孔板。1).建立项目文件夹 E:/work/sy1 并编译设计文件。2).建立 Verilog HDL 文件工程。3).编译成功后进行仿真测试。4).引脚锁定。5).全程编译。6).下载测试。五、实验过程及结果LCD 仿真之前: 仿真:
实验二、矩阵屏显示实验一、实验目的1. 实现CPLD 对LCM 的控制; 2. 了解LCM 的工作时序和LCM 控制器相关指令。二、实验内容1. 实现CPLD对LCM 的控制,使LCM 能够正常工作; 2. 显示字符:CPLD testing now!(也可自定设定)。三、实验要求1. 对静态显示字符的位置进行调整,分别实现左对齐和居中对齐。四、实验原理1. 实验平台介绍 该实验的平台为:实验母板和LCM 模块。LCM 是指液晶显示驱动模块,它由三部分组成,包括LCD 控制器、LCD 驱动 器和LCD 显示装置。其中,LCD 控制器用于与MAX II 芯片进行沟通,LCD 驱动 器负责点亮LCD 显示装置。目前的LCM 模块一般将LCD 控制器、LCD 驱动器集成 到一块IC 芯片上。本实验通过编程,由母板提供时钟及其它必要的控制信号及 数据信号,实现与LCD 控制器的沟通。2. LCD 控制器、驱动器集成芯片介绍 虽然不同厂家的LCM 上的此类IC 芯片各不相同, 但是其基本原理是一致的。在此以HD44780 为例,对此类集成IC进行介绍。(1) 硬件工作原理 图1 为HD44780 的内部示意图。各部分功能如下:图1、HD44780 内部示意图 (2) DDRAM 数据显示用的RAM(Data Display RAM) 这块存储器是用来存放我们要LCM 显示的资料, 只要将标准的ASCII 码放入 DDRAM 中,内部线路会自动以该ASCII 码为地址,对照表8.1,将相应的数据送 到显示器上。DDRAM 有80bytes 空间,共可显示80 个字。其记忆体地址与实际 显示位置的排列顺序与LCM 型号有关。如图2(A)为16 字*1 行的LCM,它的地 址从00H 到0FH;(B)为20 字*2 行的LCM,第一行地址从40H 到53H;(C)为 20 字*4 行的LCM,其地址的排列如图所示。图2、地址与显示位置对应图 i. CGROM 字符产生器的ROM(Character Generator ROM) 这一块储存器存储了192 个5*7 的点矩阵字型, CGROM 的字型仅能读出不能 写入。字型或字符排列方式也ASCII码相同。如字符码41H 为A 字符。字符与字 符码对照表如表1。ii. CGRAM 字符、字型产生器的RAM(Character Generator RAM) 这一块贮存体是供使用储存自行制造特殊造型的造型码的RAM,CGRAM 共有 512bits(64*8bits)。一个5*7 点矩阵字符型需8*8bits,所以CGRAM 最多可存8 个造型。iii. IR-指令寄存器(Instruction Register) IR 寄存器负责存储Cyclone II 要写给LCM 的指令码。当Cyclone II 要下 一个命令到IR 寄存器时,必须要控制LCM 的RS、R/W 及E 这三个引脚。当RS 及 R/W 引脚信号为0, E 引脚信号由1 变为0 时,就会把在DB0-DB7引脚上的数据存 入IR 寄存器。字符与字符码对照表如下: iv. DR-数据寄存器(Data Register) 当RS及R/W 引脚信号为1, E 引脚信号由1 变为0 时,LCM 会将DR 寄存器内 的资料由DB0-DB7 输出以供MAX II 读取; 当RS 引脚信号为1, R/W 引脚信号为0, E 引脚信号由1 变为0 时就会把在DB0-DB7 引脚上的数据存入DR 寄存器。v. BF-忙碌信号(Busy Flag) BF 的功能为告诉Cyclone II,LCM 内部是否正忙着处理资料,当BF=1 时, 表示LCM 内部正在处理资料,不能接受Cyclone II 送来的指令或数据。LCM 设 置BF 的原因为外部处理器(Cyclone II)处理一个指令的时间很短,只需几微 秒,而LCM 得花40us~1.64ms 的时间,所以处理器要写数据或指令到LCM 之前, 必须先查看BF 是否为0。vi. AC-地址计数器(Address Counter) AC 的工作是负责计数写到CGRAM 或DDRAM 的数据地址,DDRAM 的CGRAM 读 出数据的地址。(3) 控制器指令介绍 五、 实验方案及实现在LCD 上显示静态字符串程序流程图如下,进行静态字符的对齐设置在Set address 这一步骤中进行,即设置LCM 起始字符的显示位置。六、 实验步骤本实验是在开发系统母板及LCM 模块联合平台上进行,管脚分配关系见PDF 文档。实验步骤如下1.建立项目文件夹 E:/work/sy2 并编译设计文件。2.建立 Verilog HDL 文件工程。3.编译成功后进行仿真测试。4.引脚锁定。5.全程编译。6.下载测试。七、实验结果 实验三一、实验目的触摸屏控制实验1、通过实验掌握ADC0809的工作原理、流程及其操作控制; 2、通过实验加深对ADC0809工作时序的掌握。二、实验设备1、硬件:CPLD实验开发平台,USB下载线,ADC0809模块接口电路(自制), PC 机; 2、软件:Quartus_II开发环境,Windows 98/2000/NT/XP。三、实验内容设计分压电路,利用基于 CPLD 控制的 ADC 模块(ADC0809),把分压值转 换为数字信号,并通过 LED 发光二极管观察转换结果。四、实验原理1) A/D 转换的一般步骤图 1 模拟量到数字量的转换过程 模拟信号进行 A/D 转换的时候,从启动转换到转换结束输出数字量,需要 一定的转换时间,在这个转换时间内,模拟信号要基本保持不变。否则转换精度 没有保证,特别当输入信号频率较高时,会造成很大的转换误差。要防止这中误 差的产生,必须在 A/D 转换开始时将输入信号的电平保持住,而在 A/D 转换结 束后,又能跟踪输入信号的变化。因此,一般的 A/D 转换过程是通过取样、保 持、量化和编码这四个步骤完成的。一般取样和保持主要由采样保持器来完成, 而量化编码就由 A/D 转换器完成。本实验采用 ADC0809 做 A/D 转换实验。ADC0809 是一种 8 路模拟输入、8 位数字输出的逐次逼近法 A/D 器件,转换时间约 100us, 转换精度为±1/512,适用于多路数据采集系统。ADC0809 片内有三态输出的数 据锁存器,故可以与 CPLD 直接接口。 五、ADC 转换控制流程框图:六、实验步骤1.建立项目文件夹 E:/work/sy3 并编译设计文件。2.建立 Verilog HDL 文件工程。3.编译成功后进行仿真测试。4.引脚锁定。5.全程编译。6.下载测试。7. 调节电位器改变模拟量输入的值,在数码管最后二位应显示转换好的相 应的数字量。其模拟量与数字量对应关系的典型值为0 - 00H 80H +5V-FFH + 2.5V -七、实验结果 实验四、实时时钟实验一、实验目的1、了解基于CPLD的数字电子时钟实现原理及设计方法。2、掌握Quartus_II 环境下的模块程序设计方法。二、实验仪器1、硬件:CPLD实验开发平台,USB下载线,PC 机; 2、软件:Quartus_II开发环境,Windows 98/2000/NT/XP。三、实验原理1) 数字电子时钟的基本结构 数字电子时钟是由分频器、计数器、译码器和显示器电路所组成的。晶体 振荡器产生的时标信号经过分频器形成秒信号,秒信号输入计数器进行计数, 并把累计结果以“时” 、 “分” “秒”的数字显示出来。数字钟的逻辑图如下:时 十位显示 个位显示 十位显示 分 个位显示 十位显示 个位显示译码器译码器译码器译码器译码器秒译码器计数器计数器计数器计数器计数器计数器分频与整形电路50MHz 时钟脉冲输入2)计数电路 数字钟的读数电路是用两个六十进制和一个二十四进制(或十二进制)计 数器实现的。六十进制计数器应由一个十进制计数器与一个六进制计数器组成, 分别对秒(或分)的个位和十位进行计数。本实验用二十四进制计数器作为“时”位计数器,它的计数序列是 00,01, 02?,23,00,?,也就是当计数器计到 23 时 59 分 59 秒时,若再输入一个秒 脉冲,计数器就进到 00 时 00 分 00 秒。数字钟计数电路的设计可用反馈归零法。当计数器正常读数时,反馈门不 起作用,只有当进位脉冲到来时,反馈信号随即将计数电路清零,实现相应模的 循环计数。以六十进制为例,当计数器从 00,01,02,?,59 计数时,反馈门不起 作用,只有当第 60 个脉冲到来时,反馈信号随即将计数电路清零,实现模为 60 的循环计数。 四、实验内容与步骤实验内容 1:正常的时、分、秒计时功能,均由 LCD1602 显示 24 进制小时、 60 进制分钟、60 进制秒钟的计数值显示。实验内容 2:按键实现“校时”“校分”功能; 方案:利用实验开发板上的 LCD1602 液晶模块显示,系统时钟选择板上的 50MHz 晶振。整个系统可以是若干文件组成,采用层次化设计方法,也可以是一 个文件用多过程块方式实现。五、实验步骤 实验:通过此次四个实验,我熟练了Quartus软件的使用。在实验过 程中,通过老师的讲解和同学的合作,我们完成了四次实验。收益颇 多!
【嵌入式实验报告一】重 庆 大 学 学 生 实 验 报 告实验课程名称 开课实验室 学 专 院 业 学 2014 嵌 入 式 系 统 创 新 实 验 室 光电工程学院 年级 研 2012 级仪器仪表工程领域 号 至
学年第 1 学期学 生 姓 名 开 课 时 间总 成 绩 签名 开课学院、实验室:光电学院创新实验室课程 名称 指导 教师 嵌入式系统实验 实验项目 名 成 称 绩实验时间:2014年 4 月 23 日Ti LM3S9B96验证实验项目类型演示 综合 设计 其他开发试验 √一、实验目的1、了解微控制器LM3S9B96的性能。2、掌握 LM3S9B96IO 口输入输出编程方法。二、实验原理LM3S9B96 是 TI 的基于 ARM Cortex-M3 的 32 位 MCU,具有先前 8 位和 16 位 MCU 的价格成本,CPU 工作频率 80MHz,100DMIPS 性能,ARM Cortex SysTick 定时器, 片内具有高达 50MHz 的 256KB 单周期闪存和 96KB 单周期 SRAM,内部 ROM 加载了 StellarisWare 软件,具有扩展的外设接口和串行接口。1、 验证性实验 把存在外部 RAM 里的图像解压缩并显示在 320x240 的屏幕上,并且实现“拖动”的效 果。验证性实验程序主要分为三个部分图像读取, 图像解码, 图像显示。工程文件的 main() 函数所在文件为 showjpeg.c,主要函数的调用与功能如下表所示。2、设计性实验 下图为LM3S9B96与LED1灯和SW1按键的连接原理图,设计C程序,实现LM3S9B96处理器的 PF3口控制评估板上的LED1灯(即为“附1.1 LM3S9B96评估板外观”中“User LED”)的亮 灭,并用SW1按键(附1.1评估板上标有“UserSwitch”的按键)实现两种闪烁模式的切换, 两种模式的区别是LED灯闪烁的频率不同, 并用示波器观察PF3输出的波形, 记录波形的频率。1 LM3S9B96用户手册为“Datasheet-LM3S9B96-中文版.pdf”,寄存器设置参考该手册, 设计程序用到以下寄存器(1)运行模式时钟门控控制寄存器; (2)GPIO方向寄存器; (3)GPIO数字使能寄存器; (4)GPIODATA数据寄存器; (5)上拉电阻选择寄存器; (6)驱动选择寄存器。其中IO口为输入需要设置(1)、(2)、(3)、(5)、(6)这5个寄存器;IO口为输出需 要设置(1)、(2)、(3)、(4)这4个寄存器,设置PF3输出为“1”的方法示例#define SYSCTL_RCGC2_R #define GPIO_PORTF_DIR_R #define GPIO_PORTF_DEN_R #define GPIO_PORTF_DATA_R (*((volatile unsigned long *)0x400FE108)) (*((volatile unsigned long *)0x)) (*((volatile unsigned long *)0x4002551C)) (*((volatile unsigned long *)0x400253FC)) //0x400FE108为运行模式时钟门控控制寄存器地址 //0x为PF口的方向寄存器地址 //0x4002551C为GPIO数字使能寄存器地址 //0x400253FC为GPIODATA数据寄存器地址三、使用器材PC 机,示波器,LM3S9B96 实验评估板,USB A 型公口转Mini B 型5Pin 数据线1 条 (即电脑连接MP3 等设备的数据线),5VDC 电源。四、实验步骤1、验证性实验 (1) 连接实验设备? 跳线冒连接“Power”到ICDI,以使用USB接口供电。? 把USB A型公口转Mini B型5Pin 数据线的Mini B 接口插在J13 处,另一端连接计算 机的USB 接口。2 (2)按照如下步骤打开showjpeg例程,下载程序,运行程序。① 点击“开始-&程序-&IAR Systems-&Embedded Workbench for ARM 5.40-&Embedded Workbench),运行 IAR 软件。②打开 Workspace。③选择 jpeg 工程,并打开。④编译链接工程,选择菜单 Project-&Rebuild All。3 ⑤选择窗口中右上角的“Download and Debug”绿色按钮,下载目标文件。6 选择 Debug-&go 或点击按钮全速运行程序。○7 观察 LM3S9B96 实验评估板上液晶屏,若液晶无显示,则需要按一下下开发板上的 ○ “RESET”复位键,液晶上便会出现图像,可用手指拖动移动图像。4 五、实验过程原始记录(数据、图表、计算等)1、下面为设计性实验的主要程序部分。void main() { SYSCTL_RCGC2_R=0x; GPIO_PORTF_DIR_R =0x08; GPIO_PORTF_DEN_R =0x08; GPIO_PORTJ_DEN_R =0x80; While(1) { if(GPIO_PORTJ_DATA_R==0x00) //读取按键的值 flag++; if((flag%2)==0) { GPIO_PORTF_DATA_R|=0x08; for(i=0;i&40000;i++); GPIO_PORTF_DATA_R=0x00; for(i=0;i&40000;i++); } else { GPIO_PORTF_DATA_R|=0x08; for(i=0;i&400000;i++); for(i=0;i&400000;i++); GPIO_PORTF_DATA_R=0x00; for(i=0;i&400000;i++); for(i=0;i&400000;i++); } } } //灭 LED 灯 //点亮 LED 灯 //灭 LED 灯 //点亮 LED 灯 //设置 PF3 为输出5 六、实验结果及分析1、验证性实验LM3S9B96 实验评估板的液晶屏上出现一副图像,可用手指拖动移动图像。2、设计性实验程序全速运行后,LED 灯以一定的频率缓慢地闪动;按下按键 SW1 后,LED 灯又以另外 一种频率快速地闪。若再按一次 SW1,则 LED 灯又按照第一种频率闪,如此循环。并用示波器观察 PF3 输出的波形如下图所示。七、思考题回答LM3S9B96 和 51 单片机相比,IO 口输入输出编程有何区别? 答:同 51 单片机相比,LM3S9B96 的 IO 口输入输出编程多了对时钟门控控制寄存器、IO 的 方向寄存器、数字使能寄存器、上拉电阻使能寄存器和驱动选择寄存器等的编程,而 51 单 片机仅仅只需对一个类似数据寄存器的 P#寄存器直接赋值和读取即可。6 教师签名年 月 日开课学院、实验室:光电学院创新实验室课程 名称 指导 教师 嵌入式系统实验 实验项目 名 成 称 绩实验时间:2014年 4 月 30 日Android 应用程序验证实验项目类型演示 综合 设计 其他开发实验 √7 一、实验目的1、 了解Eclipse软件的使用。2、掌握简单的安卓应用编写步骤,熟悉 android 软件开发流程。二、实验原理Android 是Google开发的基于Linux平台的、开源的、智能手机操作系统。Android包括操 作系统、中间件和应用程序,由于源代码开放,Android可以被移植到不同的硬件平台上。Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。通过使用Android Eclipse 插件, 可以在Eclipse 环境中构建Android 应用程序。1、验证性实验 通过Eclipse编写android程序,实现一个计算器功能。2、设计性实验 创建一个工程,设计一个显示基本信息的应用程序。要求:创建一个Activity,设置一个以自己名字命名的按键,点击按键后,跳转到另一 个界面,界面显示自己的基本信息。三、使用器材android 开发平台-------Eclipse 软件,一台 android 手机。四、实验步骤1、验证性实验 以下介绍如何使用Eclipse创建一个应用程序,实现计算器功能。(1) 创建工件夹:在E盘下创建名为workspace的文件夹,在此文件夹下创建名为 activity01的文件夹。(2) 打开Eclipse开发工具并创建工程:选择File―New―android application project。在Application Name,Project Name中填写Activity_01(注意首字母最好大写), 点击Next。8 (3)去掉Create Project in Workspace前面的勾选,选择之前创建的文件夹,点击Next。(4) 此处为更改应用软件图标操作,不做修改,点击Next。(5) 此处为更改应用软件主题操作,不做修改,点击Next。9 (6) 设置工程名称,如图进行修改后,点击Finish。10 (7) 点击最左侧窗口中的“Restore”按钮,打开src中的Activity01,可以看到如图所示 窗口。若已经看到左侧的浏览窗口,此步骤忽略。(8) 右键com.example.activity_01,选择New―Class,在Name中输入ResultActivity,点击 finish。11 (9) 双击打开ResultActivity.java,在public class ResultActivity语后面输入 extends Activity。(10) 将鼠标放在报错的Activity之上,选择第一个Import’Activity’(android.app)。(11) 打开左侧浏览窗口中的res―values―strings.xml,点击窗口下面的strings.xml, 输入 &string name=&resultlabel&&result&/string& &string name=&symbol&&乘以&/string& &string name=&calculate&&计算&/string& &string name=&exit&&退出&/string& &string name=&about&&关于&/string&注:该步骤的目的是编写字符串,做后续的引用。(12) 编辑布局文件:打开res―layout―main.xml,删除下图中选中的语句。12 输入以下代码&EditText android:id=&@+id/factorOne& android:layout_width=&fill_parent& android:layout_height=&wrap_content& android:layout_alignParentTop=&true& /& &TextView android:id=&@+id/symbol& android:layout_width=&fill_parent& android:layout_height=&wrap_content& android:gravity=&center_horizontal& android:layout_below=&@id/factorOne& /& &EditText android:id=&@+id/factorTwo& android:layout_width=&fill_parent& android:layout_height=&wrap_content& android:layout_below=&@id/symbol& /&13 &Button android:id=&@+id/calculate& android:layout_width=&fill_parent& android:layout_height=&wrap_content& android:layout_below=&@id/factorTwo& /& 注释:&EditText 表示一个可以编辑的文本框控件 &TextView表示一个显示文本的控件 &Button表示一个按钮控件 android:id=&@+id/factorOne&表示定义该控件的ID,为后续引用 android:layout_width=&fill_parent&表示该控件的宽度为充满屏幕宽度 android:layout_height=&wrap_content&表示该控件的高度为自动匹配 android:gravity=&center_horizontal&表示该控件显示的内容为水平居中 android:layout_alignParentTop=&true& 表示该控件在父控件的上部 android:layout_below=&@id/factorOne& 表示该控件在factorOne控件的下部(13) 建立第二个布局文件。选择左侧窗口中的res―layout,右键layout―new―file, 在File name中输入result.xml 点击finish。14 (14) 将main.xml中的文本复制到result.xml中后将中间控件部分的代码删除,如下图所 示,如有报错,点击保存便会消失。(15) 在result.xml中添加控件布局。输入以下代码&TextView android:id=&@+id/result& android:layout_width=&fill_parent& android:layout_height=&wrap_content& android:gravity=&center_horizontal& android:textSize=&50sp&/&(16) 对四个控件进行声明:打开activity01.java,输入以下代码privateEditText factorO privateEditText factorT privateTextV privateB 输入之后如果报错,就在上面输入:import android.widget.*(17) 根据控件的ID来取得代表控件的对象:在activity01.java中的public void onCreate内部输入factorOne= (EditText)findViewById(R.id.factorOne); factorTwo= (EditText)findViewById(R.id.factorTwo);15 symbol= (TextView)findViewById(R.id.symbol); calculate= (Button)findViewById(R.id.calculate); 如果报错,打开“main.xml”,保存一下main.xml可以解决。(18)为symbol和calculate设置显示的值,接着上面的位置输入代码symbol.setText(R.string.symbol); calculate.setText(R.string.calculate);(19) 最后几行选中的代码和大括号可以删除,也可不删。对按钮设置监听器,在activity01中输入以下代码:16 Class CalculateListener implements OnClickListener{ } 鼠标放在报错处,点击第一个Import,如下图:鼠标放在另一个报错处CalculateListener点击第一个Add后,得到如下图。(20) 对按钮绑定监听器。在Activity01.java中输入:calculate.setOnClickListener(new CalculateListener());(21) 在Activity01.java中获得两个EditText控件的值,并且将这两个值存放Intent 对象当中,使用Intent对象来启动resultActivity。输入如下代码String factorOneStr = factorOne.getText().toString(); String factorTwoStr = factorTwo.getText().toString(); Intent intent = new Intent();17 intent.putExtra(&one&,factorOneStr); intent.putExtra(&two&,factorTwoStr); intent.setClass(Activity01.this, ResultActivity.class);Activity01.this.startActivity(intent); 报错后点击Import‘Intent’(android.content)。(22) 打开ResultActivity.java,在public class下面一行点击鼠标右键选择 source―Override/ImplementMethods。18 在如上窗口中选择onCreate(Bundle),点击OK。(23) 在ResultActivity.java中输入下面两段代码,注意位置。privateTextView resultV setContentView(R.layout.result); resultView = (TextView)findViewById(R.id.result); Intent intent = getIntent(); String factorOneStr = intent.getStringExtra(&one&); String factorTwoStr = intent.getStringExtra(&two&); int factorOneInt = Integer.parseInt(factorOneStr); int factorTwoInt = Integer.parseInt(factorTwoStr); int result = factorOneInt * factorTwoI resultView.setText(result + &&);19 有2处报错,分别在报错处点击弹出窗口中选择Import。(24) 对ResultActivity进行声明。双击打开左侧窗口中的AndroidManifest.xml,然后点击下部最右边的标签AndroidManifest.xml 在&activity之后输入&activity android:name=&.ResultActivity& /&(25) 在Activity01工程上单击右键,选择Run As―1 Android Application20 等待约30s后虚拟机启动完毕,看到如上界面解锁界面,activity01程序便会自动运行,若不运行,找到该程序双击打开即可。看到了我们设计的界面,在两个框中输入相应的数字,点击计算后可以得到结果。21 2、设计性实验 (1)按照步骤(1)―(6)建立一个新的工程。(2)按照步骤(8)(9)(10)新建一个activity,并进行相应的操作。(3)按照步骤(11)进行字符串的添加,为后续引用做准备,这里主要用到“名字,性别, 国籍,籍贯,等信息”。(4)按照步骤(12)的提示进行布局,控件的设置,添加一个Button控件。(5)按照步骤(13)―(15)建立第二个xml文件,并对布局,控件进行设置,主要用到了 五个TextView控件, 在xml文件中控件的布局可以参考下图“姓名”的布局, text1为该控件 的id,id名称可以更改。性别、国籍、学校、籍贯控件可以按照此格式进行设计布局。另外, 从第二个控件开始,需要添加android:layout_below=&@id/text1& 该语句表示该控件在id为text1的控件下方。语句设置控件的位置,(6)按照步骤(16)对button控件进行声明。注意button控件声明语句中的calculate应修 改为Button的控件的id。(7)按照步骤(17)使button控件能够显示。注意语句中两处的calculate应修改为Button的控件的id。(8)按照步骤(18)对button控件显示的内容为“王大锤”。注意语句calculate.setText(R.string.calculate)中第一个calculate应修改为Button的 控件的id, 第二个calculate应修改为设计性实验步骤 (3) 中已经定义的“王大锤”的名称。(9)按照步骤(19)(20)对button控件设置监听器。注意calculate应修改为Button的控 件的id。(10) 按照步骤 (21) 设置intent(跳转)命令。其中中只用到了以下三句(注意Activity01 与ResultActivity的名称要分别与第一个java文件的名称和第二个java文件的名称相同)Intent intent = new Intent(); intent.setClass(Activity01.this, ResultActivity.class); Activity01.this.startActivity(intent); (11)按照步骤(22)(23)对新建的activity进行设置。代码只用到(注意other为第二 个布局文件的名称)setContentView(R.layout.other);22 (12)按照步骤(24)对新建的activity进行声明。注意ResultActivity要与第二个java 文件名称相同。(13)按照后续步骤进行验证。(14)设计程序运行结果示例:五、实验过程原始记录(数据、图表、计算等)Function Main public static class PlaceholderFragment extends Fragment { private Button M public PlaceholderFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {23 View rootView = inflater.inflate(R.layout.fragment_main, container, false); Mybutton = (Button) rootView.findViewById(R.id.Mybutton); Mybutton.setText(R.string.mybutton); Mybutton.setOnClickListener(new MybuttonListener()); return rootV } class MybuttonListener implements OnClickListener { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setClass(getActivity(), ResultActivity.class); startActivity(intent); // TODO Auto-generated method stub } } } Fileresult.xml&RelativeLayout xmlns:android=&http://schemas.android.com/apk/res/android& xmlns:tools=&http://schemas.android.com/tools& android:layout_width=&match_parent& android:layout_height=&match_parent& android:paddingBottom=&@dimen/activity_vertical_margin& android:paddingLeft=&@dimen/activity_horizontal_margin& android:paddingRight=&@dimen/activity_horizontal_margin& android:paddingTop=&@dimen/activity_vertical_margin& tools:context=&.MainActivity& & &TextView android:id=&@+id/name& android:layout_width=&fill_parent& android:layout_height=&wrap_content& android:gravity=&center_horizontal& android:textSize=&30sp& android:text=&@string/name& /& &TextView android:id=&@+id/gender& android:layout_width=&fill_parent&24 android:layout_height=&wrap_content& android:gravity=&center_horizontal& android:textSize=&30sp& android:text=&@string/gender& android:layout_below=&@id/name& /& &TextView android:id=&@+id/country& android:layout_width=&fill_parent& android:layout_height=&wrap_content& android:gravity=&center_horizontal& android:textSize=&30sp& android:text=&@string/country& android:layout_below=&@id/gender& /& &TextView android:id=&@+id/nativeplace& android:layout_width=&fill_parent& android:layout_height=&wrap_content& android:gravity=&center_horizontal& android:textSize=&30sp& android:text=&@string/nativeplace& android:layout_below=&@id/country& /& &TextView android:id=&@+id/school& android:layout_width=&fill_parent& android:layout_height=&wrap_content& android:gravity=&center_horizontal& android:textSize=&30sp& android:text=&@string/school& android:layout_below=&@id/nativeplace& /& &/RelativeLayout&25 六、实验结果及分析1、验证性实验:手动输入 3 和 15,得到结果 15。2、设计性实验:如图,正常显示。七、思考题回答1、 验证性实验中的布局文件和字符串资源文件分别是哪个文件?设置按钮的单击事件监听 器是哪些语句? 答:1, 布局文件为 Res\Layout 目录下的 Xml 文件,字符串资源文件为 res\values\目录下 string.xml 文件。2, Mybutton.setOnClickListener(new MybuttonListener()); class MybuttonListener implements OnClickListener { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setClass(getActivity(), ResultActivity.class); startActivity(intent); // TODO Auto-generated method stub } }教师签名 年 月 日26
【嵌入式实验报告一】中国地质大学(北京)实验报告课程名称实验名称姓 学 班 名号级:嵌入式系统 嵌入式 Linux Socket 编程 杨森
曾卫华指导教师评 分:实验时间:二零一三年 四月 实验题目:嵌入式 Linux Socket编程一、 实验目的通过实验熟悉Linux环境,掌握Linux串口和网络应用程序开发。并且学会串口的设置,串口数 据收发处理,阻塞型I/O和非阻塞型I/O,SOCKET套接字,多线程编程基础,Server和Client 端程序设计,对嵌入式系统有进一步的了解。二、 实验内容和步骤1.4.4.3交叉编译工具的PATH已经生效,在任意目录下能够执行arm-linux-gcc Cv; 2.nfs网络文件系统的配置:1 ○打开nfs1175.exe; 2 ○配置板子ip,使其和电脑ip在同一个网段(使用命令ifconfig eth0 115.25.74.176 netmask255.255.255.0);3 ○挂载:在板子上运行 #mount -t nfs -o nolock 115.25.74.175:/d/share_vm 4 ○使用 cd /mnt/nfs 进入nfs共享目录,ls 显示共享目录下的文件;/mnt/nfs3.仔细阅读提供的代码server.c和client.c Target为服务器,Ubuntu为客户端; 4.交叉编译server.c、本地编译client.c(因为用到多线程编程,在编译语句后面加上 -lpthread); 5.在板子上运行server可执行文件:#cd /mnt/nfs#ls -l server 看看前面的字串里面有没有“x”,如没有则表明没有可执行的权限,需要用命令加入server的执行权限:#chmod 777 server,运行server代码 #./server; 6.在ubuntu上运行client程序:#./client 115.25.74.176; 7.观察服务器端和客户端的提示信息。三、 程序流程框图和源码1. 流式套接字工作过程,如图1所示-2- 图1 流式套接字工作过程2.工作过程 Read() 串口 Write()ARM Targetsend() 以太网 Recv()1 ○用户从串口输入信息,将串口信息转发至以太网,在ubuntu上编写client端程序,将收到的网络数据打印出来;2 ○用户从ubuntu中client端输入信息,client将位信息发送至以太网,嵌入式linux收到以太网信息从串口输出该信息。3.源码 更改过的源码见附录。四、 实验结果1.挂载成功后串口显示,如图2所示-3- 图2 挂载截图 2.编译之后得到的目标代码,如图3所示图3 目标代码编译成功3.客户端与服务器连接,如图4,图5,图6所示图4 等待连接中图5 ubuntu中显示连接成功-4- 图6 串口中显示连接成功4.结果验证,如图7所示 在串口中输入姓名(yangsen)和(),在ubuntu中显示相应的结果; 在ubuntu中输入姓名(yangsen)和班级(),在串口中显示相应的结果。图7 验证通讯结果五、 实验本学期的所有实验均在宿主 PC 机与 AT91RM9200 目标板上进行。在实验中,我们先建立硬件 实验平台,又建立主机软件开发环境,接着为实验进行各项配置,最后完成了各个实验中的多 种功能。很重要的一点,前期的硬件、软件准备必须完整无误地实现,这是后续的实验能顺利 进行的前提。本实验中,虽然已经给出了串口程序和 socket 编程的程序,但是需要我们来修改 和完善代码,在原代码的基础上实现新的功能。对于整个学期的学习,我总结了一个学习嵌入式学习的要点,就是动手实践。刚开始接触嵌入 式 linux 的时候,感觉非常的麻烦,一直思考为什么既然有了 windows,linux 为什么还有存在 的必要。经过一段时间的学习和了解,我终于了解了开源的重要性以及 linux 操作系统在科研 领域的无可撼动的地位。经过多次的失败之后,我已经熟练的掌握了 linux 的入门知识,逐步 完成了建立实验软件开发平台,搭建实验编译软件环境,在 PC 上编辑、编译一个应用程序, 并且在嵌入式系统上运行和调试它的过程,课堂的 7 个实验都成功地完成。这其中,课外 学习和向高手请教是必不可少的。通过这学期的实验,我整个实验让我了解了一套完整的嵌入式系统简单的开发的全过程,也让-5- 我对嵌入式 linux 有了一定的了解。我相信,这对于以后我对嵌入式的继续深入学习有非常大 的帮助! 最后,感谢曾老师的辛勤指导!附录:1.server.c #include &stdio.h& #include &stdlib.h& #include &string.h& #include &sys/ioctl.h& #include &fcntl.h& #include &unistd.h& #include &termios.h& #include &stdlib.h& #include &errno.h& #include &time.h& #include &sys/time.h& #include &linux/rtc.h& #include &stdio.h& #include &sys/types.h& #include &sys/socket.h& #include &unistd.h& #include &netinet/in.h& #include &arpa/inet.h& #include &pthread.h&#define SERVER_PORT 20000 //define the defualt connect port id #define LENGTH_OF_LISTEN_QUEUE 10 //length of listen queue in server #define BUFFER_SIZE 256 #define WELCOME_MESSAGE &welcome to connect the server.& #define COM0 0 #define BLOCK_MODE 1 #define NONBLK_MODE 0 static struct termios g_newtio,g_ static int speed_arr[] = { B115200, B57600, B38400, B19200, B9600, B4800, B2400, B1200, B300, B115200, B57600, B38400, B19200, B9600, B4800, B2400, B1200, B300,-6- }; static int name_arr[] = { 600, 3, 600, 3, };, , 300, , , 300,int Init_COM(int Comm,int Baudrate,int Parity,int Stopbit,int Flagblock) { int ret,i; char dev_buf[16]; if(Comm & 3) { printf(&Com%d not exist\n&,Comm); return -1; } memset(dev_buf,0x00,sizeof(dev_buf)); sprintf(dev_buf,&/dev/ttyS%d&,Comm); if(Flagblock) { ret = open(dev_buf, O_RDWR | O_NOCTTY ); // 以默认阻塞方式打开; } else { ret = open(dev_buf, O_RDWR | O_NOCTTY | O_NONBLOCK); //以非阻塞方式打开; } if(ret & 0) { printf(&Open ttyS%d failed\n&,Comm); return -1; } if( tcgetattr(ret, &g_oldtio) & 0 ) { printf(&Get Com Parameter Error.\n&); return -1; } for ( i= 0; i & sizeof(speed_arr) / sizeof(int); i++) { if(Baudrate == name_arr[i])-7- { cfsetispeed(&g_newtio,speed_arr[i]); cfsetospeed(&g_newtio,speed_arr[i]); } } if(i&=sizeof(speed_arr) / sizeof(int)) { printf(&Unsupported Speed!\n&); return -1; } switch (Parity) { // 设置奇偶校验位数 case 'n'case 'N'g_newtio.c_cflag &= ~PARODD; // zwh g_newtio.c_cflag &= ~PARENB; /* Clear parity enable */ case 'o'case 'O'g_newtio.c_cflag |= PARENB; /* Enable parity */ g_newtio.c_cflag |= PARODD; /* 设置为奇效验*/ case 'e'case 'E'g_newtio.c_cflag |= PARENB; /* Enable parity */ g_newtio.c_cflag &= ~PARODD; /* 转换为偶效验*/ defaultprintf(&Unsupported Parity\n&); return -1; } /*stop bit */ switch(Stopbit) { case 1g_newtio.c_cflag &= ~CSTOPB; case 2g_newtio.c_cflag |= CSTOPB; default:-8- printf(&Unsupported Stopbit!\n&); return -1; } g_newtio.c_iflag = 0; g_newtio.c_oflag = 0; g_newtio.c_lflag = 0; g_newtio.c_cc[VTIME] = 1; g_newtio.c_cc[VMIN] = 1; //输入无校验 //输出不处理 //RAW模式 /* unit1/10 second. */ /* minimal characters for reading */g_newtio.c_iflag &= ~INPCK; /* Disable parity checking */ g_newtio.c_cflag &= ~CRTSCTS; //NO flow control g_newtio.c_cflag &= ~CSIZE; g_newtio.c_cflag |= CS8; //databit=8 g_newtio.c_cflag |= CLOCAL; //本地连接 g_newtio.c_cflag |= CREAD; //允许接收数据 if( tcsetattr(ret, TCSANOW, &g_newtio) != 0 ) { printf(&Set Com Parameter Error!\n&); return -1; } tcflush (ret, TCIOFLUSH); //清空输入输出队列 } /*success*/void RestoreComConfiguration(int fd,struct termios *ptios) { if( tcsetattr(fd, TCSANOW, ptios) != 0 ) /*success*/ { printf(&Restore Com Parameter Error!\n&); } } void pthread1(void *arg); void pthread2(void *arg); int main(int argc, char** argv) { pthread_t id1,id2; fd = Init_COM(COM0,115200,'N',1,BLOCK_MODE); if(fd &= 0)-9- { write(fd,&Hello...\n&,9); usleep(5000); RestoreComConfiguration(fd,&g_oldtio); } int servfd, struct sockaddr_in servaddr, if((servfd = socket(AF_INET,SOCK_STREAM, 0 )) & 0) { printf(&create socket error!\n&); exit(1); } bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(SERVER_PORT); servaddr.sin_addr.s_addr = htons(INADDR_ANY); if(bind(servfd,(struct sockaddr *) &servaddr, sizeof(servaddr)) & 0) { printf( &bind to port %d failure!\n& ,SERVER_PORT); exit(1); } if(listen(servfd,LENGTH_OF_LISTEN_QUEUE) & 0) { printf( &call listen failure!\n& ); exit(1); } while(1) { char buf[BUFFER_SIZE]; socklen_t length = sizeof(cliaddr); printf(&wait for connect...\n&); clifd = accept(servfd,( struct sockaddr *) &cliaddr, &length); if (clifd & 0) { printf( & error comes when call accept!\n & ); exit(1);// } strcpy(buf,WELCOME_MESSAGE); printf(&from client IP:%s,Port:%d\n& ,inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port));- 10 - timestamp = time(NULL); strcat(buf, &\ntimestamp in server:& ); strcat(buf,ctime(&timestamp)); send(clifd,buf,BUFFER_SIZE, 0); ret=pthread_create(&id1,NULL,(void *)pthread1, &clifd); if(ret!=0) perror(&pthread cread1&); ret=pthread_create(&id2,NULL,(void *)pthread2, &clifd); if(ret!=0) perror(&pthread cread2&); pthread_join(id1,NULL); pthread_join(id2,NULL); } close(servfd); return 0; } void pthread1(void *arg1) { int clifd=*(int *)arg1; char buf[BUFFER_SIZE]; printf(&pthread1 is wroking\n&); while( 1 ) { length = recv(clifd, buf,BUFFER_SIZE, 0); if(length & 0) { printf(&error comes when recieve data from server !&); exit(1); } write(fd,&\nclient:&,8); write(fd,buf,length); tcflush(fd,TCIFLUSH); write(fd,&\n&,1); //close(clifd); } // exit close(fd);- 11 - } void pthread2(void *arg2) { int clifd=*(int *)arg2; char buf[8]; printf(&pthread2 is wroking\n&); while(1) { length=read(fd,buf,8); send(clifd,buf,length, 0); tcflush(fd,TCIFLUSH); } close(fd); }2.client源码#include #include #include #include #include #include #include #include &stdio.h& &sys/socket.h& &unistd.h& &sys/types.h& &netinet/in.h& &stdlib.h& &strings.h& &pthread.h&#define SERVER_PORT 20000 // define the defualt connect port id #define CLIENT_PORT ((20001+rand())%65536) // define the defualt client port as a random port #define BUFFER_SIZE 256 void usage(char* name) { printf( &usage%s IpAddr\n & ,name); } void pthread1(void *arg);// void pthread2(void *arg);// int main(int argc, char** argv) { pthread_t id1,id2; //// int servfd,clifd,length = 0; char data[8];// struct sockaddr_in servaddr, socklen_t socklen = sizeof (servaddr); char buf[BUFFER_SIZE]; if(argc & 2 ) { usage(argv[0]); exit( 1 ); }- 12 - if((clifd = socket(AF_INET,SOCK_STREAM,0)) & { printf( & create socket error!\n & ); exit( 1 ); }0 ) //tcpsrand(time(NULL)); // initialize random generator bzero( & cliaddr, sizeof (cliaddr)); cliaddr.sin_family = AF_INET; cliaddr.sin_port = htons(CLIENT_PORT); cliaddr.sin_addr.s_addr = htons(INADDR_ANY); if(bind(clifd,(struct sockaddr* )&cliaddr,sizeof(cliaddr)) & 0 ) { printf( &bind to port %d failure!\n & ,CLIENT_PORT); exit( 1 ); }//绑定的目的是让其端口是随机的,否则端口是自增1 //一般情况下client端不用绑定bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; inet_aton(argv[1], &servaddr.sin_addr); servaddr.sin_port = htons(SERVER_PORT); if(connect(clifd,( struct sockaddr *)&servaddr, socklen) & 0) { printf( &can't connect to %s!\n&, argv[1]); exit(1); } length = recv(clifd, buf,BUFFER_SIZE, 0); if(length & 0) { printf(&error comes when recieve data from server %s!&, argv[1]); exit(1); } printf(&from server %s:\n%s&, argv[1],buf);ret=pthread_create(&id1,NULL,(void *)pthread1, &clifd); if(ret!=0) perror(&pthread cread1&);- 13 - ret=pthread_create(&id2,NULL,(void *)pthread2,&clifd); if(ret!=0) perror(&pthread cread2&); pthread_join(id1,NULL); pthread_join(id2,NULL);while(1) { // printf(&please input a 8-bit data:&); } close(clifd); return 0; } void pthread1(void *arg1) {int clifd=*(int *)arg1; char data[8]; printf(&pthread1 is working\n&); while(1) { scanf(&%s&,data); send(clifd,data,8, 0); } } void pthread2(void *arg2) { char data[8]; int clifd=*(int *)arg2; printf(&pthread2 is working\n&); while(1) { len=recv(clifd,data,8, 0); if(len&=0) { printf(&server %s\n&,data); } } }- 14 -
【嵌入式实验报告一】嵌入式系统技术实验报告 北京航空航天大学电子信息工程学院《嵌入式系统技术》上机实验报告学号课程名称嵌入式系统技术 姓名班级上机内容 :建立 Linux 实验开发平台实验报告这组实验的主要目的是让学生熟悉如何在既有的硬件平台上通过对软件资源的移植和编译建立一套嵌入式开发系统。这组实验主要有以下几个实验组成(一) ARM-Linux 开发工具链的建立一、实验目的了解 ARM-Linux 开发工具链的含义,建立流程,以及初步的使用方法。二、实验内容:在宿主机上建立交叉编译环境。三、实验原理在宿主机上进行工具链的编译,通过进行正确的设置之后能够建立交叉编译环境,为进一步的内核和程序的 编译提供工具。四、实验设备(硬件,软件) 1.硬件DBMX1 ADS 开发板 PC 机(操作系统为 Windows 2000 或更高版本) 直连串口线 3.3V/2A 开关电源 2.软件虚拟机 Vmware 虚拟机上运行的 Red Hat Linux 9.0 ARM-Linux 工具链(或者源代码) 安装脚本 文本编辑器(如 Windows 下的 notepad、ultraedit,Linux 下的 Vi、Emacs 等) 五、实验步骤1.打开电脑,运行虚拟机以及其上的 Linux 操作系统 2.解压缩并安装 arm-linux 交叉编译工具 3.修改配置文件 4.设置 PATH 变量,使得在任何路径下都可以使用 arm-linux-gcc 工具 5.重新启动,使设置生效 六、实验结果在任意一个目录下能够使用 arm-linux-xxx 的命令 能够使用 arm-linux-gcc 编译程序并使用 file 命令进行 查看。(二)Bootloader 的编译一、实验目的1. 通过实验认识启动引导程序的作用、功能和实现机理; 2. 了解系统启动过程中的关键操作; 3. 学习启动引导程序的编程,如何根据硬件的特点来初始化并引导系统; 4. 进一步加深对 Bootstrap 模式下程序编写、 编译和测试整个流程的认识。二、实验内容1. 了解系统硬件初始化的相关要求; 2. 了解加载系统的要求和方法; 3. 了解如何在 Bootstrap 模式下操作特定的硬件例如:UART 串口、Flash 存储器、USB-client 控制器; 4. 编写相应的 Bootloader 程序; 5. 编写相应的编译脚本和链接配置文件; 6. 编译程序,生成启动镜像; 7. 下载程序,选择正确选项将 Bootloader 烧写进 Flash 中; 8. 选择正确的启动模式,检验是否正确烧入 Bootloader。三、实验原理嵌入式系统作为一个复杂的硬件和软件的结合体,其工作的最开始阶段需 要进行对硬件的初始化设置,并 且能够引导系统从而将硬件的控制权交给操作 系统。这一系列的工作需要启动引导程序来完成。嵌入式系统中 的启动引导程 序的作用与 PC 的 BIOS 程序相类似,PC 中完成启动和引导功能的程序便是固化在 BIOS 芯 片中的固件程序。四、实验设备(硬件,软件) 1.硬件DBMX1 ADS 开发板 PC 机(操作系统为 Windows 2000 或更高版本) 直连串口线 3.3V/2A 开关电源 A-to-B 型的 USB 线缆 2.软件虚拟机 Vmware 虚拟机上运行的 Red Hat Linux 9.0 交叉编译工具链 终端软件 Windows 下的 HyperTerminal 或者 Linux 下的 minicom 文本编辑器(如 Windows 下的 notepad、ultraedit,Linux 下的 Vi、Emacs) 五、实验步骤1.编写实现在 Bootstrap 模式下完成硬件初始化和加载系统的引导加载程序,并编写相应的编译命令脚本和 和其他相关文件。2.使用虚拟机上的交叉编译工具链将编写好程序进行编译,生成可以直接在 Bootstrap 模式下运行的 b 格式 程序。3.将 DBMX1 ADS 板上的 BOOT[3:0]设置为 Bootstrap 模式。4.在计算机串口到 DBMX1 ADS 板上串口间连上串口线。5.在 Windows 中运行 HyperTerminal ,并进行正确的设置:波特率为 115200bps,数据位是 8,停止位是 1,无校验位,无数据流控制,并且将换行符添加到传入行的末尾。(若使用 minicom,发送模式选为 ascii,其 余设置参照 2.2) 6.打开 DBMX1 ADS 板上的电源。7.在 HyperTerminal 中输入‘a’或‘A’ ,应当从串口程序中看到返回的‘’ 。这一步是使 ADS 处理器自 动探测并设定波特率。8.传送文本文件 boot_setup.txt,设置 SDRAM 的工作方式。9.传送启动引导加载程序 Bootloader_b.txt。10. 待 Bootloader_b.txt 传输完毕之后此程序将在 SDRAM 中自动运行,将在 HyperTerminal 中看到程序的 提示如下0. Program Bootloader image 1.Program kernel image 2.Program root-disk image 3.Boot kernel 4.Erase KERNEL partition, CAUTION! 5.Erase ROOTDISK partition, CAUTION! Please enter selection -& 11. 输入“0” ,在 SDRAM 中运行的程序将会有提示。12. 将电脑主机与 DBMX1 ADS 开发板用 A-to-B 型的 USB 线缆连接,稍等片刻,Windows 将找到可移 动磁盘,将 boot.bin 复制到此可移动磁盘中。 13. 弹出该可移动磁盘 14. 关闭 DBMX1 ADS 板的电源,将 BOOT[3:0]设置为正常启动模式。15. 打开电源,Bootloader 开始运行,HypterTerminal 中将会出现相关的提示信息。六、实验结果运行在 SDRAM 中的程序将启动镜像正确烧入 Flash 中。正常启动方式下 Bootloader 能够正常启动,能够在 HyperTerminal 中看到相关的提示信息。(三)ARM-Linux 内核的编译和下载一、实验目的1. 了解内核在整个系统中的作用和地位; 2. 了解启动过程中内核的运行方式; 3. 通过实验认识内核的配置方法; 4. 能够根据自己的需要灵活得配置和裁减内核; 5. 掌握将 Linux 内核烧写进嵌入式系统的方法。二、实验内容1. 根据特定嵌入式系统特点编写相应配置文件; 2. 编译内核; 3. 烧写内核。三、实验原理Linux 内核是 Linux 操作系统运行的核心,进程管理、内存管理、硬件设备的接口都是由 Linux 内核来完 成的。然而 Linux 内核本身并不是可以直接使用的,更一般的是以源代码的方式提供的。这就要求学生能够使 用相应的工具根据系统的具体要求来完成对内核源代码的配置和编译,并且生成嵌入式系统能够使用的内核映 像。交叉编译环境已经配置完毕,可以通过简单的方式来进行内核的交叉编译。通过人机交互界面,可以完成对 内核进行配置的工作。如果需要加入特殊的要求,可以直接修改相应的配置文件来配置内核。配置完毕之后, 通过交叉编译就可以得到能够在嵌入式系统上使用的内核。在 Bootloader 的支持下可以完成内核的下载。四、实验设备(硬件,软件) 1.硬件DBMX1 ADS 开发板 PC 机(操作系统为 Windows 2000 或更高版本) 直连串口线 3.3V/2A 开关电源 A-to-B 型的 USB 线缆 2.软件虚拟机 Vmware 虚拟机上运行的 Red Hat Linux 9.0 交叉编译工具链 终端软件 Windows 下的 HyperTerminal 或者 Linux 下的 minicom 文本编辑器(如 Windows 下的 notepad、ultraedit,Linux 下的 Vi、Emacs) 五、实验步骤生成内核映像1. 从网站获得 Linux 源代码或者其他方式 2. 从网站或者其他方式获得针对 CPU 和开发板的补丁包 3.解压 Linux 源代码和对应的补丁包六、实验结果4. 根据自己对开发板进行设置修改相应的配置文件 5. 进入到 Linux 源代码目录:cd ~/linux 6. 清除多余文件:make clean 7. 进入配置菜单:make menuconfig 8. 对内核进行配置 9.生成依赖关系:make dep 10. 编 译 内 核 , 生 成 内 核 映 像 make Image 。内 核 映 像 一 般 被 存 放 在 linux/arch/arm/boot 目录下,文件名为 zImage 或者 bzImage 下载内核映像1. 将 DBMX1 ADS 设置为正常启动模式 2. 使用串口线将 ADS 板与 PC 机相连 3. 打开 Windows 下的 HyperTerminal,设置为 115200bps,8N1,无流控(若使用 minicom,发送模式选为 ascii,其余设置参照 2.2) 4. 打开 DBMX1 ADS 板电源 5. 终端程序提示进入 Boot 选项时按下任意键 6. 选择烧写 kernel,Bootloader 此时提示 USB 驱动准备就绪 7. 用 A-to-B 型的 USB 线将 PC 与 ADS 板相连 8. 待系统识别出可移动磁盘之后,将 zImage 放入该磁盘中,然后弹出 9.当终端提示按下任意键之后开始编程,编程分为擦写检查和擦写、编程、校验三步,成功之后终端提示重 新启动系统。六、实验结果生成内核映像 下载成功(四)根文件系统的制作和下载一、实验目的1. 了解根文件系统(root filesystem)在整个系统中的作用和地位; 2. 了解根文件系统的主要和必要组成部分; 3. 能够根据自己的需要灵活得配置根文件系统; 4. 掌握将根文件烧写进嵌入式系统的方法。二、实验内容1. 生成根文件系统; 2. 烧写根文件系统。三、实验原理根文件系统是 Linux 文件系统中最低层的文件系统,一般在内核被引导和启动之后是必须挂载的。根文件 系统必须提供系统启动的配置文件以及完成一些设备的配置工作。另外根文件系统中应当有一些最基本的应用 程序提供给控制台使用。若是进行应用程序的开发和使用,根文件系统中需要有一些库来供应用程序动态调用。因此,根文件系统提供了应用程序运行所需要的最基本的文件。在 Bootloader 的支持下可以完成根文件系统的 下载。四、实验设备(硬件,软件) 1.硬件DBMX1 ADS 开发板 PC 机(操作系统为 Windows 2000 或更高版本) 直连串口线 3.3V/2A 开关电源 A-to-B 型的 USB 线缆 2.软件虚拟机 Vmware 虚拟机上运行的 Red Hat Linux 9.0 交叉编译工具链 终端软件 Windows 下的 HyperTerminal 或者 Linux 下的 minicom 文本编辑器(如 Windows 下的 notepad、ultraedit,Linux 下的 Vi、Emacs) 五、实验步骤生成根文件系统 1. 准备文件 bdfs_noQT.tgz 或者 bdfs_withQT.tgz 和工具 mkfs.jffs2 2. 解压文件 bdfs_noQT.tgz 或者 bdfs_withQT.tgz 3. 使用工具 mkfs.jffs2 生成 jffs2 文件系统 4. 修改链接配置文件 5. 再次生成 jffs2 文件系统 6.将 DBMX1 ADS 启动,进入 Linux 后执行命令:eraseall /dev/mtdblock/2 完成旧文件系统的擦除,然后重启 DBMX1 ADS 下载内核映像 1. 将 DBMX1 ADS 板上的 BOOT[3:0]设置为 ON-OFF-OFF-ON 2. 使用串口线将 ADS 板与 PC 机相连 3. 打开 Windows 下的 HyperTerminal,设置为 115200bps,8N1,无流控(若使用 minicom,发送模式选为 ascii,其余设置参照 2.2)。4. 打开 ADS 板电源 5. 终端程序提示进入 Boot 选项是按下任意键 6. 选择烧写 root filesystem,Bootloader 此时提示 USB 驱动准备就绪 7. 用 A-to-B 型的 USB 线将 PC 与 ADS 板相连 8. 待系统识别出可移动磁盘之后, bd_noQT.jffs2 放入该磁盘中,将然后弹出,当终端提示按下任意键之后 开始编程 9. 按下任意键,编程分为擦写检查和擦写、编程、校验三步,成功之后终端提示重新启动系统。10. 系统重启引导根文件系统之后,使用命令可以将根文件系统改为可写模式。六、实验结果生成根文件系统映像 下载成功实验总结:通过这次实验,我熟悉了 Linux 系统的操作,学会了编译、建立一个嵌入式开发平台,了 解了 ARM-Linux 开发工具链的含义, 建立流程, 以及初步的使用方法。并熟悉了 Bootloader 、 Linux 内 核映像以及根系统的编译。课程名称嵌入式系统技术上机内容 :硬件测试实验实验报告该实验开发板处于 Bootstrap 启动模式。SW1 的 123456 拨码开关设置为 ON-ON-ON-ON-ON-ON。SW2 的 123456 拨码开关设置为 ON-ON-OFF-ON-ON-ON。用 minicom 传输文件,则用 ascii 模式发送。(一) Bootstrap 模式下硬件测试程序下载及 PWM 控制蜂鸣器实验一、实验目的1. 认识 MC9328 MX1 的 Bootstrap 模式,了解该模式下的程序下载过程以及编译和测试的整个流程。2. 了解 DBMX1 的脉冲宽度调制器(PWM)的原理,了解及其对蜂鸣器的控制机理。3. 编写程序读写 PWM 模块寄存器,进行由简单到复杂的控制。二、实验内容1. 阅读 MC9328 MX1 Reference Manual, Rev 5 中关于 PWM 的部分,对微处理器上的这个模块有初步的认 识。2. 通过例程了解编写、编译硬件测试程序的主要步骤。3. 编写程序,下载测试,编译程序,得到结果,使蜂鸣器按照预设的频率及音量发出声音。三、实验原理DBMX1 的 PWM 模块有四个寄存器:PWMC、PWMS、PWMP、PWMCNT,其中 PWMCNT 为只读寄存器。PWMC 实现对模块工作的控制。其中包括 PWM 的工作模式,本实验中 PWM 应该工作在音调模式。具体的设置 PWMCR 请参考手册。PWM 模块的输出为 PWMO,ADS 将 PWMO 接蜂鸣器,所以要实现对蜂鸣器的控制要先 控制 PWMO。(PWMO 的占空比即脉冲高电平持续时间与周期之比控制蜂鸣器的音长,PWMO 的频率控制蜂鸣器 的音调) 。据芯片手册的描述,PWMO 的占空比由 PWMS 寄存器中的值控制,频率由 PWMP 寄存器中的值控制。实验中需要根据实验要求正确设置这些寄存器,从而实现要求。四、实验设备(硬件,软件) 1.硬件DBMX1 ADS 开发板 PC 机(操作系统为 Windows 2000 或更高版本) 直连串口线 3.3V/2A 开关电源 2.软件虚拟机 Vmware 虚拟机上运行的 Red Hat Linux 9.0 ARM-Linux 工具链(或者源代码) 安装脚本 文本编辑器(如 Windows 下的 notepad、ultraedit,Linux 下的 Vi、Emacs 等) 五、实验步骤1.在进行相关背景知识的学习之后编写出 C 文件(pwm.c),实现控制 PWM 的简单功能(有例程供参考) 。2.打开 VMware Workstation,点击 Start this virtual machine,进入 Linux 登陆界面,然后登陆进入 Linux。3.进入含有 pwm.c 文件以及其它相关文件 (附加说明的编程必备文件中提供) 目录下, 编写编译命令脚本 go.sh。运行该脚本,完成 pwm.c 的编译。编译成功后可以看到 b-record 格式文件。4. 将 DBMX1 的 Uart1 与 PC 的 COM1 相连,连上 DBMX1 电源线。5.设置拨码开关 SW1 为 Bootstrap 模式。SW2 按照默认可行连接, 即将 IrDA 关闭, 其他为 ON, 拨码开关 SW2 中控制 PWMO 输出信号与蜂鸣器 buzzer 相连的开关必须保持在闭合状态。6.打开 Window 下附件 通讯 超级终端,然后打开 DBMX1 电源开关 SW2。(要先设好超级终端才可以打开电 源开关,如果相反,需要对 DBMX1 重启――按 SW3。7.在超级终端中键入字母 a 或 A,如果连接成功看到屏幕显示“,同时”Uart1 的波特率完成自动检测,此时 可以开始传输文件。点击传送 发送文本文件,找到文件 boot_setup.txt(初始化内存所必要的文件)传送,成功后, 传送文本文件 pwm_b.text,则它被下载入内存。如果成功会看到屏幕上显示 b-record 格式文件。程序自动被执行, 蜂鸣器发出叫声。8.如果蜂鸣器未发出指定叫声,在操作无问题的条件下,则需要修改程序,然后从第二步开始重新操作。六、实验结果从串口终端下载程序完毕之后程序自动运行,将重复发出音调变化的蜂鸣声。用示波器观察 PWMO 管脚所在的电网络,以及蜂鸣器输入端的波形,可以看到 PWM 波形,记录这些波形,进行 分析。(二)Bootstrap 模式下串行口通信实验 一、实验目的1. 了解认识串口这一广泛应用的通讯手段 2. 了解 MC9328 MX1 的 UART 控制器的特点、性能、工作原理、配置方法 3. 进一步加深对 Bootstrap 模式下硬件程序编写、编译和测试整个流程的认识 二、实验内容1. 研读实例程序,了解串口控制的基本流程。2. 编写程序并下载到嵌入式系统,实现串口的收发功能。示例程序中给出了不断向 PC 机串口发送“I am UART! ”的字符串。3. 接收来自 PC 机串口(通过终端程序)的字符,并将接收到的字符经过某些处理发送回终端程序。在没有 操作系统的情况下,完成嵌入式系统和 PC 机通过串行口传递信息。(扩展要求) 4. 编译程序,下载测试,观察结果 三、实验原理Bootstrap 模式下,串口 1 是自动初始化的,可以直接使用,而其它的外设均需要进行初始化。初始化的过程就 是将相应的寄存器进行配置。在这个实验中,通过配置串口 1、2 可以将这两个串口初始化并使用。通过读写相应 的寄存器可以修改串口设置、改变串口的工作方式以及输出数据。因此,这个实验的实质就是把通过读写 UART 的 寄存器进行试验性的控制。这种方式是嵌入式系统底层硬件编程的基础。对 UART 模块有了充分了解之后就能够根据需求编写相应的测试程序,通过交叉编译生成可执行程序。四、实验设备(硬件,软件) 1.硬件DBMX1 ADS 开发板 PC 机(操作系统为 Windows 2000 或更高版本) 直连串口线 3.3V/2A 开关电源 A-to-B 型的 USB 线缆 2.软件虚拟机 Vmware 虚拟机上运行的 Red Hat Linux 9.0 交叉编译工具链 终端软件 Windows 下的 HyperTerminal 或者 Linux 下的 minicom 文本编辑器(如 Windows 下的 notepad、ultraedit,Linux 下的 Vi、Emacs) 五、实验步骤1.学习基础知识,了解串行通信的基本原理,和与 UART 相关的寄存器的配置方法。2.编写程序串口操作函数 uart.c 和 hello.c, 实现如下功能将系统初始化为异步模式, 初始化 BHU DBMX1 ADS 的 UART1 为 115200bps, Data bit,8bit1 bit Stop bit。控制 UART1 循环接收串口发送来的数据,反复输出“I amUART! ”信息。并加一定的延时。3. 使用交叉编译工具编译以上程序,生成可执行程序。4. 将计算机的串口接到目标板的 UART1 上。5. 运行超级终端,选择正确的串口号,并对串口参数进行设置,波特率(115200) 、奇偶校验(None) 、数据位 数 (8) 和停止位 (1) 、 无流控打开 Windows 下的 HyperTerminal, 设置为 115200bps, 8N1, 无流控(若使用 minicom, 发送模式选为 ascii,其余设置参照 2.2)。6. 将 DBMX1 ADS 设置为 Bootstrap 模式。7. 打开 DBMX1 ADS 板上的电源。8. 在终端程序中输入‘a’或‘A’ ,应当从串口程序中看到返回的‘。’ 9. 在 Bootstrap 模式下通过超级终端下载初始化内存脚本 boot_setup.txt。10. 然后下载 hello_b.txt 程序并自动运行。如果程序运行正确,则在超级终端上将回显出“I am UART! 。” 11. 改变波特率(57600) 、奇偶校验(1) 、数据位数(7)和停止位(None) 、无流控,通过调整源代码中对寄存 器的配置,仍然实现串行通信。六、实验结果示例程序经编译和下载后,从串口终端中可以看到“I am UART! 。” 进行扩展要求设计的同学的实验结果自行记录。实验总结:通过本次实验,主要了解了 DBMX1 的脉冲宽度调制器(PWM)的原理及其对蜂鸣器的控制机理,实验操 作过程比较顺利。还进一步熟悉了串口的操作。课程名称嵌入式系统技术 上机内容 :面向嵌入式系统程序的交叉编译与移植实验报告该实验开发板处于正常启动模式,使用 minicom 的 zmodem 传输文件。SW1 的 123456 拨码开关设置为 ON-OFF-OFF-ON-ON-ON。SW2 的 123456 拨码开关配置为 ON-ON-OFF-ON-ON-ON,即关闭 IrDA 模块。(一) C 语言编程实验一、实验目的1. 通过实验认识嵌入式系统上 C 语言编程与普通 PC 机上 C 语言编程的不同点 2. 掌握使用交叉编译环境编译嵌入式系统程序的方法 二、实验内容: 1. 使 用 shell 脚 本 语 言 编 写 ”HelloWorld” 程 序 , 实 现 在 BusyBox 下 输出”HelloWorld”等 信息,可根据掌握 shell 的熟悉程度随意发挥。2. 使用 C 语言编写”Hello World”程序,实现在 shell 下输出”Hello World”等信息,同样可根据 C 的熟 悉程度结合 BHU DBMX1 ADS 的特点发挥。三、实验原理使用交叉编译在宿主机上生成嵌入式系统能够使用的程序。四、实验设备(硬件,软件) 1.硬件DBMX1 ADS 开发板 PC 机(操作系统为 Windows 2000 或更高版本) 直连串口线 3.3V/2A 开关电源 2.软件虚拟机 Vmware 虚拟机上运行的 Red Hat Linux 9.0 ARM-Linux 工具链(或者源代码) 安装脚本 文本编辑器(如 Windows 下的 notepad、ultraedit,Linux 下的 Vi、Emacs 等) 五、实验步骤1. 打开电脑,运行虚拟机以及其上的 Linux 操作系统。2. 使用 Vi 编辑 C 程序 3. 在 PC 机上进行编译 4. 在 PC 机上进行交叉编译,并且与本机编译的文件进行对比 5. 通过 zmodem 或者其它方式(如超级终端等)将文件传送到嵌入式板上 6. 增加文件的可执行属性 7.运行该可执行文件 六、实验结果在嵌入式开发板上运行的程序能够将“Hello,World”从终端控制台输出。(二)MP3 播放软件的移植 一、实验目的1. 了解 MP3 播放器的相关知识; 2. 熟悉交叉编译环境,掌握交叉编译的方法; 3. 掌握将 MP3 播放器移植到 ARM 处理器的基本方法。二、实验内容1. 准备源代码 2. 在 PC 机上进行编译和测试 3. 进行交叉编译的配置 4. 交叉编译并测试 三、实验原理由源码通过交叉编译配置生成嵌入式系统能够使用的播放器程序。四、实验设备(硬件,软件) 1.硬件DBMX1 ADS 开发板 PC 机(操作系统为 Windows 2000 或更高版本) 直连串口线 3.3V/2A 开关电源 A-to-B 型的 USB 线缆 2.软件虚拟机 Vmware 虚拟机上运行的 Red Hat Linux 9.0 交叉编译工具链 终端软件 Windows 下的 HyperTerminal 或者 Linux 下的 minicom 文本编辑器(如 Windows 下的 notepad、ultraedit,Linux 下的 Vi、Emacs) 五、实验步骤1.准备库文件和 madplay 的源代码(从光盘上获得,或者下载的版本或者补丁) 2.在本机上安装库文件以及 madplay,进行测试(可选) 3.交叉编译库文件 4.交叉编译 madplay 可执行程序 5.下载库文件以及 madplay 可执行程序 6.进行相应的库文件路径配置 7.测试 六、实验结果能够从耳机中听到播放的声音 终端程序中有相应的输出,显示播放器的工作状态 实验总结:通过本次实验,认识到了嵌入式系统上 C 语言编程与普通 PC 机上 C 语言编程的不同点 ,掌握了使用交 叉编译环境编译嵌入式系统程序的方法 。掌握了在嵌入式系统上用 C 编程的步骤。课程名称嵌入式系统技术 实验报告上机内容 面向嵌入式系统的 Qt / Embedded & qtopia 程序 设计(一) Qt 图形界面基础实验一、实验目的1. 了解当前流行的嵌入式系统的 GUI 编程 2. 了解 Qt 程序开发的特点和流程 3. 通过最基本的 Hello,World 程序学会如何在宿主机上编译,链接和调试嵌入 式平台上的 Qt 程序 二、实验内容1. 参考背景知识,利用 Qt Designer 搭建应用程序框架。2. 在本机(宿主机)上完成本机程序的编译、链接、运行。3. 在本机(宿主机)上完成嵌入式平台上程序的交叉编译、链接,并下载运行。三、实验原理本实验使用交叉编译在宿主机上生成嵌入式系统能够使用的程序,与实验 三中不同的部分在于所开发程序是基 于 Qt 类库的。具体的来说就是程序的运 行需要动态或者静态地调用 Qt 图形类库。由于需要嵌入式系统上库的支 持, 因此开发的过程包括类库的移植和程序的开发及移植。在类库的移植完成的基 础上进行程序的开发需要了解 Qt 程序开发的一般流程和类库应用的一般原 理。本实验使用简单的控件使学生了解一般 Qt 程序开发的一般流程。四、实验设备(硬件,软件) 1.硬件DBMX1 ADS 开发板 PC 机(操作系统为 Windows 2000 或更高版本) 直连串口线 3.3V/2A 开关电源 2.软件虚拟机 Vmware 虚拟机上运行的 Red Hat Linux 9.0 ARM-Linux 工具链(或者源代码) 安装脚本 文本编辑器(如 Windows 下的 notepad、ultraedit,Linux 下的 Vi、Emacs 等) 五、实验步骤1. 打开宿主机的上的 Qt Designer,新建工程 2. 创建和编辑 Form 控件 3. 为控件建立信号和槽 4. 生成 main.cpp,保存并进行宿主机上的测试 5. 文件转换并修改.pro 文件 6. 设定环境变量,编译,链接,下载运行 详细步骤参考背景知识中的说明 六、实验结果宿主机上程序能够正常运行,显示出“Hello,World”的对话框 在嵌入式开发板上运行的程序能够出现与宿主机上相同的画面。实验总结:通过这次实验,我了解了嵌入式系统的 GUI 编程,了解了 Qt 程序开发的特点和流程。课程名称嵌入式系统技术 上机内容 :驱动程序设计实验报告该实验开发板处于正常启动模式,打开 minicom 用 zmodem 传输文件。SW1 的 123456 拨码开关设置为 ON-OFF-OFF-ON-ON-ON。SW2 的 123456 拨码开关配置为 ON-ON-OFF-ON-ON-ON,即关闭 IrDA 模块 一、实验说明:讲述 Linux 设备驱动的分类及其概念,最基本的驱动编写方法和注意事项。由此设计以下几个实验。4. Hello Kernel 内核模块的设计,编译,插入,卸载与验证。了解内核模块的设计过程以及内核模块最基本的 结构。5. 一个设备驱动程序的设计实现,实现从一个字符设备中定时读取数据,提供给应用程序以调用接口,可向 设备写入数据,并向内核注册。6. 选择 BHU DBMX1 ADS 的触摸屏驱动程序做以分析。7. 环境:Red Hat Linux 9.0,gcc3.x,/usr/src/linux 目录内核版本为 2.4.18。minicom 8. 查看调试信息:KDB 内核调试环境。9. 工具:vi,gcc,make。二、实验注意事项4. 不要使用浮点运算 5. 在驱动中不要进行繁忙的等待,内核中的用时一秒相当于整个系统都等待一秒 6. 驱动程序在与硬件打交道的时候需要精确的定时 7. 内核编译选项应该加上-D__KERNEL__ 和-DMODULE 标志 8. 有些内核函数需要编译时的高优化级别支持,如 outb 需要-O2 级别以上 9. 注意内核树目录的包含 CI/usr/local/src/linux-2.4.18 10. 注意防止内核模块被加载到一个与它不兼容的内核去,使用 MODVERSIONS 11. 定义检查函数版本,在设备驱动程序中需要包涵&Linux/modversions.h&文件 12. 避免内核空间的函数名和变量冲突,在内核模块中需要将函数和全局变量声明为 static 永远注意所使用的数据类型和硬件设备的总线宽度的关系
【嵌入式实验报告一】实验一 CVT6410 GPIO 控制 LED1.1 实验目的 1. 熟悉RVDS2.2开发环境。2. 掌握S3C6410内部相关寄存器的操作方法,最终实现对外部设备的控制。3. 熟悉在ARM裸机环境下的C语言编程。1.2 实验内容 建立 RVDS 开发环境。编程显示二进制的 0 到 15,如 15 全部灯亮,0 全灭,最 右边灯为最低位,最左边灯为最高位,轮流显示你学号的低四位 1.3 实验设备 1. 硬件:CVT6410 教学实验箱、PC 机; 2. 软件:PC 机操作系统 Windows 98(2000、XP) +RVDS 开发环境。3. JLINK 仿真器。1.4 实验原理从电路图上我们可以看到,发光二极管 LED 的一端连接到了 ARM 的 GPIO, 另一端经过一个限流电阻接电源 VDD33V。当 GPIO 口为低电平时,LED 两端产生 电压降,这时 LED 有电流通过并发光。反之当 GPIO 为高电平时,LED 将熄灭。注意亮灭之间要有一定的延时,以便人眼能够区分出来。实验相应寄存器 端口配置寄存器端口数据寄存器端口上拉电路使能寄存器1.5 实验步骤及结果 1. 准备好实验环境,将 JLINK 连接好。给开发板上电,使 Bootloader 停在菜单 处。2. 打开软件‘Code Warrior forRVDS’,新建工程‘gpioled.mcp’,并添加两个程序文件 ‘main.c’和‘init.s’(汇编文件) 。3. 对工程文件进行相应设置 4. 编译该工程,成功后将生成映像文件‘gpioled.axf’。打开 AXD,装载映像文件 ‘gpioled.axf’。5. 运行程序,观察结果。原程序#define rGPMCON #define rGPMDAT #define rGPMPUD void msDelay(int time)(*(volatile unsigned *)(0x7F008820)) (*(volatile unsigned *)(0x7F008824)) (*(volatile unsigned *)(0x7F008828)) { volatile unsigned int i,j; for(i = 0; i & 2000000; i++) for(j=0; j& j++); } void GPIO_Init(void) { rGPMCON = 0x11111; //端口均设为输出 rGPMPUD = 0x00; rGPMDAT = 0X1F; } void LedTest(void) { vol while (1) { for(i=0; i&4; i++) { rGPMDAT = ~(1&&i); msDelay(10); } } } void Main(void) { GPIO_Init(); LedTest(); } 结果:四个发光二极管 LED 将轮流闪烁,最终实现流水灯效果。改进 1:显示二进制 0-15 unsigned char num[15] = { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F }; //端口数据寄存器赋值,LED 依次显示二进制 0-15 void LedTest(void) { vol while (1) { for(i=0; i&15; i++) { rGPMDAT = ~num[i]; msDelay(10); } } } 结果:最右边灯为最低位,最左边灯为最高位,显示二进制的 0 到 15,15 全部 灯亮,0 全灭。如下图所示,显示数据 2。改进 2:显示学号低四位 0134 void LedTest(void) { vol while (1) { rGPMDAT &= 0xFFFFFFF0; //数据状态维持 rGPMDAT |= 0x0; msDelay(15); rGPMDAT &= 0xFFFFFFF0; rGPMDAT |= 0x1; msDelay(15); rGPMDAT &= 0xFFFFFFF0; rGPMDAT |= 0x3; msDelay(15); rGPMDAT &= 0xFFFFFFF0; rGPMDAT |= 0x4; msDelay(15); } } 结果:LED 灯按二进制依次闪烁 0134。 1.6 实验 通过此次实验,我知道了只有当 GPIO 口为低电平时,LED 两端才会产生电 压降,这时 LED 有电流通过并发光。GPIO 有三个寄存器,端口配置寄存器、端 口数据寄存器、端口上拉电路使能寄存器。rGPMCON = 0x11111,表示将端口 均设为输出。总之,这次试验,让我对 S3C6410 内部相关寄存器的操作方法更 加熟悉了。实验二 CVT6410 蜂鸣器实验2.1 实验目的 1. 熟悉RVDS2.2开发环境。2. 掌握S3C6410内部相关寄存器的操作方法,最终实现对外部设备的控制。3. 熟悉在ARM裸机环境下的C语言编程。2.2 实验内容 建立RVDS开发环境。编程实现对开发板上有源蜂鸣器控制,使蜂鸣器鸣叫。2.3 实验设备 1. 硬件:CVT6410 教学实验箱、PC 机; 2. 软件:PC 机操作系统 Windows 98(2000、XP) +RVDS 开发环境。3. JLINK 仿真器。2.4 实验原理 蜂鸣器是通过I/O口GPF15来间接控制的,为了增加驱动能力,增加了三级管 驱动电路。当三极管的基极(B)为高电平即GPF15为高电平时,蜂鸣器会鸣叫, 反之则不响。通过设置两者之间的时间(即改变频率)可以使蜂鸣器发出不同的 声音,甚至播放乐曲。实验相应寄存器端口配置寄存器 端口数据寄存器端口上拉电路使能寄存器实验电路2.5 实验步骤及结果 1. 准备好实验环境,将 JLINK 连接好。给开发板上电,使 Bootloader 停在菜单 处。2. 打开软件?Code Warrior forRVDS?,新建工程?pwm.mcp?,并添加两个程序文件 ?main.c?和?init.s?(汇编文件) 。3. 对工程文件进行相应设置 4. 编译该工程,成功后将生成映像文件 ?pwm.axf?。打开 AXD,装载映像文件 ?pwm.axf?。5. 运行程序,观察结果。 原程序:#define rGPFCON (*(volatile unsigned *)(0x7F0080A0))址//蜂鸣器相关寄存器地#define rGPFDAT (*(volatile unsigned *)(0x7F0080A4)) #define rGPFPUD (*(volatile unsigned *)(0x7F0080A8)) void msDelay(int time) //延时函数 { volatile unsigned int i,j; for(i = 0; i & 200000; i++) for(j=0; j& j++); } void GPIO_Init(void) //蜂鸣器初始化 { rGPFCON = rGPFCON & (~(0x1 && (31))); rGPFCON = rGPFCON | (0x1 && (2*15)); //蜂鸣器控制寄存器只有 31~30 位使能,因此只需设置这两个最高位即可 //第一句将 31 位置 0,其余位不变;第二句将 30 位置 1,其余位不变; //即 01,端口配置为输出 rGPFPUD = rGPFPUD & (~(0x3 && (2*15))) ; rGPFDAT = rGPFDAT | 0x8000; } void BeepOn(void) //蜂鸣器响 { rGPFDAT = rGPFDAT | 0x8000; } void BeepOff(void) //蜂鸣器灭 { rGPFDAT = rGPFDAT & 0x7 } void BeepTest(void) { while (1) { BeepOn(); msDelay(100); BeepOff(); msDelay(100); } } void Main(void) { GPIO_Init(); BeepTest(); } 结果:蜂鸣器在固定频率下鸣叫。改进Volatile unsigned int beef[15]= { 1,1,5,5,6,6,5,4,4,3,3,2,2,1,7 } void BeepTest(void) { while (1) { vo for (i=0;i&15;i++) { BeepOn(); msDelay(100*beef[i]); BeepOff(); msDelay(100*beef[i]); } } } 结果:蜂鸣器按不同的频率发出声音 2.6 实验心得 通过此次实验,我知道了当三极管的基极(B)为高电平即 GPF15 为高电平 时,蜂鸣器会鸣叫,反之则不响。通过设置两者之间的时间(即改变频率)可以 使蜂鸣器发出不同的声音。动手编程能力有了进一步的提高。实验三 CVT6410 按键实验3.1 实验目的 1. 熟悉RVDS2.2开发环境。2. 掌握S3C6410内部相关寄存器的操作方法,最终实现对外部设备的控制。3. 熟悉在ARM裸机环境下的C语言编程。3.2 实验内容 建立RVDS开发环境,编程实现开发板上按键对蜂鸣器控制,使蜂鸣器鸣叫,同 时使LED灯亮。3.3 实验设备 1. 硬件:CVT6410 教学实验箱、PC 机; 2. 软件:PC 机操作系统 Windows 98(2000、XP) +RVDS 开发环境。3. JLINK 仿真器。3.4 实验原理 通过直接读取某按键对应的GPIO口的高、低电平状态,就可以知道对应按键 是否被按下。通过电路可知,当某按键未按下时,其对应的GPIO口为高电平;当 某按键按下时,其对应的GPIO口为低电平。实验相应寄存器 端口配置寄存器端口数据寄存器端口上拉电路使能寄存器 3.5 实验步骤及结果 1. 准备好实验环境,将 JLINK 连接好。给开发板上电,使 Bootloader 停在菜单 处。2. 打开软件?Code Warrior forRVDS?,新建工程?keyboard.mcp?, 并添加两个程序文 件?main.c?和?init.s?(汇编文件) 。3. 对工程文件进行相应设置 4. 编译该工程,成功后将生成映像文件?keyboard.axf?。打开 AXD,装载映像文 件?keyboard.axf?。5. 运行程序,观察结果。原程序#define rGPFCON (*(volatile unsigned *)(0x7F0080A0)) //蜂鸣器相关寄存器地址 #define rGPFDAT (*(volatile unsigned *)(0x7F0080A4)) #define rGPFPUD (*(volatile unsigned *)(0x7F0080A8)) #define rGPNCON (*(volatile unsigned *)(0x7F008830)) //键盘相关寄存器地址 #define rGPNDAT (*(volatile unsigned *)(0x7F008834)) #define rGPNPUD (*(volatile unsigned *)(0x7F008838)) void msDelay(int time) //延时函数 { volatile unsigned int i,j; for(i = 0; i & 200000; i++) for(j=0; j& j++); } void GPIO_Init(void) { /*-------init Beep-----*/ rGPFCON = rGPFCON & (~(0x1 && (31))); rGPFCON = rGPFCON | (0x1 && (2*15)); rGPFPUD = rGPFPUD & (~(0x3 && (2*15))) ; rGPFDAT = rGPFDAT | 0x8000; /*-------init Kye------*/ rGPNCON = rGPNCON & (0xffffffff && (2*6)); } void BeepOn(void) { rGPFDAT = rGPFDAT | 0x8000; } void BeepOff(void) { rGPFDAT = rGPFDAT & 0x7 } unsigned int KeyScan(void) { if ((rGPNDAT & 0x3f) != 0x3f) return 1; else return 0; } void KeyTest(void) { unsigned int KeyS while (1) { KeyStatus = KeyScan(); if (KeyStatus == 1) { BeepOn(); msDelay(100); BeepOff(); msDelay(100); } else BeepOff(); } } void Main(void) { GPIO_Init(); BeepOff(); KeyTest(); } 结果:按住按键,蜂鸣器鸣叫。改进//LED 灯相关寄存器地址 #define rGPMCON (*(volatile unsigned *)(0x7F008820)) #define rGPMDAT (*(volatile unsigned *)(0x7F008824)) #define rGPMPUD (*(volatile unsigned *)(0x7F008828)) //初始化函数 void GPIO_Init(void) { /*-------蜂鸣器初始化-----*/ rGPFCON = rGPFCON & (~(0x1 && (31))); rGPFCON = rGPFCON | (0x1 && (2*15)); //蜂鸣器 CON 寄存器只有 31~30 位使能,因此只需设置这两个最高位即可 //第一句将 31 位置 0,其余位不变;第二句将 30 位置 1,其余位不变; //即 01,端口配置为输出 rGPFPUD = rGPFPUD & (~(0x3 && (2*15))) ; rGPFDAT = rGPFDAT | 0x8000; //首位为 1 则响,其余位为 0 则不响 /*-------键盘初始化------*/ rGPNCON = rGPNCON & (0xffffffff && (2*6)); //键盘 CON 寄存器只有 0~11 位使能,因此只需设置这低 12 位即可 //此句将 CON 高位设置为 1,低 12 位设置为 0 //即 00,端口配置为输入 /*-------LED 灯初始化------*/ rGPMCON = 0x11111; rGPMPUD = 0x00; rGPMDAT = 0X1F; //LED 灯 CON 寄存器对应 4 个 LED 灯,配置为输出 0001 //LED 灯 DAT 寄存器初始化,只有 0~4 在使用,配置为不亮(1) } //蜂鸣器响 void BeepOn(void) { rGPFDAT = rGPFDAT | 0x8000; } //蜂鸣器灭 void BeepOff(void) { rGPFDAT = rGPFDAT & 0x7 } //LED 显示 void Led(int num) { vol rGPMDAT &= 0xFFFFFFF0; //数据状态清零 if (num == 0) { rGPMDAT |= 0x0; } else if (num == 1) { rGPMDAT |= 0x7; } else if (num == 2) { rGPMDAT |= 0 } else if (num == 3) { rGPMDAT |= 0x3; } else if (num == 4) { rGPMDAT |= 0 } else { rGPMDAT |= 0x5; } } //键盘监听函数 unsigned int KeyScan(void) { if ((rGPNDAT & 0x3f) == 0x3e) //键盘 DAT 寄存器后 6 位分别对应 6 个键盘按钮,按下变为 0 { return 0; } else if ((rGPNDAT & 0x3f) == 0x3d) { return 1; } else if ((rGPNDAT & 0x3f) == 0x3b) { return 2; } else if ((rGPNDAT & 0x3f) == 0x37) { return 3; } else if ((rGPNDAT & 0x3f) == 0x2f) { return 4; } else if ((rGPNDAT & 0x3f) == 0x1f) { return 5; } else { return 6; } } //键盘响应函数 void KeyTest(void) { unsigned int KeyS while (1) { KeyStatus = KeyScan(); //状态不为 0 表示按键已按下 if (KeyStatus != 6) { Led(KeyStatus); BeepOn(); msDelay(100); BeepOff(); msDelay(100); } else BeepOff(); } } void Main(void) { GPIO_Init(); BeepOff(); KeyTest(); } 结果:按键的同时,蜂鸣器响,LED 灯亮3.6 实验心得 通过此次实验, 我知道了通过直接读取某按键对应的 GPIO 口的高、 低电平 状态,就可以知道对应按键是否被按下。通过电路可知,当某按键未按下时,其 对应的 GPIO 口为高电平;当某按键按下时,其对应的 GPIO 口为低电平。通过 按键电平的变化可以设置蜂鸣器和 LED 发生相应的变化。实验四 CVT6410 数码管实验4.1 实验目的 1. 2. 3. 4. 熟悉RVDS2.2开发环境。掌握S3C6410内部相关寄存器的操作方法,最终实现对外部设备的控制。熟悉在ARM裸机环境下的C语言编程。熟悉S3C6410编程实现控制数码管显示。4.2 实验内容 建立RVDS开发环境。利用控制寄存器实现对开发板上SEG数码管的控制显示。4.3 实验设备 1. 硬件:CVT6410 教学实验箱、PC 机; 2. 软件:PC 机操作系统 Windows 98(2000、XP) +RVDS 开发环境。3. JLINK 仿真器。4.4 实验原理 发光二极管数码显示器简称 LED 显示器。LED 显示器具有耗电省、 成本低廉、 配置简单灵活、安装方便、耐振动、寿命长等优点,目前广泛应用于嵌入式系统 中。7 段 LED 由 7 个发光二极管按“日”字形排列,所有发光二极管的阳极连在 一起称共阳极接法, 阴极连在一起称为共阴极接法。一般共阴极可以不需外接电 阻, 但共阳极接法中发光二极管必须外接电阻。LED 的结构及连接图见图 3-8-1。图 3-8-1 LED 结构及连接图 当选用共阴极的 LED 显示器时,所有发光二极管的阴极连在一起接地,当某 个发光二极管的阳极加入高电平时,对应的二极管点亮。因此要显示某字形就应 使此字形的相应段的二极管点亮, 也就是送一个用不同电平组合代表的数据字来 控制 LED 的显示,此数据称为字符的段码。字符 0、1、2?F 与 LED 码段 A、B、 C?F 以及 DP(小数点)的关系如表 3-8-2 所示表 3-8-2 LED 字符与码段对应表 字 符 0 1 2 3 4 5 6 7 8 9 A B C D E F . 熄 灭 DP 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 G 0 0 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 0 F 1 0 0 0 1 1 1 0 1 1 1 1 1 0 1 1 0 0 0 E 1 0 1 0 0 0 1 0 1 0 1 1 1 1 1 1 0 0 0 D 1 0 1 1 0 1 1 0 1 1 0 1 1 1 1 0 0 0 0 C 1 1 0 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 B 1 1 1 1 1 0 0 1 1 1 1 0 0 1 0 0 0 0 0 A 1 0 1 1 0 1 1 1 1 1 1 0 1 0 1 1 0 0 0 段 码 ( 共 段码(共阳) 阴) 3FH 06H 5BH 4FH 66H 6DH 7DH 07H 7FH 6FH 77H 7CH 39H 5EH 79H 71H 40H 80H 00H C0H F9H A4H B0H 99H 92H 82H F8H 80H 90H 88H 83H C5H A1H 86H 8EH BFH 7FH FFH说明:共阴的 LED,被选中时的段为高电平有效,熄灭的段码为 00H; 共阳的 LED,被选中时的段为低电平有效.熄灭的段码为 FFH。2. LED 显示接口 LED 显示器的接口一般有静态显示与动态显示接口两种方式,下面分别加以介绍。1) 静态显示 LED 数码管采用静态接口时,共阴极或共阳极点连接在一起接地或接高电平。每个显示位的段选线与一个 8 位并行口线对应相连,

我要回帖

更多关于 笔记本小键盘怎么开关 的文章

 

随机推荐