实验备课笔记.doc_第1页
实验备课笔记.doc_第2页
实验备课笔记.doc_第3页
实验备课笔记.doc_第4页
实验备课笔记.doc_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

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

文档简介

实验1 基于ARM处理器的看门狗实验一、实验代码及分析1、实验代码Watchdog_enable.s WTCONEQU0x53000000; 看门狗控制寄存器WTCNTEQU0x53000008; 看门狗计数寄存器AREA WATCHDOG_ENABLE,CODE,READONLYENTRY; 设置看门狗控制寄存器ldr r0, =WTCON; 加载WTCON寄存器地址; 0x4a21 = 15:8=74, 5=1, 0=1;ldr r1, =0x4a21; 将0x4a21保存到r1里ldr r1, =0x4a21; 将0x4a21保存到r1里str r1, r0; 将r1里的值存入r0指向的地址; 设置看门狗计数寄存器,该寄存器的值在上电后被加载,1秒超时ldr r2, = WTCNT; 加载WTCNT寄存器地址ldr r3, =0x186a0; 将0x2710保存到r1里str r3, r2 ; 将r3里的值存入r2指向的地址IMPORT led_on; 引入led_on符号bl led_on; 调用led_on代码loopB loop; 死循环END该文件主要完成看门狗控制寄存器的配置,然后启动看门狗开始工作,并调用led_on控制LED灯的闪烁。 由于看门狗的设置为1秒超时,所以LED灯闪烁1秒后,系统重启。led_on.SWTCONEQU0x53000000GPBCONEQU 0x56000010GPBDATEQU 0x56000014DELAYVALEQU0x8fffPAOMADENG EQU 0x10000000EXPORT led_onAREA LED_INIT,CODE,READONLY ;该伪指令定义代码段LED_INIT,属性只读led_onLDR R2,=PAOMADENGMOV R3,#0xFFSTR R3,R2LDR R0,=DELAYVALBL delayLDR R2,=PAOMADENGMOV R3,#0xEFSTR R3,R2;显示左起第二个LDR R0,=DELAYVALBL delayLDR R2,=PAOMADENGMOV R3,#0xDFSTR R3,R2;显示左起第三个LDR R0,=DELAYVALBL delayLDR R2,=PAOMADENGMOV R3,#0xBFSTR R3,R2;显示左起第四个LDR R0,=0xFFFFFBL delayLDR R2,=PAOMADENGMOV R3,#0x7FSTR R3,R2LDR R0,=0xFFFFFBL delayB led_onmov pc, lrdelaySUB R0,R0,#1CMP R0,#0x0BNE delayMOV PC,LREND ;将控制亮灯数据写入数据寄存器r2 Led_on.s主要控制 Led灯的闪烁实验2基于ARM处理器的实时时钟实验一、实验代码及分析实验代码 (1) 表示日期、时间的数据结构/* 表示日期、时间的数据结构 */typedef struct ST_DATEshort year; / 年charmon; / 月charday; / 日charweek_day; / 星期charhour; / 时charmin; / 分charsec; / 秒 st_date;(2) /*/ Function name: rtc_set_date/ Description : 修改实时时钟当前时间、日期/ Return type: void/ Argument : p_date, 待设置的日期*/void rtc_set_date(st_date* p_date) rRTCCON = 0x01; rBCDYEAR = p_date-year; rBCDMON = p_date-mon; rBCDDAY = p_date-day; rBCDDATE = p_date-week_day; rBCDHOUR = p_date-hour; rBCDMIN = p_date-min; rBCDSEC = p_date-sec; rRTCCON = 0x00;(3) /*/ Function name: rtc_get_date/ Description : 获取实时时钟当前时间、日期/ Return type: void/ Argument : p_date, 返回日期的指针*/void rtc_get_date(st_date* p_date) rRTCCON = 0x01; p_date-year= rBCDYEAR ; p_date-mon= rBCDMON ; p_date-day= rBCDDAY ; p_date-week_day= rBCDDATE ; p_date-hour= rBCDHOUR ; p_date-min= rBCDMIN ; p_date-sec= rBCDSEC ; rRTCCON = 0x00;(4)/* 采用BCD编码,如2004年需要设置的值为0x2004 */ m_date.year= 0x2000+0x04 ; m_date.mon= 0x03 ; m_date.day= 0x02 ; m_date.week_day= 0x02 ; m_date.hour= 0x15 ; m_date.min= 0x40 ; m_date.sec= 0x00 ; /* 修改当前日期和时间 */ rtc_set_date(&m_date); old_index = led_index; printf(rnrn); while(1) rtc_get_date(&m_date); old_index = led_index; printf(RTC TIME : %4x/%02x/%02x %s - %02x:%02x:%02xn,m_date.year,m_date.mon,m_date.day,dateam_date.week_day,m_date.hour,m_date.min,m_date.sec); /printf(/* 时钟数据为BCD码格式,以16进制显示 */bbbbbbbb%02x:%02x:%02x, m_date.hour, m_date.min, m_date.sec); ;实验三 基于ARM处理器的PWM实验一、实验代码及分析实验代码(1) 端口设置使用PWM控制蜂鸣器的工作/* 端口设置 */rGPBUP = rGPBUP & (0x1f) | 0x1f; /GPB4 0 rGPBCON = rGPBCON & (0x3ff) | 0x2aa; /Function Setting TCLK0, TOUT3 0 rGPGUP = rGPGUP & (0x800) | 0x800; /GPG11 rGPGCON = rGPGCON & (0xc00000) | 0xc00000; /TCLK1 rGPHUP = rGPHUP & (0x200) | 0x200; /GPH9 rGPHCON = rGPHCON & (0x318) | (0x218); /CLKOUT0 rMISCCR = rMISCCR & (0xf0) | 0x40; /Select PCLK with CLKOUT0(2) 编程改变输出的频率/* 输出脉冲:频率从4000HZ到14000HZ, 使用2/3的占空比*/for ( freq = 500; freq 14000; freq+=500 )div = (PCLK/256/4)/freq; rTCON=0x0; rTCNTB0= div; rTCMPB0= (2*div)/3;rTCON=0xa;/* 手工装载定时器的计数值*/ rTCON=0x9;/* 启动定时器,并周期模式触发*/ for( index = 0; index 800000; index+); rTCON=0x0;/* 延时并停止定时器*/(3) 编程改变输出的占空比for ( rate = 1; rate 100; rate += 5 ) rTCNTB0= div;rTCMPB0= (rate*div)/100;/* 修改占空比*/rTCON=0xa;/* 手工装载定时器的计数值*/ rTCON=0x9;/* 启动定时器,并周期触发*/ for( index = 0; index 800000; index+); rTCON=0x0; (4) 扩展编写程序对pwm控制器输出8000Hz, 2/3占空比的数据信号输出到蜂鸣器实验四 基于ARM处理器的系统时钟实验一、实验代码及分析实验代码(1) 与系统时钟相关的寄存器WTCONEQU0x53000000; 看门狗控制寄存器WTDATEQU0x53000004; 看门狗数据寄存器LOCKTIMEEQU 0x4c000000; 变频锁定时间寄存器MPLLCONEQU0x4c000004; MPLL寄存器CLKDIVNEQU0x4c000014; 分频比寄存器(2) 寄存器的相关设置值与系统时钟相关的寄存器设置,如表1所示。表1: 常用寄存器设置值(3) 系统时钟设置的代码clock_init ; 时钟初始化代码; 设置锁频时间 ldr r0, =LOCKTIME; 取得LOCKTIME寄存器地址 ldr r1, =0x00ffffff; LOCKTIME寄存器设置数据 str r1, r0; 将LOCKTIME设置数据写入LOCKTIME寄存器; 设置分频数 ldr r0, =CLKDIVN; 取得CLKDIVN寄存器地址 mov r1, #0x05; CLKDIVN寄存器设置数据 str r1, r0; 将CLKDIVN设置数据写入CLKDIVN寄存器 ; 修改CPU总线模式 mrc p15, 0, r1, c1, c0, 0 orr r1, r1, #0xc0000000 mcr p15, 0, r1, c1, c0, 0 ldr r0, =MPLLCON ;ldr r1, =0x5c011; MPLL is 400MHz ldr r1, =0xa1; MPLL is 400MHz ;str r1, r0 ;ldr r1,=(M_MDIV12)+(M_PDIV4)+M_SDIV) ;Fin=12MHz,Fout=50MHz ;str r1,r0mov pc, lr 根据表1设置 MPLLCON,观察LED灯的闪烁情况。(5) 扩展a) 以1Hz的频率控制LED灯闪烁实验5 ARM处理器的串口通信实验一、实验代码及分析实验代码(1) 串口控制器相关的寄存器/*UART registers*/#defineULCON0(*(volatile unsigned long *)0x50000000)#defineUCON0(*(volatile unsigned long *)0x50000004)#defineUFCON0 (*(volatile unsigned long *)0x50000008)#defineUMCON0(*(volatile unsigned long *)0x5000000c)#defineUTRSTAT0(*(volatile unsigned long *)0x50000010)#defineUTXH0 (*(volatile unsigned char *)0x50000020)#defineURXH0 (*(volatile unsigned char *)0x50000024)#defineUBRDIV0(*(volatile unsigned long *)0x50000028) (2) UART串口初始化 void uart_init( )GPHCON |= 0xa0;/GPH2,GPH3 used as TXD0,RXD0GPHUP = 0x0;/GPH2,GPH3内部上拉ULCON0 = 0x03;/8N1UCON0 = 0x05;/查询方式为轮询或中断;时钟选择为PCLKUFCON0 = 0x00;/不使用FIFOUMCON0 = 0x00;/不使用流控UBRDIV0 = 26;/波特率为57600,PCLK=12Mhz(3) UART串口的相关函数/* UART串口单个字符打印函数 */extern void putc(unsigned char c)while( ! (UTRSTAT0 & TXD0READY) );UTXH0 = c;/* UART串口接受单个字符函数 */extern unsigned char getc(void)while( ! (UTRSTAT0 & RXD0READY) );return URXH0;/* UART串口字符串打印函数 */extern int printk(const char* str)int i = 0;while( stri )putc( (unsigned char) stri+ );return i;(4) 数码管的闪烁void Seg7_Display(unsigned char i) *(U8*) 0x10000006) = 0x00;delay(10); *(U8*) 0x10000004) = seg7tablei & 0xf; (5) 根据用户的输入,控制不同LED灯的闪烁。while(1) delay(20); printk(请输入数码管要显示的数字:nr); input = getc(); delay(20); putc(input); printk(nr); Seg7_Display(input); 实验 6 ARM处理器的键盘输入和I/O通信实验一、实验代码及分析实验代码(1) 与外部中断相关的寄存器#define SRCPND (*(volatile unsigned long *)0x4A000000)#define INTMOD (*(volatile unsigned long *)0x4A000004)#define INTMSK (*(volatile unsigned long *)0x4A000008)#define PRIORITY(*(volatile unsigned long *)0x4A00000C)#define INTPND (*(volatile unsigned long *)0x4A000010)#define INTOFFSET(*(volatile unsigned long *)0x4A000014)#define SUBSRCPND(*(volatile unsigned long *)0x4A000018)#define INTSUBMSK (*(volatile unsigned long *)0x4A00001C)(2) 中断的初始化void irq_init()INTMSK &= (32);printk(中断初始化OKrn);(2) 中断处理函数void handle_irq()unsigned long irqOffSet = INTOFFSET;/ 取得中断号/all_led_on(); / 关闭全部Led灯/PAOMADENG = 0x0F;if (2 = irqOffSet)printk(外部中断2键被按下!rn);Led_Display(2);delay(100);else if(3 = irqOffSet)printk(外部中断3键被按下!rn);Led_Display(4);delay(100);SRCPND &= (1irqOffSet);/ 清除中断源INTPND = INTPND;/ 清除中断结果(3) Led_Display/*/ Function name: Led_Display/ Description : 显示LED灯/ Return type: void/ Argument : int data (1 - on, 0 - off)/ 3 2 1 0/ LED4 LED3 LED2 LED1*/unsigned char output_0x10000000 = 0xff;extern void Led_Display(int data)output_0x10000000 &= (0xf0);output_0x10000000 |= (data)设置-虚拟机设置 ,将网络适配器设置为自定义,并指定虚拟网络为VMnet0。2) 编辑-编辑虚拟网络-设置VMnet0为桥接方式,并且指定其桥接的网卡B、 Red Hat IP配置1) 开始-系统设置-网络,双击eth0配置IP信息如下:地址:20子网掩码:默认网关地址:DNS: 2) 点击激活C、 测试网络连接是否正常1) 打开网页2) Ping 二、 配置NFS服务器1) 设置:开始-系统设置-服务器设置-NFS服务器打开配置对话框 2) 添加NFS共享A、 设置目录 homejasonnfsB、 设置能够访问的主机设置为*, 表示任何主机都可以访问C、 基本权限设置读/写D、 重新启动nfs服务 /etc/init.d/nfs restartE、 测试连接是否正常 mount 20:/home/Jason/nfsboot /home/tmp三、 配置FTP服务器1) 修改配置文件: /etc/vsftpd/vsftpd.conf保证:local_enable=YES write_enable=yes打开2) 启动FTP服务器:/etc/init.d/vsftpd restart3) 为FTP服务器添加用户(可以通过为Linux添加用户实现)4) 测试:在Windows操作系统安装ftp客户端,与虚拟机Red Hat中的ftp服务相连,并传输文件四、 配置TFTP服务器1、 输入setup命令进入system services2、 具体见手册3、 Service xinet restart五、开发板与虚拟机文件传输测试 实验九 嵌入Linux基本应用程序开发一、TCP/IP概述A. TCP/IP的分层模型OSI协议参考模型,它是基于国际标准化组织(ISO)的建议发展起来的,它分为7个层次:应用层、表示层、会话层、传输层、网络层、数据链路层及物理层。这个7层的协议模型虽然规定得非常细致和完善,但在实际中却得不到广泛的应用,其重要的原因之一就在于它过于复杂。但它仍是此后很多协议模型的基础。与此相区别的TCP/IP协议模型将OSI的7层协议模型简化为4层,从而更有利于实现和使用。 TCP/IP的协议参考模型和OSI协议参考模型的对应关系如下图 :B. TCP/IP核心协议 三次握手 TCP是面向连接的,所谓面向连接,就是当计算机双方通信时必需先建立连接,然后进行数据通信,最后拆除连接三个过程。TCP在建立连接时又分三步走: 第一步(A-B):主机A向主机B发送一个包含SYN即同步(Synchronize)标志的TCP报文,SYN同步报文会指明客户端使用的端口以及TCP连接的初始序号; 第二步(B-A):主机B在收到客户端的SYN报文后,将返回一个SYN+ACK的报文,表示主机B的请求被接受,同时TCP序号被加一,ACK即确认(Acknowledgement)。 第三步(A-B):主机A也返回一个确认报文ACK给服务器端,同样TCP序列号被加一,到此一个TCP连接完成。 C. 套接字(socket)概述(1) 套接字类型 流式套接字(SOCK_STREAM)流式套接字提供可靠的、面向连接的通信流;它使用TCP协议,从而保证了数据传输的可靠性和顺序性。 数据报套接字(SOCK_DGRAM)数据报套接字定义了一种无可靠、面向无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证是可靠、无差错的。它使用数据报协议UDP 原始套接字(SOCK_RAW)原始套接字允许对底层协议如IP或ICMP进行直接访问,它功能强大但使用较为不便,主要用于一些协议的开发。(2) 地址及顺序处理地址结构处理struct sockaddr unsigned short sa_family; /*地址族*/ char sa_data14; /*14字节的协议地址,包含该socket的IP地址和端口号。*/;struct sockaddr_in short int sa_family; /*地址族*/ unsigned short int sin_port; /*端口号*/ struct in_addr sin_addr; /*IP地址*/ unsigned char sin_zero8; /*填充0 以保持与struct sockaddr同样大小*/;这两个数据类型是等效的,可以相互转化,通常sockaddr_in数据类型使用更为方便。在建立socketadd或sockaddr_in后,就可以对该socket进行适当的操作了。D. 套接字编程(1)函数说明 socket()创建套接字 bind()绑定本机端口 connect()建立连接 listen()监听端口 accept()接受连接 recv(), read(), recvfrom()数据接收 send(), write(), sendto()数据发送 close(), shutdown()关闭套接字(2)使用TCP时Socket编程(3)使用UDP时Socket编程二、实验代码分析1.分析下面代码完成的工作A服务器端代码/*server.c*/#include #include #include #include #include #include #include #include #define PORT4321#define BUFFER_SIZE1024#define MAX_QUE_CONN_NM5int main()struct sockaddr_in server_sockaddr,client_sockaddr;int sin_size,recvbytes;int sockfd, client_fd;char bufBUFFER_SIZE;/*建立socket连接*/if (sockfd = socket(AF_INET,SOCK_STREAM,0)= -1)perror(socket);exit(1);printf(Socket id = %dn,sockfd);/*设置sockaddr_in 结构体中相关参数*/server_sockaddr.sin_family = AF_INET;server_sockaddr.sin_port = htons(PORT);server_sockaddr.sin_addr.s_addr = INADDR_ANY;bzero(&(server_sockaddr.sin_zero), 8);int i = 1;/* 允许重复使用本地地址与套接字进行绑定 */setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i);/*绑定函数bind()*/if (bind(sockfd, (struct sockaddr *)&server_sockaddr, sizeof(struct sockaddr) = -1)perror(bind);exit(1);printf(Bind success!n);/*调用listen()函数,创建未处理请求的队列*/if (listen(sockfd, MAX_QUE_CONN_NM) = -1)perror(listen);exit(1);printf(Listening.n);/*调用accept()函数,等待客户端的连接*/if (client_fd = accept(sockfd, (struct sockaddr *)&client_sockaddr, &sin_size) = -1)perror(accept);exit(1);/*调用recv()函数接收客户端的请求*/memset(buf , 0, sizeof(buf);if (recvbytes = recv(client_fd, buf, BUFFER_SIZE, 0) = -1)perror(recv);exit(1);printf(Received a message: %sn, buf);close(sockfd);return 0;B客户端代码/*client.c*/#include #include #include #include #include #include #include #include #define PORT4321#define BUFFER_SIZE 1024int main(int argc, char *argv)int sockfd,sendbytes;char bufBUFFER_SIZE;struct hostent *host;struct sockaddr_in serv_addr;if(argc h_addr);bzero(&(serv_addr.sin_zero), 8);/*调用connect函数主动发起对服务器端的连接*/if(connect(sockfd,(struct sockaddr *)&serv_addr, sizeof(struct sockaddr)= -1)perror(connect);exit(1);/*发送消息给服务器端*/if (sendbytes = send(sockfd, buf, strlen(buf), 0) = -1)perror(send);exit(1);close(sockfd);exit(0);实验十 嵌入式Linux驱动程序开发一、基础内容#define MAJOR_NUM 100 /主设备号/* Set the message of the device driver */#define IOCTL_SET_MSG _IOR(MAJOR_NUM, 0, int*) /* Get the message of the device driver */#define IOCTL_GET_MSG _IOR(MAJOR_NUM, 1, int*)二、数码管的控制程序/add code/*/*文件名称: LEDSEG7.C */*实验现象: 数码管依次显示出0、1,2、9、a、b、C、d、E、F */*/#define U8 unsigned charunsigned char seg7table16 = /* 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(int test) int i; /request regin unsigned long x10000006 = (unsigned long)ioremap(0x10000006, 32); unsigned long x10000004 = (unsigned long)ioremap(0x10000004, 32);/*(U8*) 0x10000006) = 0x00; writeb(0x00, x10000006); /* 数码管从0到F依次将字符显示出来 */ for(i=0;i=0x0;i-) /* 查表并输出数据 */ / *(U8*) 0x10000004) = seg7tablei; writeb(seg7tablei,x10000004); Delay (10000000); iounmap(void *)x10000006); iounmap(void *)x10000004); /*/* Function name : 循环延时子程序 */* Description : 循环 time 次 */* Return type :void */* Argument : 循环延时计数器 */*/void Delay(int time) int i;int delayLoopCount=1000; for(;time0;time-);for(i=0;idelayLo

温馨提示

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

评论

0/150

提交评论