ARM实验之GPIO点亮LED

【实验目的】

控制发光二极管,使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

  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值