【实验目的】
控制发光二极管,使led2、led3、led4、led5依次闪烁
【实验原理图】
【实验内容】
test.c
#define GPX2CON (*(volatile unsigned int *)0x11000c40)
#define GPX2DAT (*(volatile unsigned int *)0x11000C44)
#define GPX2PUD (*(volatile unsigned int *)0x11000c48)
#define GPX1CON (*(volatile unsigned int *)0x11000c20)
#define GPX1DAT (*(volatile unsigned int *)0x11000C24)
#define GPX1PUD (*(volatile unsigned int *)0x11000c28)
#define GPF3CON (*(volatile unsigned int *)0x114001e0)
#define GPF3DAT (*(volatile unsigned int *)0x114001e4)
#define GPF3PUD (*(volatile unsigned int *)0x114001e8)
/**************** 引脚对应 ********************
LED2-----GPX2_7
LED3-----GPX1_0
LED4-----GPF3_4
LED5-----GPF3_5
*************************************************/
/**************** 延时函数 *********************/
static void delay_ms(int ms)
{
int i,j;
while(ms--)
{
for(i=0;i<5;i++)
{
for(j=0;j<514;j++);
}
}
}
/********************* 初始化LED *************************/
void init_led()
{
GPX2CON=GPX2CON & (~(0xf<<28)) | (0x1<<28); //设置为输出模式
GPX1CON=GPX1CON & (~(0xf)) |(0x1);
GPF3CON=GPF3CON & (~(0xf<<16)) | (0x1<<16);
GPF3CON=GPF3CON & (~(0xf<<20)) | (0x1<<20);
}
void led_two_on()
{
GPX2DAT=GPX2DAT | (0x1<<7);
}
void led_three_on()
{
GPX1DAT=GPX1DAT | (0x1);
}
void led_four_on()
{
GPF3DAT=GPF3DAT | (0x1<<4);
}
void led_five_on()
{
GPF3DAT=GPF3DAT | (0x1<<5);
}
void led_two_off()
{
GPX2DAT=GPX2DAT & ~(0x1<<7);
}
void led_three_off()
{
GPX1DAT=GPX1DAT & ~(0x1);
}
void led_four_off()
{
GPF3DAT=GPF3DAT & ~(0x1<<4);
}
void led_five_off()
{
GPF3DAT=GPF3DAT & ~(0x1<<5);
}
void before_test()
{
led_two_on();
led_three_on();
led_four_on();
led_five_on();
delay_ms(1200);
led_two_off();
led_three_off();
led_four_off();
led_five_off();
delay_ms(500);
}
void step_by_step()
{
led_five_off();
led_two_on();
delay_ms(800);
led_two_off();
led_three_on();
delay_ms(800);
led_three_off();
led_four_on();
delay_ms(800);
led_four_off();
led_five_on();
delay_ms(800);
}
/********************* 主函数 ****************************/
int main()
{
init_led();
before_test();
while(1)
{
step_by_step();
}
return 0;
}
map.lds
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") //指定输出文件格式
OUTPUT_ARCH(arm) //生成的文件支持arm系列
ENTRY(_start) //连接后的第一条指令所在的地址是_start
SECTIONS //目标文件的摆放
{
. = 0; //指定链接的起始地址
. = ALIGN(4); //指令的对齐
.text : //代码段的开始
{
*(.text) //其他目标文件自动分配位置
}
. = ALIGN(4);
.data :
{ *(.data) }
. = ALIGN(4); //代码的对齐
.bss :
{ *(.bss) }
}
Makefile
CROSS = arm-none-linux-gnueabi-
CC=$(CROSS)gcc
LD=$(CROSS)ld
OBJCOPY=$(CROSS)objcopy
all:
$(CC) -g -c -o start.o start.s
$(CC) -g -c -o test.o test.c
$(LD) start.o test.o -Tmap.lds -o test.elf
$(OBJCOPY) -O binary -S test.elf test.bin
$(CROSS)objdump -D test.elf > test.dis
clean:
rm -f *.o *.elf *.bin *.dis
start.s
.global _start
_start:
b main
【实验现象】
所有灯先亮,然后全灭,然后依次led2、led3、led4、led5依次闪烁。
video