arm实验c语言代码Word文件下载.docx
《arm实验c语言代码Word文件下载.docx》由会员分享,可在线阅读,更多相关《arm实验c语言代码Word文件下载.docx(70页珍藏版)》请在冰点文库上搜索。
2.10_GPIO输出控制实验1
/****************************************************************************
*文件名:
main.c
*功能:
蜂鸣器控制。
对蜂鸣器B1进行控制,采用软件延时方法。
*使用I/O口直接控制,采用灌电流方式。
*说明:
将跳线器JP22短接,JP20断开。
****************************************************************************/
#include"
config.h"
#defineBEEPCON0x00000080//P0.7引脚控制B1,低电平蜂鸣
*名称:
DelayNS()
长软件延时。
*入口参数:
dly延时参数,值越大,延时越久
*出口参数:
无
voidDelayNS(uint32dly)
for(;
dly>
0;
dly--)
{
5000;
i++);
main()
控制蜂鸣器蜂鸣。
intmain(void)
{
PINSEL0=0x00000000;
//设置管脚连接GPIO
IO0DIR=BEEPCON;
//设置I/O为输出
while
(1)
{
IO0SET=BEEPCON;
//BEEPCON=1
DelayNS(15);
IO0CLR=BEEPCON;
//BEEPCON=0
return(0);
2.11_GPIO输出控制实验2
//****************************************************************************
*文件名:
LED显示控制。
*通过GPIO直接控制8个LED产生流水灯效果
将跳线JP23全部短接,JP15跳线全部断开。
*这个警告可忽略,C2892E:
signedconstantoverflow
#defineLED11<
<
16//P2.16
#defineLED21<
17//P2.17
#defineLED31<
18//P2.18
#defineLED41<
19//P2.19
#defineLED51<
20//P2.20
#defineLED61<
21//P2.21
#defineLED71<
22//P2.22
#defineLED81<
23//P2.23
#defineLEDCON0x00ff0000
constuint32DISP_TAB[8]={0xff01ffff,0xff02ffff,0xff04ffff,0xff08ffff,
0xff10ffff,0xff20ffff,0xff40ffff,0xff80ffff};
长软件延时
根据表DISP_TAB来控制LED显示。
{uint8i;
/*PINSEL2使用启动代码的默认配置,切勿任意配置PINSEL2,否则总线会受到干扰*/
IO2DIR=LEDCON;
//配置LED控制I/O方向
8;
IO2CLR=DISP_TAB[i];
//输出LED显示数据
DelayNS(10);
//延时
IO2SET=0xffffffff;
}
}
2.12_GPIO输入实验
****************************************************************************
读取I/O引脚值,并输出控制蜂鸣器。
*使用I/O口输入方式对P0.20口进行扫描,对蜂鸣器控制。
将跳线器JP9、JP22短接,JP20断开。
按下KEY1观察BUZZER效果。
#defineBEEPCON1<
7//P0.7引脚控制B1,低电平蜂鸣
#defineKEY1<
20//定义按键
读取P0.20口的值,并输出控制蜂鸣器B1。
//设置管脚连接GPIO
//设置B1控制口为输出,其它I/O为输入
if((IO0PIN&
KEY)!
=0)
else
1000;
2.13_存储器重映射实验/****************************************************************************
将存储器重映射到片内RAM(0x40000000~0x4000003F),然后更改
*0x40000000~0x4000003F的内容。
观察0x00000000~0x0000003F地址上的数据有何变化
#defineVECTOR_RAM((unsignedchar*)0x40000000)
存储器重映射。
uint8*addr;
MEMMAP=0x02;
//中断向量从静态RAM重映射(用户RAM模式)
addr=VECTOR_RAM;
64;
i++)//用0x55填充0x40000000~0x4000003F
*addr=0x55;
addr++;
i++)//用0xAA填充0x40000000~0x4000003F
*addr=0xAA;
MEMMAP=0x00;
//中断向量从BootBlock重映射(Boot装载程序模式)
2.14_外部中断实验1/****************************************************************************
使用外部中断3进行B1的控制,每当有一次中断时,即取反B1控制口,
*使用非向量中断方式。
7//P0.7引脚控制B1,低电平蜂鸣,1<
7等价于0x80
IRQ_Eint3()
外部中断EINT3服务函数,取反B1控制口。
PINSEL0是选择引脚功能
IO0DIR是选择引脚做输入还是做输出功能
IO0SET是让引脚输出1
IO0CLR是让引脚输出0
void__irqIRQ_Eint3(void)
i=IO0SET;
//读取当前B1控制值
if((i&
BEEPCON)==0)//控制B1输出取反
else
/*等待外部中断信号恢复为高电平(若信号保持为低电平,中断标志会一直置位)*/
while((EXTINT&
1<
3)!
EXTINT=1<
3;
//清除EINT3中断标志,1<
3等价于0x08
VICVectAddr=0;
//向量中断结束
}
初始化外部中断3(EINT3)为非向量中断,并设置为电平触发模式,然后等待外部中断。
在STARTUP.S文件中使能IRQ中断(清零CPSR中的I位)。
IRQEnable();
//开IRQ中断
PINSEL1=3<
//设置管脚连接,P0.20设置为EINT3
/*打开EINT3中断(使用非向量IRQ)*/
VICIntSelect=0x00000000;
//设置所有中断分配为IRQ中断
VICDefVectAddr=(int)IRQ_Eint3;
//设置中断服务程序地址
EXTMODE=0x00;
//设置EINT3中断为电平触发模式
//清除EINT3中断标志1000
VICIntEnable=1<
17;
//使能EINT3中断,EINT3在Bit17上
//等待中断
2.15_外部存储器接口实验1
/****************************************************************************
对SST39VF160进行全片擦除,然后写两字节数据到芯片0地址,再读出来校验,
*若校验通过则蜂鸣器响一声,否则不断地蜂鸣报警。
无。
7//P0.7引脚控制B1,低电平蜂鸣
#defineFLASH_ADDR0x80000000//FLASH的起始地址(分配为Bank1块)
/*转换地址。
将要发送给SST39VF160的地址值进行转换,以便于LPC2210输出。
*/
/*由于SST39VF160的A0是与LPC2210的A1相连,所以addr要左移1位。
*/
#defineGetAddr(addr)(volatileuint16*)(FLASH_ADDR|(addr<
1))
WordProgram()
半字(16位)数据编程。
Addr编程地址(SST39VF160内部地址)
*Data编程数据
返回TRUE表示操作成功,返回FALSE表示操作失败
uint8WordProgram(uint32Addr,uint16Data)
{volatileuint16*ip;
uint16temp1,temp2;
ip=GetAddr(0x5555);
//转换地址0x5555
ip[0]=0xaaaa;
//第一个写周期,地址0x5555,数据0xAA
ip=GetAddr(0x2aaa);
ip[0]=0x5555;
//第二个写周期,地址0x2aaa,数据0x55
ip[0]=0xa0a0;
//第三个写周期,地址0x5555,数据0xA0
ip=(volatileuint16*)(FLASH_ADDR|(Addr&
0x1FFFFF));
*ip=Data;
//第四个写周期,地址Addr,数据Data
while
(1)//等待操作完成(若编程操作没有完成,每次读操作DQ6会跳变)
temp1=*ip;
temp2=*ip;
if(temp1==temp2)
if(temp1!
=Data)
return(FALSE);
return(TRUE);
ChipErase()
芯片全片擦除。
uint8ChipErase(void)
volatileuint16*ip;
ip[0]=0x8080;
//第三个写周期,地址0x5555,数据0x80
//第四个写周期,地址0x5555,数据0xAA
//第五个写周期,地址0x2aaa,数据0x55
ip[0]=0x1010;
//第六个写周期,地址0x5555,数据0x10
while
(1)//等待操作完成(若擦除操作没有完成,每次读操作DQ6会跳变)
=0xffff)
SST39VF160擦除、编程操作。
uint8err=0;
volatileuint16*addr;
//设置管脚连接GPIO
//设置I/O为输出
ChipErase();
//FLASH全片擦除
//校验是否真正擦除。
若发现有非0xFFFF的存储单元,设置err=1
addr=(volatileuint16*)FLASH_ADDR+0;
100;
i++)
if(0xFFFF!
=(*addr))err=1;
WordProgram(0x0,0x55AA);
//向FLASH的0地址写入0x55AA