收藏 分销(赏)

arm_实验c语言代码.doc

上传人:xrp****65 文档编号:8970936 上传时间:2025-03-09 格式:DOC 页数:41 大小:181KB
下载 相关 举报
arm_实验c语言代码.doc_第1页
第1页 / 共41页
arm_实验c语言代码.doc_第2页
第2页 / 共41页
点击查看更多>>
资源描述
2.8_C语言程序实验 #define uint8 unsigned char #define uint32 unsigned int #define N 100 uint32 sum; // 使用加法运算来计算1+2+3+...+(N-1)+N的值。(N>0) void Main(void) { uint32 i; sum = 0; for(i=0; i<=N; i++) { sum += i; } while(1); } 2.9_C语言调用汇编程序实验 #define uint8 unsigned char #define uint32 unsigned int extern uint32 Add(uint32 x, uint32 y); uint32 sum; // 调用汇编程序Add实现加法运算 void Main(void) { sum = Add(555, 168); while(1); } 2.10_GPIO输出控制实验1 /**************************************************************************** * 文件名:main.c * 功 能:蜂鸣器控制。对蜂鸣器B1进行控制,采用软件延时方法。 * 使用I/O口直接控制,采用灌电流方式。 * 说 明:将跳线器JP22短接,JP20断开。 ****************************************************************************/ #include "config.h" #define BEEPCON 0x00000080 // P0.7引脚控制B1,低电平蜂鸣 /**************************************************************************** * 名 称:DelayNS() * 功 能:长软件延时。 * 入口参数:dly 延时参数,值越大,延时越久 * 出口参数:无 ****************************************************************************/ void DelayNS(uint32 dly) { uint32 i; for(; dly>0; dly--) { for(i=0; i<5000; 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 1<<16 // P2.16 #define LED2 1<<17 // P2.17 #define LED3 1<<18 // P2.18 #define LED4 1<<19 // P2.19 #define LED5 1<<20 // P2.20 #define LED6 1<<21 // P2.21 #define LED7 1<<22 // P2.22 #define LED8 1<<23 // P2.23 #define LEDCON 0x00ff0000 const uint32 DISP_TAB[8] = { 0xff01ffff, 0xff02ffff, 0xff04ffff, 0xff08ffff, 0xff10ffff, 0xff20ffff, 0xff40ffff, 0xff80ffff}; /**************************************************************************** * 名 称:DelayNS() * 功 能:长软件延时 * 入口参数:dly 延时参数,值越大,延时越久 * 出口参数:无 ****************************************************************************/ void DelayNS(uint32 dly) { uint32 i; for(; dly>0; dly--) { for(i=0; i<5000; i++); } } /**************************************************************************** * 名 称:main() * 功 能:根据表DISP_TAB来控制LED显示。 ****************************************************************************/ int main(void) { uint8 i; /* PINSEL2使用启动代码的默认配置,切勿任意配置PINSEL2,否则总线会受到干扰 */ IO2DIR = LEDCON; // 配置LED控制I/O方向 while(1) { for(i=0; i<8; i++) { IO2CLR = DISP_TAB[i]; // 输出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 BEEPCON 1<<7 // P0.7引脚控制B1,低电平蜂鸣 #define KEY 1<<20 // 定义按键 /**************************************************************************** * 名 称: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; i<1000; i++); } return(0); } 2.13_存储器重映射实验/**************************************************************************** * 文 件 名:main.c * 功 能:将存储器重映射到片内RAM(0x40000000~0x4000003F),然后更改 * 0x40000000~0x4000003F的内容。 * 说 明:观察0x00000000~0x0000003F地址上的数据有何变化 ****************************************************************************/ #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; i<64; i++) // 用0x55填充0x40000000~0x4000003F { *addr = 0x55; addr++; } addr = VECTOR_RAM; for(i=0; i<64; i++) // 用0xAA填充0x40000000~0x4000003F { *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 BEEPCON 1<<7 // P0.7引脚控制B1,低电平蜂鸣,1<<7 等价于 0x80 /**************************************************************************** * 名 称:IRQ_Eint3() * 功 能:外部中断EINT3服务函数,取反B1控制口。 * 入口参数:无 * 出口参数:无 PINSEL0 是选择引脚功能 IO0DIR 是选择引脚 做 输入 还是做 输出功能 IO0SET 是让引脚输出1 IO0CLR 是让引脚输出0 ****************************************************************************/ void __irq IRQ_Eint3(void) { uint32 i; i = IO0SET; // 读取当前B1控制值 if( (i&BEEPCON)==0 ) // 控制B1输出取反 { IO0SET = BEEPCON; } else { IO0CLR = BEEPCON; } /* 等待外部中断信号恢复为高电平(若信号保持为低电平,中断标志会一直置位) */ while( (EXTINT&1<<3)!=0 ) { EXTINT = 1<<3; // 清除EINT3中断标志,1<<3 等价于 0x08 } VICVectAddr = 0; // 向量中断结束 } /**************************************************************************** * 名 称:main() * 功 能:初始化外部中断3(EINT3)为非向量中断,并设置为电平触发模式,然后等待外部中断。 * 说 明:在STARTUP.S文件中使能IRQ中断(清零CPSR中的I位)。 ****************************************************************************/ int main(void) { IRQEnable(); // 开IRQ中断 PINSEL1 = 3<<8; // 设置管脚连接,P0.20设置为EINT3 IO0DIR = BEEPCON; // 设置B1控制口为输出,其它I/O为输入 /* 打开EINT3中断(使用非向量IRQ) */ VICIntSelect = 0x00000000; // 设置所有中断分配为IRQ中断 VICDefVectAddr = (int)IRQ_Eint3; // 设置中断服务程序地址 EXTMODE = 0x00; // 设置EINT3中断为电平触发模式 EXTINT = 1<<3; // 清除EINT3中断标志 1000 VICIntEnable = 1<<17; // 使能EINT3中断,EINT3在Bit17上 while(1); // 等待中断 return(0); } 2.15_外部存储器接口实验1 /**************************************************************************** * 文 件 名:main.c * 功 能:对SST39VF160进行全片擦除,然后写两字节数据到芯片0地址,再读出来校验, * 若校验通过则蜂鸣器响一声,否则不断地蜂鸣报警。 * 说 明:无。 ****************************************************************************/ #include "config.h" #define BEEPCON 1<<7 // P0.7引脚控制B1,低电平蜂鸣 #define FLASH_ADDR 0x80000000 // FLASH的起始地址(分配为Bank1块) /* 转换地址。将要发送给SST39VF160的地址值进行转换,以便于LPC2210输出。*/ /* 由于SST39VF160的A0是与LPC2210的A1相连,所以addr要左移1位。 */ #define GetAddr(addr) (volatile uint16 *)(FLASH_ADDR|(addr<<1)) /**************************************************************************** * 名 称:DelayNS() * 功 能:长软件延时。 * 入口参数:dly 延时参数,值越大,延时越久 * 出口参数:无 ****************************************************************************/ void DelayNS(uint32 dly) { uint32 i; for(; dly>0; dly--) { for(i=0; i<5000; i++); } } /**************************************************************************** * 名 称:WordProgram() * 功 能:半字(16位)数据编程。 * 入口参数:Addr 编程地址(SST39VF160内部地址) * Data 编程数据 * 出口参数:返回TRUE表示操作成功,返回FALSE表示操作失败 ****************************************************************************/ uint8 WordProgram(uint32 Addr, uint16 Data) { volatile uint16 *ip; uint16 temp1,temp2; ip = GetAddr(0x5555); // 转换地址0x5555 ip[0] = 0xaaaa; // 第一个写周期,地址0x5555,数据0xAA ip = GetAddr(0x2aaa); ip[0] = 0x5555; // 第二个写周期,地址0x2aaa,数据0x55 ip = GetAddr(0x5555); ip[0] = 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); ip[0] = 0xaaaa; // 第一个写周期,地址0x5555,数据0xAA ip = GetAddr(0x2aaa); ip[0] = 0x5555; // 第二个写周期,地址0x2aaa,数据0x55 ip = GetAddr(0x5555); ip[0] = 0x8080; // 第三个写周期,地址0x5555,数据0x80 ip = GetAddr(0x5555); ip[0] = 0xaaaa; // 第四个写周期,地址0x5555,数据0xAA ip = GetAddr(0x2aaa); ip[0] = 0x5555; // 第五个写周期,地址0x2aaa,数据0x55 ip = GetAddr(0x5555); ip[0] = 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; i<100; 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 1<<7 // P0.7引脚控制B1,低电平蜂鸣 /**************************************************************************** * 名 称:Time0Init() * 功 能:初始化定时器0,定时时间为1S。 * 入口参数:无 * 出口参数:无 ****************************************************************************/ void Time0Init(void) { /* Fcclk = Fosc*4 = 11.0592MHz*4 = 44.2368MHz Fpclk = Fcclk/4 = 44.2368MHz/4 = 11.0592MHz */ T0PR = 99; // 设置定时器0分频为100分频,得110592Hz T0MCR = 0x03; // 匹配通道0匹配中断并复位T0TC T0MR0 = 110592; // 比较值(1S定时值) T0TCR = 0x03; // 启动并复位T0TC T0TCR = 0x01; } /**************************************************************************** * 名 称:main() * 功 能:初始化I/O及定时器,然后不断的查询定时器中断标志。当定时时间到达时,取反BEEPCON * 控制口。 ****************************************************************************/ int main(void) { PINSEL0 = 0x00000000; // 设置管脚连接GPIO IO0DIR = BEEPCON; // 设置I/O为输出 Time0Init(); // 初始化定时器0 while(1) { while( (T0IR&0x01) == 0 ); // 等待定时时间到 T0IR = 0x01; // 清除中断标志 if( (IO0SET&BEEPCON) == 0 ) { IO0SET = BEEPCON; } else { IO0CLR = BEEPCON; } } return(0); } 2.17_UART实验1 /**************************************************************************** * 文 件 名:main.c * 功 能:向串口发送数据。 * 说 明:使用外部11.0592MHz晶振,根据CONFIG.H文件配置,Fpclk=11.0592MHz; * 通讯波特率115200,8位数据位,1位停止位,无奇偶校验。 ****************************************************************************/ #include "config.h" #define UART_BPS 115200 // 定义通讯波特率 uint8 const SEND_STRING[] = "Hello World!\r\n"; /**************************************************************************** * 名 称:DelayNS() * 功 能:长软件延时 * 入口参数:dly 延时参数,值越大,延时越久 * 出口参数:无 ****************************************************************************/ void DelayNS(uint32 dly) { uint32 i; for(; dly>0; dly--) { for(i=0; i<5000; i++); } } /**************************************************************************** * 名 称:UART0_Ini() * 功 能:初始化串口0。设置为8位数据位,1位停止位,无奇偶校验,波特率为115200 * 入口参数:无 * 出口参数:无 ****************************************************************************/ void UART0_Init(void) { uint16 Fdiv; U0LCR = 0x83; // DLAB = 1,可设置波特率 Fdiv = (Fpclk / 16) /
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 通信科技 > 开发语言

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服