arm_实验c语言代码.doc_第1页
arm_实验c语言代码.doc_第2页
arm_实验c语言代码.doc_第3页
arm_实验c语言代码.doc_第4页
arm_实验c语言代码.doc_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

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

文档简介

2.8_C语言程序实验#define uint8 unsigned char #define uint32 unsigned int#define N100uint32 sum;/ 使用加法运算来计算1+2+3+.+(N-1)+N的值。(N0)void Main(void) uint32 i; sum = 0; for(i=0; i0; dly-) for(i=0; i5000; i+); /* 名 称:main()* 功 能:控制蜂鸣器蜂鸣。*/int main(void) PINSEL0 = 0x00000000; / 设置管脚连接GPIO IO0DIR = BEEPCON; / 设置I/O为输出 while(1) IO0SET = BEEPCON; / BEEPCON = 1 DelayNS(15); IO0CLR = BEEPCON; / BEEPCON = 0 DelayNS(15); return(0);2.11_GPIO输出控制实验2/ /* 文 件 名:main.c* 功 能:LED显示控制。* 通过GPIO直接控制8个LED产生流水灯效果* 说 明:将跳线JP23全部短接,JP15跳线全部断开。* 这个警告可忽略,C2892E: signed constant overflow*/#include config.h#define LED1 116 / P2.16 #define LED2 117/ P2.17 #define LED3 118/ P2.18 #define LED4 119/ P2.19 #define LED5 120 / P2.20 #define LED6 121/ P2.21 #define LED7 122/ P2.22 #define LED8 10; dly-) for(i=0; i5000; i+); /* 名 称:main()* 功 能:根据表DISP_TAB来控制LED显示。*/int main(void) uint8 i; /* PINSEL2使用启动代码的默认配置,切勿任意配置PINSEL2,否则总线会受到干扰 */ IO2DIR = LEDCON; / 配置LED控制I/O方向 while(1) for(i=0; i8; i+) IO2CLR = DISP_TABi; / 输出LED显示数据 DelayNS(10); / 延时 IO2SET = 0xffffffff; return(0); 2.12_GPIO输入实验* 文 件 名:main.c* 功 能:读取I/O引脚值,并输出控制蜂鸣器。* 使用I/O口输入方式对P0.20口进行扫描,对蜂鸣器控制。* 说 明:将跳线器JP9、JP22短接,JP20断开。按下KEY1观察BUZZER效果。*/#include config.h#define BEEPCON17 / P0.7引脚控制B1,低电平蜂鸣#define KEY 120 / 定义按键/* 名 称:main()* 功 能:读取P0.20口的值,并输出控制蜂鸣器B1。*/int main(void) uint32 i; PINSEL0 = 0x00000000; / 设置管脚连接GPIO IO0DIR = BEEPCON; / 设置B1控制口为输出,其它I/O为输入 while(1) if( (IO0PIN&KEY)!=0 ) IO0SET = BEEPCON; else IO0CLR = BEEPCON; for(i=0; i1000; i+); return(0); 2.13_存储器重映射实验/* 文 件 名:main.c* 功 能:将存储器重映射到片内RAM(0x400000000x4000003F),然后更改* 0x400000000x4000003F的内容。* 说 明:观察0x000000000x0000003F地址上的数据有何变化*/#include config.h#define VECTOR_RAM (unsigned char *) 0x40000000)/* 名 称:main()* 功 能:存储器重映射。*/int main(void) uint8 i; uint8 *addr; MEMMAP = 0x02;/ 中断向量从静态RAM重映射(用户RAM模式) addr = VECTOR_RAM; for(i=0; i64; i+)/ 用0x55填充0x400000000x4000003F *addr = 0x55; addr+; addr = VECTOR_RAM; for(i=0; i64; i+)/ 用0xAA填充0x400000000x4000003F *addr = 0xAA; addr+; MEMMAP = 0x00;/ 中断向量从Boot Block重映射(Boot装载程序模式) while(1); return(0); 2.14_外部中断实验1/* 文 件 名:main.c* 功 能:使用外部中断3进行B1的控制,每当有一次中断时,即取反B1控制口,* 使用非向量中断方式。* 说 明:将跳线器JP9、JP22短接,JP20断开。按下KEY1观察BUZZER效果。*/#include config.h#define BEEPCON17 / P0.7引脚控制B1,低电平蜂鸣,17 等价于 0x80/* 名 称:IRQ_Eint3()* 功 能:外部中断EINT3服务函数,取反B1控制口。* 入口参数:无* 出口参数:无PINSEL0 是选择引脚功能IO0DIR 是选择引脚 做 输入 还是做 输出功能IO0SET 是让引脚输出1IO0CLR 是让引脚输出0*/void _irq IRQ_Eint3(void) uint32 i; i = IO0SET; / 读取当前B1控制值 if( (i&BEEPCON)=0 ) / 控制B1输出取反 IO0SET = BEEPCON; else IO0CLR = BEEPCON; /* 等待外部中断信号恢复为高电平(若信号保持为低电平,中断标志会一直置位) */ while( (EXTINT&13)!=0 ) EXTINT = 13; / 清除EINT3中断标志,13 等价于 0x08 VICVectAddr = 0; / 向量中断结束/* 名 称:main()* 功 能:初始化外部中断3(EINT3)为非向量中断,并设置为电平触发模式,然后等待外部中断。* 说 明:在STARTUP.S文件中使能IRQ中断(清零CPSR中的I位)。*/int main(void) IRQEnable(); / 开IRQ中断 PINSEL1 = 38; / 设置管脚连接,P0.20设置为EINT3 IO0DIR = BEEPCON; / 设置B1控制口为输出,其它I/O为输入 /* 打开EINT3中断(使用非向量IRQ) */ VICIntSelect = 0x00000000; / 设置所有中断分配为IRQ中断 VICDefVectAddr = (int)IRQ_Eint3; / 设置中断服务程序地址 EXTMODE = 0x00; / 设置EINT3中断为电平触发模式 EXTINT = 13; / 清除EINT3中断标志 1000 VICIntEnable = 117; / 使能EINT3中断,EINT3在Bit17上 while(1);/ 等待中断 return(0); 2.15_外部存储器接口实验1 /* 文 件 名:main.c* 功 能:对SST39VF160进行全片擦除,然后写两字节数据到芯片0地址,再读出来校验,* 若校验通过则蜂鸣器响一声,否则不断地蜂鸣报警。* 说 明:无。*/#include config.h#define BEEPCON 17/ P0.7引脚控制B1,低电平蜂鸣#define FLASH_ADDR0x80000000 / FLASH的起始地址(分配为Bank1块)/* 转换地址。将要发送给SST39VF160的地址值进行转换,以便于LPC2210输出。*/* 由于SST39VF160的A0是与LPC2210的A1相连,所以addr要左移1位。 */#define GetAddr(addr)(volatile uint16 *)(FLASH_ADDR|(addr0; dly-) for(i=0; i5000; i+); /* 名 称:WordProgram()* 功 能:半字(16位)数据编程。* 入口参数:Addr编程地址(SST39VF160内部地址)* Data编程数据* 出口参数:返回TRUE表示操作成功,返回FALSE表示操作失败*/uint8 WordProgram(uint32 Addr, uint16 Data) volatile uint16 *ip; uint16 temp1,temp2; ip = GetAddr(0x5555);/ 转换地址0x5555 ip0 = 0xaaaa;/ 第一个写周期,地址0x5555,数据0xAA ip = GetAddr(0x2aaa); ip0 = 0x5555;/ 第二个写周期,地址0x2aaa,数据0x55 ip = GetAddr(0x5555); ip0 = 0xa0a0;/ 第三个写周期,地址0x5555,数据0xA0 ip = (volatile uint16 *)(FLASH_ADDR|(Addr&0x1FFFFF); *ip = Data;/ 第四个写周期,地址Addr,数据Data while (1)/ 等待操作完成 (若编程操作没有完成,每次读操作DQ6会跳变) temp1 = *ip; temp2 = *ip; if (temp1 = temp2) if (temp1 != Data) return(FALSE); else return(TRUE); return(TRUE);/* 名 称:ChipErase()* 功 能:芯片全片擦除。* 入口参数:无* 出口参数:返回TRUE表示操作成功,返回FALSE表示操作失败*/uint8 ChipErase(void) volatile uint16 *ip; uint16 temp1,temp2; ip = GetAddr(0x5555); ip0 = 0xaaaa;/ 第一个写周期,地址0x5555,数据0xAA ip = GetAddr(0x2aaa); ip0 = 0x5555;/ 第二个写周期,地址0x2aaa,数据0x55 ip = GetAddr(0x5555); ip0 = 0x8080;/ 第三个写周期,地址0x5555,数据0x80 ip = GetAddr(0x5555); ip0 = 0xaaaa;/ 第四个写周期,地址0x5555,数据0xAA ip = GetAddr(0x2aaa); ip0 = 0x5555;/ 第五个写周期,地址0x2aaa,数据0x55 ip = GetAddr(0x5555); ip0 = 0x1010;/ 第六个写周期,地址0x5555,数据0x10 while (1)/ 等待操作完成 (若擦除操作没有完成,每次读操作DQ6会跳变) temp1 = *ip; temp2 = *ip; if (temp1 = temp2) if (temp1 != 0xffff) return(FALSE); else return(TRUE); return(TRUE);/* 名 称:main()* 功 能:SST39VF160擦除、编程操作。*/int main(void) uint8 i; uint8 err = 0; volatile uint16 *addr; PINSEL0 = 0x00000000; / 设置管脚连接GPIO IO0DIR = BEEPCON; / 设置I/O为输出 ChipErase();/ FLASH全片擦除 / 校验是否真正擦除。若发现有非0xFFFF的存储单元,设置err=1 addr = (volatile uint16 *)FLASH_ADDR + 0; for(i=0; i100; i+) if(0xFFFF != (*addr) err = 1; addr+; WordProgram(0x0, 0x55AA);/ 向FLASH的0地址写入0x55AA addr = (volatile uint16 *)FLASH_ADDR + 0; if(0x55AA != (*addr) err = 1;/ 读出校验,若数据错误则设置err=1 if(0=err) IO0CLR = BEEPCON;/ BEEPCON = 0 DelayNS(20); IO0SET = BEEPCON;/ BEEPCON = 1 DelayNS(20); else while(1) IO0CLR = BEEPCON;/ BEEPCON = 0 DelayNS(10); IO0SET = BEEPCON;/ BEEPCON = 1 DelayNS(10); while(1); return(0); 2.16_定时器实验1/* 文 件 名:main.c* 功 能:使用定时器0实现1秒定时,控制蜂鸣器蜂鸣。(查询方式)* 说 明:JP22跳线短接,JP20跳线断开。*/#include config.h#define BEEPCON 10; dly-) for(i=0; i5000; i+); /* 名 称:UART0_Ini()* 功 能:初始化串口0。设置为8位数据位,1位停止位,无奇偶校验,波特率为115200* 入口参数:无* 出口参数:无*/void UART0_Init(void) uint16 Fdiv; U0LCR = 0x83;/ DLAB = 1,可设置波特率 Fdiv = (Fpclk / 16) / UART_BPS;/ 设置波特率 U0DLM = Fdiv / 256; U0DLL = Fdiv % 256; U0LCR = 0x03;/* 名 称:UART0_SendByte()* 功 能:向串口发送字节数据,并等待发送完毕。* 入口参数:data要发送的数据* 出口参数:无*/void UART0_SendByte(uint8 data) U0THR = data; / 发送数据 while( (U0LSR&0x40)=0 ); / 等待数据发送完毕/* 名 称:UART0_SendStr()* 功 能:向串口发送一字符串* 入口参数:srt要发送的字符串的指针* 出口参数:无*/void UART0_SendStr(uint8 const *str) while(1) if( *str = 0 ) break; UART0_SendByte(*str+); / 发送数据 /* 名 称:main()* 功 能:向串口UART0发送字符串Hello World!*/int main(void) PINSEL0 = 0x00000005; / 设置I/O连接到UART0 UART0_Init(); while(1) UART0_SendStr(SEND_STRING); DelayNS(10); return(0); 2.18_I2C接口实验1/* 文 件 名:main.c* 功 能:使用硬件I2C对E2PROM进行操作,利用中断方式操作。* 说 明:将跳线器JP22短接,JP20断开。*/#include config.h #define CAT1025 0xA0 / 定义器件地址#define BEEPCON1400000) fi2c = 400000; PINSEL0 = (PINSEL0&0xFFFFFF0F) | 0x50; / 设置I2C控制口有效 I2SCLH = (Fpclk/fi2c + 1) / 2;/ 设置I2C时钟为fi2c I2SCLL = (Fpclk/fi2c) / 2; I2CONCLR = 0x2C; I2CONSET = 0x40;/ 使能主I2C /* 设置I2C中断允许 */ VICIntSelect = 0x00000000;/ 设置所有通道为IRQ中断 VICVectCntl0 = 0x29;/ I2C通道分配到IRQ slot 0,即优先级最高 VICVectAddr0 = (int)IRQ_I2C; / 设置I2C中断向量地址 VICIntEnable = 0x0200; / 使能I2C中断 /* 名 称:DelayNS()* 功 能:长软件延时* 入口参数:dly延时参数,值越大,延时越久* 出口参数:无*/void DelayNS(uint32 dly) uint32 i; for(; dly0; dly-) for(i=0; i50000; i+); /* 名 称:WrEepromErr()* 功 能:读写EEPRM出错蜂鸣报警。* 入口参数:无* 出口参数:无*/void WrEepromErr(void) while(1) IO0SET = BEEPCON; DelayNS(2); IO0CLR = BEEPCON; DelayNS(2); /* 名 称:main()* 功 能:向E2PROM写入10字节数据,然后读出判断是否正确写入。* 说 明:在CONF

温馨提示

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

评论

0/150

提交评论