一、前言
本篇使用华清远见的FS4412开发板,对开发板的LED进行操作,来实现流水灯的效果,知识包含GPIO寄存器介绍、与ubuntu下linux操作系统通过进行交叉编译生成开发板可执行代码,通过本次实验来认识ARM开发板的GPIO知识。
二、准备工作
FS4412开发板,我用的是华清远见的FS4412开发板
ubuntu下linux操作系统(包含交叉编译工具)
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_0到GPX1_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跑马灯实现。

到这里就结束啦!传作不易,麻烦点个赞呗。
本文介绍如何使用华清远见FS4412开发板实现LED流水灯效果,涵盖GPIO寄存器配置、交叉编译及程序烧录等步骤。
610

被折叠的 条评论
为什么被折叠?



