ARM实验程序.docx
- 文档编号:14392860
- 上传时间:2023-06-23
- 格式:DOCX
- 页数:21
- 大小:20.83KB
ARM实验程序.docx
《ARM实验程序.docx》由会员分享,可在线阅读,更多相关《ARM实验程序.docx(21页珍藏版)》请在冰点文库上搜索。
ARM实验程序
1/****************************************************************************
*文件名:
LEDDISP.C
*功能:
LED显示控制。
*通过I/O模拟同步串口与74HC595进行连接,控制74HC595驱动LED显示。
*说明:
将跳线器JP8短接。
****************************************************************************/
#include"config.h"
#defineSPI_CS0x00000100/*P0.8*/
#defineSPI_DATA0x00000040/*P0.6*/
#defineSPI_CLK0x00000010/*P0.4*/
#defineSPI_IOCON0x00000150/*定义SPI接口的I/O设置字*/
voidDelayNS(uint32dly)
{uint32i;
for(;dly>0;dly--)
for(i=0;i<5000;i++);
}
*说明:
发送数据时,高位先发送。
voidHC595_SendDat(uint8dat)
{uint8i;
IO0CLR=SPI_CS;//SPI_CS=0
for(i=0;i<8;i++)//发送8位数据
{IO0CLR=SPI_CLK;//SPI_CLK=0
/*设置SPI_DATA输出值*/
if((dat&0x80)!
=0)IO0SET=SPI_DATA;
elseIO0CLR=SPI_DATA;
dat<<=1;
IO0SET=SPI_CLK;//SPI_CLK=1
}
IO0SET=SPI_CS;//SPI_CS=1,输出显示数据
}
constuint8DISP_TAB[16]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,
0x81,0x42,0x24,0x18,0x24,0x42,0x81,0x00};
/****************************************************************************
*名称:
main()
*功能:
根据表DISP_TAB来控制LED显示。
****************************************************************************/
intmain(void)
{uint8i;
PINSEL0=0x00000000;//设置管脚连接GPIO
IO0DIR=SPI_IOCON;//设置SPI控制口为输出
while
(1)
{for(i=0;i<16;i++)
{HC595_SendDat(~DISP_TAB[i]);//输出LED显示数据
DelayNS(500);//延时
}
}
return(0);
}
2#include"config.h"
#defineTASK_STK_SIZE64
OS_STKTaskStartStk[TASK_STK_SIZE];
OS_STKTaskStk[TASK_STK_SIZE];
#defineKEY1(1<<14)/*P0.14为key1*/
#defineBEE(1<<7)/*P0.07为蜂鸣器*/
voidTaskStart(void*data);
voidTask(void*data);
intmain(void)
{
OSInit();
OSTaskCreate(TaskStart,(void*)0,&TaskStartStk[TASK_STK_SIZE-1],0);
OSStart();
return0;
}
voidTaskStart(void*pdata)
{
pdata=pdata;/*避免编译警告*/
TargetInit();/*目标板初始化*/
IODIR&=~KEY1;/*设置KEY1为输入*/
IOSET=BEE;
IODIR|=BEE;/*设置蜂鸣器为输出*/
PINSEL0=(PINSEL0&0xcffff3ff);/*管教选择模块初始化*/
OSTaskCreate(Task,(void*)0,&TaskStk[TASK_STK_SIZE-1],10);/*创建任务*/
for(;;)
{
OSTaskSuspend(OS_PRIO_SELF);
IOCLR=BEE;
OSTimeDly(OS_TICKS_PER_SEC/8);
IOSET=BEE;
OSTimeDly(OS_TICKS_PER_SEC/4);
IOCLR=BEE;
OSTimeDly(OS_TICKS_PER_SEC/8);
IOSET=BEE;
OSTimeDly(OS_TICKS_PER_SEC/4);
}
}
voidTask(void*pdata)
{
pdata=pdata;/*避免编译警告*/
for(;;)
{
OSTimeDly(OS_TICKS_PER_SEC/50);/*延时20毫秒*/
if((IOPIN&KEY1)!
=0)
{
continue;
}
OSTimeDly(OS_TICKS_PER_SEC/50);/*延时20毫秒*/
if((IOPIN&KEY1)!
=0)
{
continue;
}
OSTaskResume(0);
while((IOPIN&KEY1)==0)
{
OSTimeDly(OS_TICKS_PER_SEC/50);/*延时20毫秒*/
}
}
}
3
*功能:
使用定时器0实现1秒定时,控制蜂鸣器蜂鸣。
(查询方式)
#include"config.h"
#defineBEEPCON0x00000080/*P0.7引脚控制B1,低电平蜂鸣*/
*功能:
初始化定时器0,定时时间为1S。
voidTime0Init(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;
}
*功能:
初始化I/O及定时器,然后不断的查询定时器中断标志。
当定时时间到达时,取反BEEPCON
*控制口。
intmain(void)
{PINSEL0=0x00000000;//设置管脚连接GPIO
IO0DIR=BEEPCON;//设置I/O为输出
Time0Init();//初始化定时器0
while
(1)
{while((T0IR&0x01)==0);//等待定时时间到
T0IR=0x01;//清除中断标志
if((IO0SET&BEEPCON)==0)IO0SET=BEEPCON;
elseIO0CLR=BEEPCON;
}
return(0);
}
4功能:
调节电位器W3或W4,使得AD采样电压变化,将实时数值通过串口发送到计算机显示式)
#include"config.h"
#defineBAUD9600//波特率设置值
uint32ADC_Data;
uint8AdData;
voidAD_caiji(void)
{
//while((ADDR&0x80000000)==0);
ADC_Data=ADDR;
ADC_Data=(ADC_Data>>6)&0x3ff;
}
*名称:
UART0初始化
voidUart0Init(void)
{
PINSEL0=0x00000005;//设置P0.0P0.1为UART0功能
U0LCR=0x83;
U0DLM=((Fpclk/16)/BAUD)/256;//设置波特率
U0DLL=((Fpclk/16)/BAUD)%256;
U0LCR=0x03;
}
*功能:
UART0发送字节数据。
voidUART0_SendByte(uint8data)
{
U0THR=data;//发送数据
while((U0LSR&0x40)==0);//等待数据发送完毕
}
voidDelayNS(uint32dly)
{uint32i;
for(;dly>0;dly--)
for(i=0;i<5000;i++);
}
*功能:
定时器0中断服务程序,取反BEEPCON控制口。
void__irqIRQ_AD(void)
{AD_caiji();
VICVectAddr=0x00;//通知VIC中断处理结束
}
*功能:
初始化AD。
voidADInit(void)
{
PINSEL1=0x01040000;//设置P0.27P0.28为AIN0功能
ADCR=(1<<0)|(1<<1)|
((Fpclk/1000000-1)<<8)|
(1<<16)|
(1<<21)|
(0<<22)|(0<<23);
/*设置AD中断IRQ*/
VICIntSelect=0x00;//所有中断通道设置为IRQ中断
VICVectCntl0=0x32;//AD0中断通道分配最高优先级(向量控制器0)
VICVectAddr0=(uint32)IRQ_AD;//设置中断服务程序地址向量
VICIntEnable=0x00000000|(1<<18);//使能定时器0中断
}
*功能:
初始化I/O及定时器,然后等待中断。
*说明:
在STARTUP.S文件中使能IRQ中断(清零CPSR中的I位)。
intmain(void)
{
uint8Delay=0;
ADInit();//初始AD及使能中断
Uart0Init();//初始化串口
while
(1)//等待定时器0中断或定时器1匹配输出
{
AdData=(int8)((float)ADC_Data*3.3/1024);
UART0_SendByte(AdData/1000+0x30);//得到电压值的千位并发送
UART0_SendByte('.');//发送小数点
UART0_SendByte(AdData%1000/100+0x30);//得到电压值的百位并发送
UART0_SendByte(AdData%100/10+0x30);//得到电压值的十位并发送
UART0_SendByte(AdData%10+0x30);//得到电压值的个位并发送
UART0_SendByte('V');//发送电压符号"V"
UART0_SendByte(0x0d);//
UART0_SendByte(0x0a);//AD值发送结束,回车换行
for(Delay=0;Delay<30;Delay++)//延时
{
DelayNS(150);
}
}
return(0);
}
5功能:
蜂鸣器控制。
对蜂鸣器B1进行控制,采用软件延时方法。
使用I/O口直接控制,采用灌电流方式。
#include"config.h"
#defineBEEPCON0x00000080/*P0.7引脚控制B1,低电平蜂鸣*/
voidDelayNS(uint32dly)
{uint32i;
for(;dly>0;dly--)
for(i=0;i<5000;i++);
}
intmain(void)
{uint8vaddress;
PINSEL0=0x00000000;//设置管脚连接GPIO
IO0DIR=BEEPCON;//设置I/O为输出
//vaddress=0x78;
while
(1)
{IO0SET=BEEPCON;//BEEPCON=1
DelayNS(100);
IO0CLR=BEEPCON;//BEEPCON=0
DelayNS(100);
}
return(0);
}
6功能:
对SST39VF160进行全片擦除,然后写两字节数据到芯片0地址,再读出来校验,
*若校验通过则蜂鸣器响一声,否则不断地蜂鸣报警。
#include"config.h"
#defineBEEPCON0x00000080/*P0.7引脚控制B1,低电平蜂鸣*/
voidDelayNS(uint32dly)
{uint32i;
for(;dly>0;dly--)
for(i=0;i<5000;i++);
}
//FLASH的起始地址(分配为Bank1块)
#defineFLASH_ADDR0x81000000
//转换地址。
将要发送给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=GetAddr(0x5555);
ip[0]=0xa0a0;//第三个写周期,地址0x5555,数据0xA0
ip=GetAddr(Addr);
*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表示操作失败
uint8ChipErase(void)
{volatileuint16*ip;
uint16temp1,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);
}
*功能:
SST39VF160擦除、编程操作。
intmain(void)
{uint8i;
uint8err=0;
volatileuint16*addr;
PINSEL0=0x00000000;//设置管脚连接GPIO
IO0DIR=BEEPCON;//设置I/O为输出
ChipErase();//FLASH全片擦除
//校验是否真正擦除。
若发现有非0xFFFF的存储单元,设置err=1
addr=GetAddr(0);
for(i=0;i<100;i++)
{if(0xFFFF!
=(*addr))err=1;
addr++;
}
WordProgram(0,0x55AA);//向FLASH的0地址写入0x55AA
addr=GetAddr(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);
}
7功能:
使用硬件I2C对ZLG7290进行操作,利用中断方式操作。
#include"config.h"
#defineZLG72900x70/*定义器件地址*/
#defineGlitter_COM0x70
uint8aaa;
uint8disp_buf[10];
uint8disp_buf0[6];
#defineBEEPCON0x00000080
*功能:
主模式I2C初始化,包括初始化其中断为向量IRQ中断。
voidI2C_Init(uint32fi2c)
{if(fi2c>400000)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通道分配到IRQslot0,即优先级最高
VICVectAddr0=(int)IRQ_I2C;//设置I2C中断向量地址
VICIntEnable=0x0200;//使能I2C中断
}
voidDelayNS(uint32dly)
{uint32i;
for(;dly>0;dly--)
for(i=0;i<5000;i++);
}
*功能:
定时器0中断服务程序,取反BEEPCON控制口。
void__irqTimer0_ISR(void)
{
staticinti=0;
/*staticinti=0,j=0;
ZLG7290_SendCmd(0x60,disp_buf0[j]);
//ZLG7290_SendBuf(disp_buf,8);
ZLG7290_SendCmd(0x60+1,disp_buf[i]);
i++;
if(i==10)
{i=0;
j++;
if(j==6)
j=0;
}*/
if(i==0)
{IO0SET=BEEPCON;i=1;}//BEEPCON=1
else
{IO0CLR=BEEPCON;i=0;}//BEEPCON=0
VICVectAddr=0x00;//通知VIC中断处理结束
}
vo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ARM 实验 程序