LED灯驱动实验
1、用ADS开发软件新建一个工程,在工程中新建一个start.s文件,在其中添加如下代码:
area start,code,readonly
//注意:声明代码段start,该行不能顶格写(具体为什么还不清楚)
reset
ldr sp ,=4096
import main
bl main
end
reset
ldr sp ,=4096
import main
bl main
end
2、新建一个def.h文件,在其中添加如下代码:
#ifndef _DEF_H
#define _DEF_H
#define rGPBCON (*((volatile unsigned *)0x56000010))
#define rGPBDAT (*((volatile unsigned *)0x56000014))
#define LED1_ON rGPBDAT &=(~(1<<5))
#define LED2_ON rGPBDAT &=(~(1<<6))
#define LED3_ON rGPBDAT &=(~(1<<7))
#define LED4_ON rGPBDAT &=(~(1<<8))
#define LED1_OFF rGPBDAT |=(1<<5)
#define LED2_OFF rGPBDAT |=(1<<6)
#define LED3_OFF rGPBDAT |=(1<<7)
#define LED4_OFF rGPBDAT |=(1<<8)
#endif
#define _DEF_H
#define rGPBCON (*((volatile unsigned *)0x56000010))
#define rGPBDAT (*((volatile unsigned *)0x56000014))
#define LED1_ON rGPBDAT &=(~(1<<5))
#define LED2_ON rGPBDAT &=(~(1<<6))
#define LED3_ON rGPBDAT &=(~(1<<7))
#define LED4_ON rGPBDAT &=(~(1<<8))
#define LED1_OFF rGPBDAT |=(1<<5)
#define LED2_OFF rGPBDAT |=(1<<6)
#define LED3_OFF rGPBDAT |=(1<<7)
#define LED4_OFF rGPBDAT |=(1<<8)
#endif
3、新建一个main.c文件,其代码如下:
#include "def.h"
int delay(unsigned int a)
{
while(a--);
return 0;
}
int main(int argc,char argv[])
{
rGPBCON |=0x15400;
while(1)
{
LED1_ON;
LED2_ON;
LED3_ON;
LED4_ON;
delay(1000000);
LED1_OFF;
LED2_OFF;
LED3_OFF;
LED4_OFF;
delay(1000000);
}
}
int delay(unsigned int a)
{
while(a--);
return 0;
}
int main(int argc,char argv[])
{
rGPBCON |=0x15400;
while(1)
{
LED1_ON;
LED2_ON;
LED3_ON;
LED4_ON;
delay(1000000);
LED1_OFF;
LED2_OFF;
LED3_OFF;
LED4_OFF;
delay(1000000);
}
}
4、进行DebugRel Settings.
注意:在设置Linker时,其中Output中RO Base设置为0x30000000,Options中Image entry point中也应该设置为0x30000000,在Layout中第一个Object/Symbol中应该填与.s文件名同名的.o文件名,在后面的Section中应该填写在.s文件中的area和code之间的那个名字。
5、连接开发板,打开H-JTAG(它的设置在这里就不说了),H-JTAG中的Init中的Auto Init勾上,点击Init Script,加载(load)H-JTAG文件夹中的FriendlyARM2440.his。然后就可以运行程序了
6、如要用开发板上的按钮控制灯,只需要在代码中添加对按钮的初始化和宏定义即可,然后用if语句作为判断条件。
在def.h文件中添加这样两行代码:
#define rGPGCON (*((volatile unsigned *)0x56000060))
#define rGPGDAT (*((volatile unsigned *)0x56000064))
#define rGPGDAT (*((volatile unsigned *)0x56000064))
在main.c中添加如下控制条件
#include "def.h"
int delay(unsigned int a)
{
while(a--);
return 0;
}
int main(int argc,char argv[])
{
rGPBCON |=0x15400;
rGPGCON |=0x80A882;
while(1)
{
if((rGPGDAT&0x1)==0x0)
LED1_ON;
if((rGPGDAT&0x8)==0x0)
LED2_ON;
if((rGPGDAT&0x20)==0x0)
LED3_ON;
if((rGPGDAT&0x40)==0x0)
LED4_ON;
// delay(1000000);
if((rGPGDAT&0x1)==0x1)
LED1_OFF;
if((rGPGDAT&0x8)==0x8)
LED2_OFF;
if((rGPGDAT&0x20)==0x20)
LED3_OFF;
if((rGPGDAT&0x40)==0x40)
LED4_OFF;
// delay(1000000);
}
}
if((rGPGDAT&0x1)==0x0)
{
delay(100);
if((rGPGDAT&0x1)==0x0)
{
......
}
}