利用汇编和C语言实现Exynos4412裸机开发系列之实现LED跑马灯(含源码)

本文介绍如何使用华清远见FS4412开发板实现LED流水灯效果,涵盖GPIO寄存器配置、交叉编译及程序烧录等步骤。

一、前言

本篇使用华清远见的FS4412开发板,对开发板的LED进行操作,来实现流水灯的效果,知识包含GPIO寄存器介绍、与ubuntulinux操作系统通过进行交叉编译生成开发板可执行代码,通过本次实验来认识ARM开发板的GPIO知识。

二、准备工作

FS4412开发板,我用的是华清远见的FS4412开发板
ubuntulinux操作系统(包含交叉编译工具)
serial-com7程序烧入执行工具
开发板电路原理图、芯片手册
开发板可在华清远见创客学院平台进行租借
租借网址:
开发板图
在这里插入图片描述

三、GPIO寄存器介绍以及配置过程

当拿到一个开发板时,可以不用着急关注它有多少个引脚,因为不同的芯片引脚都不同,本篇使用的Exynos 4412 芯片包含304个多功能输入/输出接口引脚和164个内存接口引脚,因此我们在最开始时,只需要关注需要用到的引脚,在根据电路原理图上,用到引脚的编号,去看数据手册。

1、LED电路原理图

在这里插入图片描述
在这里插入图片描述

引用FS4412-DevBoard-V5扩展板电路原理图与FS4412_CoreBoard_V2核心板原理图

GPIO寄存器介绍

在芯片手册中找到4个LED灯对应的控制寄存器数据寄存器
GPX2_7控制寄存器
在这里插入图片描述
该寄存器地址是由基地址0x1100 0000偏移0x0C40位得到的,地址是0x11000C40,默认配置是0x0000 0000
该寄存器8位控制一个引脚的功能,0~31分别控制GPX1_0GPX1_7共8个引脚。
本篇用到输出功能,也就是output,写值为0x1000 00000,其他功能用到的时候再介绍。
以下寄存器使用的方法与该方法相同,后面不做说明。
GPX2_7数据寄存器
在这里插入图片描述
该寄存器地址是由基地址0x1100 0000偏移0x0C44位得到的,地址是0x11000C44,默认配置是0x0000 0000
该寄存器0-7位控制引脚输入输出,其他位只读不能用,0-7位每一位控制一个引脚的功能,分别控制引脚GPX1_0~GPX1_7共8个引脚。
输入模式下位置1为输出高电平、位置0输出低电平。

GPX1_0控制寄存器
在这里插入图片描述
GPX1_0数据寄存器
在这里插入图片描述
GPX3_4控制寄存器
在这里插入图片描述
GPX3_4数据寄存器
在这里插入图片描述
GPX3_5控制寄存器
在这里插入图片描述
GPX3_5数据寄存器
在这里插入图片描述

引用(4412手册完整版)SEC_Exynos 4412 SCP_Users Manual_Ver.0.10.00_Preliminary

四、Makefile编写

CROSS = arm-none-linux-gnueabi-
CC=$(CROSS)gcc
LD=$(CROSS)ld
OBJCOPY=$(CROSS)objcopy
    
all:
	$(CC) -g -c -o main.o main.c
	$(CC) -g -c -o start.o start.s
	$(LD) start.o main.o -Tmap.lds -o led.elf
	$(OBJCOPY)  -O binary -S led.elf led.bin
	 
clean:
	rm -f *.o *.elf *.bin *.dis

五、汇编代码编写

.text
.global _start
_start:

b main

.end

六、C代码编写


#define GPX2CON (*(volatile unsigned int *)0x11000C40)
#define GPX2DAT (*(volatile unsigned int *)0x11000C44)

#define GPX1CON (*(volatile unsigned int *)0x11000C20)
#define GPX1DAT (*(volatile unsigned int *)0x11000C24)

#define GPF3CON (*(volatile unsigned int *)0x114001E0)
#define GPF3DAT (*(volatile unsigned int *)0x114001E4)

void LED2_INIT(void)
{
	GPX2CON=GPX2CON&(~(0xF<<28)|(0x1<<28));
}

void LED2_ON(void)
{
	GPX2DAT=GPX2DAT|(0x1<<7);
}

void LED2_OFF(void)
{
	GPX2DAT=GPX2DAT&~(0x1<<7);
}

void LED3_INIT(void)
{
	GPX1CON=(GPX1CON & (~0xF))|0x1;
}

void LED3_ON(void)
{
	GPX1DAT=GPX1DAT|(0x1);
}

void LED3_OFF(void)
{
	GPX1DAT=GPX1DAT& (~(0x1));
}

void LED4_INIT(void)
{
	GPF3CON=(GPF3CON&~(0xF<<16))|(0x1<<16);
}

void LED4_ON(void)
{
	 GPF3DAT= GPF3DAT|(0x1<<4);
}

void LED4_OFF(void)
{
	 GPF3DAT= GPF3DAT&~(0x1<<4);
}

void LED5_INIT(void)
{
	GPF3CON=(GPF3CON&~(0xF<<20))|(0x1<<20);
}

void LED5_ON(void)
{
	 GPF3DAT= GPF3DAT|(0x1<<5);
}

void LED5_OFF(void)
{
	 GPF3DAT= GPF3DAT&~(0x1<<5);
}

void delay(void)
{
	int i=0;
	for(;i<1000000;i++)
	{
		;
	}
}
int main()
{
	LED2_INIT();
	LED3_INIT();
	LED4_INIT();
	LED5_INIT();
	while(1)
	{
			LED2_ON();
			delay();
			LED2_OFF();
			delay();
			LED3_ON();
			delay();
			LED3_OFF();
			delay();
			LED4_ON();
			delay();
			LED4_OFF();
			delay();
		    LED5_ON();
			delay();
			LED5_OFF();
			delay();		
	}
}

对程序进行编译
在这里插入图片描述
编译生成的led.bin文件,将该文件从虚拟机拷贝到Windows中。

七、程序烧入

1.打开serial-com7,连接开发板(COM2接口),烧入程序
在这里插入图片描述
2.打开串口烧写工具,波特率设置115200
在这里插入图片描述
3.开发板上电,并按回车进入boot模式
在这里插入图片描述
4.输入loadb 0x40008000,将程序led.bin程序烧录到0x40008000地址处,并按照如下操作,将文件烧录进开发板中。
在这里插入图片描述
5.烧录成功后,输入go 0x40008000,程序启动。
在这里插入图片描述
6.观察开发板LED灯,LED跑马灯实现。

在这里插入图片描述
到这里就结束啦!传作不易,麻烦点个赞呗。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哈哈吓

您的打赏是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值