嵌入式实验报告二work2_第1页
嵌入式实验报告二work2_第2页
嵌入式实验报告二work2_第3页
嵌入式实验报告二work2_第4页
嵌入式实验报告二work2_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验报告课程名称嵌入式系统编程实践实验仪器清华同方辰源嵌入式系统实验箱实验名称 实验二:利用中断实现oled动态显示实验系 别 一计算机学院专 业班级/学号_学生姓名实验日期 一 2013年9月22日成 绩 实验二:利用中断实现oled动态显示实验一、实验问题回答(1) isr是什么?简述一下中断的作用和使用方法答:isr是中断服务程序。作用是通过处理器执行事先编好的某个特定的程序。 使用方法就是在main中写一个中断程序,然后在startup.s中进行注册。(2) 嵌入式系统中有哪些应用有定吋性循环处理的要求?举几个例子答:在各种网络的应用中,设计的一些部件,如计数器,时钟等。(3) 定时时

2、间间隔如何修改?答:通过改变 systickperiodset(sysctlclockget()/100)后面的 100 这个参数。(4) 选作内容58的编程思路是什么?若做的话应该怎样实现?答:编程思路:先画直线和竖线,组成一个正方形,各各个参数填写到函数 rit128x96x4imagedraw(buf,);第6个选作:判断画的原点x,原点y,和 画原点x+的长,画原点y+画宽的值耍在0-128和0-96o第7个选作:把 rit128x96x4stringdraw(nhellon,);就是把画的灰度定义为一个变量x。最后就 会出现由不同的亮度而形成的波浪。第8个就是利用随机函数产牛画的原点

3、,随 机的在屏幕上进行显示。(5) 拖影现象如何解决?计数值显示为什么没有拖影?答:在程序结束后执行清屏语句:计数显示是每次重新赋值,所以不会出现 拖影。二、实验目的和效果(效果即是否达到实验目的,达到的程度如何)(1) 深入学习、理解、掌握oled字符显示方法(2) 深入学习、理解、掌握oled图形显示方法(3) 学习、理解、掌握中断使用方法实验效果图:三、实验内容和步骤(重点阐述自己的思路及遇到的问题)(一)keil开发环境中对项目project配置(1) 建立项目1、新建一个 project;2、选择 cpu 屮的 luminary lm3s 8962;3、加载库文件;4、项目相关配置项

4、修改。(-)嵌入式c程序开发(1) 加载必要程序本次实验提供了 几个源程序 rit 128x96x4.h, rit 128x96x4.c, startup.so(2) 新建主函数程序,并加载到项目中新建一个文件,保存为main.c,把main.c也加载到项目中。(3) 开发主函数,完成基木显示功能头文件有以下三个# include <stdio.h># include <lm3sxxxx.h># include nritl28x96x4.hn在主函数中,首先要进行cpu初始化,函数为/* set the clocking to run from pll at 50 mh

5、z */sysctlclockset(sysctl_sysdiv_4 | sysctl_use_pll | sysctl_osc_main | sysctl_xtal_8mhz);需要对显示屏进行初始化,初始化另法如下rit 128x96x4init( 1000000);一般在显示前,先对oled显示屏进行清屏处理使用函数rit128x96x4clear,具体如何使用,自己查ritl28x96x4.h和 ritl28x96x4.c 代码。以下为示例rit128x96x4clear();显示字符串方法使用函数rit128x96x4stringdraw,具体如何使用,自己查 ritl28x96x4

6、.h 和 ritl28x96x4.c 代码。以下为示例while(l) rit 128x96x4stringdraw(hhello”,0, 6, 15);显示图形方法使用函数rit128x96x4imagedraw,具体如何使用,自己查 ritl28x96x4.h 和 ritl28x96x4.c 代码。以下为示例unsigned char buf81;buf0=0xff;buf80=0xff;for(i=l;i<80; i+)bufi = 0x00;rit128x96x4imagedraw(buf, 18, 84, 162, 1);在oled屏幕上显示学号、姓名、个性化字符、直线。(三)

7、利用中断,实现“0阈值”循环显示(本例中以阈值100为例)(31)基本原理因为是无限循环显示,因此主函数中有个无限循环while(l),在该循环中不 断进行计数值显示;为了能控制一定时间显示一次,设定一个全局变量event,每次显示完成后置为0,每次中断发生时置为1。在无限循环中,先判断该值是否为1,若为1,表示发牛中断了,进行显示, 显示完成后清为0,下次循环因为该值为0,故而不再显示,一直等到下次中断 发生。这样就可以用中断的频率控制显示的频率。(32)实现步骤首先,写一个中断处理程序systick.handler (你也可以自己起名字),响应 系统systick中断,其处理功能就是设置全

8、局变量event为1。示例如下:在main.c中/* systick interrupt happens every xx ms */ void systick_handler (void) event = 1;1其次,注册该中断处理程序,在stawp.s中,找到中断向量表部分,如下所 示:*t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t%;the vector table. <t% *t% *t% *t% *t% *

9、t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% *t% ,<1export vectorsvectorsdcdstackmem + stackdcd

10、reset_handlerdcdnmisrdcdfaultlsrdcdintdefaulthandlerdcdintdefaulthandlerdcdintdefaulthandlerdcd0dcdintdefaulthandlerdcdintdefaulthandlerdcdintdefaulthandler;top of stack;reset handler;nmi handler;hard fault handler;mpu fault handler;svcall handler;debug monitor handler;reserved;pendsv handler;systic

11、k handler;gpio port a将其中的systick handler(阴影部分)默认的中断处理程序intdefaulthandler进行修改,改为systick_handler (刚刚自己编写的中断处理程序名称)因为该中断处理函数在main.c中实现,所以在startup.s中在export vectors (阴影部分)前用extern声明,以表示函数的定义在别的文件中,提示 编译器遇到此函数时在其他文件中寻找其定义。修改后示例如下:(阴影部分)!* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !*

12、!* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !*;the vector table.!* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !

13、* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* !* externsystick_handlerexport_vectorsvectorsdcdstackmem + stack;top of stackdcdreset_handler;reset handlerdcdnmisr;nmi handlerdcdfaultlsr;hard fault handlerdcdintdefaulthandler;mpu fault handlerdcdintdefaulthandler;svcall handlerdcdintdefaulthand

14、ler;debug monitor handlerdcd0;reserveddcdintdefaulthandler;pendsv handlerdcdsystick_handler;systick handlerdcdintdefaulthandler;gp1o port a然后,在主函数中开启该中断,示例如下:/* setup and enable systick with interrupt (100hz) */systickperiodset(sysctlclockget()/ 100); 控制每次中断时间间隔,自己 修改一下参数,看看有什么效果systickenable();syst

15、ickintenable();最后,主函数的无限循环中利用该全局变量控制计数值的循环显示unsigned char buff 10;while(l)if(event)event = 0;if(count>99) count = 0;else count +;sprintf(buf, n%i", count);rit128x96x4stringdraw(buf, 48,40, 15);(四)亮线长度周期变化在oled屏幕上显示一根亮线,根据计数值的不同显示不同长度,最终效果 是一根亮线不断变长,变到最长,再从最短继续变长,周而复始首先显示一根亮线的原理是定义一个数组,将里面每个元

16、素设置值为oxff, 表示最亮,然后进行画线操作,可以根据计数值的变化,不断对数组元素进行重 新赋值,如下所示:for(i=0;i<count;i+)bufi=oxff;for(i=count;i<max;i+)bufi=0x00;需要注意的是:计数阈值和数组每个元素的映射关系;显示横线吋不要超出屏幕。(五)编译、连接,生成可执行程序文件财 v/orkl pvision4翼 target 1translate (ctrl*f7)tran slate the currently active filen yf a2日3 lfile edit view project flash de

17、bug peripherals t(ouurlt? oruup 丄盘ritl28x96x4.ccl ritl28x96x4.h(编译)也 v/orkl pvision4 _=file edit view project flash debug peripherals(六)反复(3) (6)步骤,直到完成如果屮间出现错误,修改代码,一直到无错,生成最后程序。(七)硬件连接1、接上电源线,先关闭开关2、用蓝色usb线接上仿真器,仿真器另一 jtag端接lm3s8962 cpu板(左下较大子板),usb线接电脑3、确认连接无误后,打开电源开关(八)联调1 >在keil uvision4中执行下

18、载,(flash菜单-download),即可通过仿真 器将(一)步编译链接好的执行程序下载到lm3s8962芯片内的flash中。2、按下实验箱上lm3s8962子板屏幕上方的白色按钮reset键,即可查看 程序执行效果。若有问题,返回第一步继续修改程序,编译、链接、下载,一肓 到显示岀满意的效果。实验代码:#include <stdio.h>#include <lm3sxxxx.h>include ”rit128x96x4.h”int event = 0;unsigned char bufl=0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x

19、ff,0xff,0xff,0xff,0xff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,ox

20、ff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff,oxff;unsigned char buf2=0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,;unsigned char buf3=-0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x

21、ff;unsigned char buf4= 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;unsigned char buf5f=oxff,oxff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;unsigned char buf6=-0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;unsigned char buf7=0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff;unsigned char buf8

22、f=0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,;void systick_handler (void) event = 1;void printx()int main()存(数字)字符串int count = 0, i,light=0,sss=0,x=100; unsigned char buf5;unsigned char name20 = "pengxin"unsigned char number20 = ”2011011374”;sysctl_use_pll调频率sysctlclockset(sysctl_sy

23、sdiv_4 |sysctl_osc_main | sysctl_xtal_8mhz);rit128x96x4init(1000000);rit128x96x4clear();systickperiodset(sysctlclockget() / 10);systickenable();systickintenable(); /rit128x96x4imagedraw(buf8, 1, 1,43,44); while(l)if(event)rit128x96x4clear();event = 0;sprintf(buf,n%3im,count);通过 sprintf 将数字转换为字符串if(light

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论