00. 目录
01. 控制原理
咱们的LED在核心板上,所以需要看核心板的原理图
打开核心板原理图(Tiny4412-1412-Schematic.pdf)
由上图可知,Tiny4412有4个用户LED灯,控制它们四个引脚分别是GPM4_0~ GPM4_3,由原理可知,当IO引脚为高电平时,LED灯灭,当IO引脚为低电平时LED亮。我们要做的工作就是设置GPM4_0~ GPM4_3为输出功能,且控制且输出电平高低即可。
02. 配置寄存器
由原理图可知,程序只进行了两步操作。
第一步:设置GPM4_0~GPM4_3相对应的控制寄存器GPM4CON,使GPM4_0 GPM4_3四个引脚为输出功能。
第二步:设置其对应的数据寄存器GPM4DAT对应的4个bit位为0,使GPM4_0~ GPM4_3为低电平,4个LED灯全亮,使GPM4_0~ GPM4_3全为高电平,4个LED灯全灭。
03. 程序示例一
将所有的灯全部都亮
gpio.h
#ifndef __GPIO_H__
#define __GPIO_H__
typedef volatile unsigned int U32;
typedef volatile unsigned short U16;
typedef volatile unsigned char U8;
//LED
#define GPM4CON *(U32*)0x110002e0
#define GPM4DAT *(U32*)0x110002e4
//LED初始化
int led_init(void);
//LED 全亮
int led_allon(void);
//LED 全灭
int led_alloff(void);
#endif/*__GPIO_H__*/
lib.c文件内容如下
int delay(unsigned int i)
{
while(--i)
;
}
int delay1()
{
unsigned int i = 0xfffff;
while(--i)
;
}
led.c文件内容如下
#include <gpio.h>
//LED初始化
int led_init(void)
{
GPM4CON &= ~0xffff;
GPM4CON |= 0x1111;
return 0;
}
//LED 全亮
int led_allon(void)
{
GPM4DAT &= ~0xf;
return 0;
}
//LED 全灭
int led_alloff(void)
{
GPM4DAT |= 0xf;
return 0;
}
test.c文件内容如下
#include <gpio.h>
int main(void)
{
led_init();
led_allon();
return 0;
}
start.S文件内容如下
.section .text
.align 2
.global _start
_start:
stmfd sp!, {r4, lr}
bl main
ldmfd sp!, {r4, pc}
start.lds文件内容如下
ENTRY(_start);
OUTPUT("test");
SECTIONS
{
. = 0x0;
.text : {
start.o(.text);
*(.text);
}
.rodata : {
*(.rodata);
}
. = ALIGN(4);
.data : {
*(.data);
}
. = ALIGN(4);
.bss : {
*(.bss);
}
}
Makefile
CROSS_COMPILE = arm-linux-
CC = $(CROSS_COMPILE)gcc
CC_FLAGS = -c -I ./
LD = $(CROSS_COMPILE)ld
LD_FLAGS = -T start.lds -Ttext 0x40000000
OBJCOPY = $(CROSS_COMPILE)objcopy
COPY_FLAGS = -O binary
OBJDUMP=$(CROSS_COMPILE)objdump
DUMP_FLAGS=-D
TARGET=test
OBJS=start.o led.o lib.o test.o
all: $(OBJS)
$(LD) $(LD_FLAGS) $(OBJS) -o $(TARGET)
$(OBJCOPY) $(COPY_FLAGS) $(TARGET) $(TARGET).bin
$(OBJDUMP) $(DUMP_FLAGS) $(TARGET) > $(TARGET).dis
rm -rf *.o
%.o:%.s
$(CC) $(CC_FLAGS) $<
%.o:%.S
$(CC) $(CC_FLAGS) $<
%.o:%.c
$(CC) $(CC_FLAGS) $<
.PHONY:clean
clean:
rm -rf *.o $(TARGET).bin $(TARGET).dis $(TARGET)
04. 程序示例二
将所有的灯全部都灭
test.c文件内容如下
#include <gpio.h>
int main(void)
{
led_init();
led_alloff();
return 0;
}
05. 程序示例三
所有led闪烁
test.c文件内容如下
#include <gpio.h>
int main(void)
{
led_init();
while(1)
{
led_allon();
delay1();
led_alloff();
delay1();
}
return 0;
}
06. 程序实例四
跑马灯
int i = 0;
led_init();
while(1)
{
led_alloff();
led_on(i);
delay1();
i = (i+1) % 4;
}
return 0;
}
07. 附录
Exynos 4412 SCP_Users Manual_Ver.0.10.00_Preliminary0.pdf