我们的LED在核心板上,因此须要看核心板的原理图
linux
打开核心板原理图(Tiny4412-1412-Schematic.pdf)
web
由上图可知,Tiny4412有4个用户LED灯,控制它们四个引脚分别是GPM4_0~ GPM4_3,由原理可知,当IO引脚为高电平时,LED灯灭,当IO引脚为低电平时LED亮。咱们要作的工做就是设置GPM4_0~ GPM4_3为输出功能,且控制且输出电平高低便可。shell
由原理图可知,程序只进行了两步操做。svg
第一步:设置GPM4_0~GPM4_3相对应的控制寄存器GPM4CON,使GPM4_0 GPM4_3四个引脚为输出功能。
spa
第二步:设置其对应的数据寄存器GPM4DAT对应的4个bit位为0,使GPM4_0~ GPM4_3为低电平,4个LED灯全亮,使GPM4_0~ GPM4_3全为高电平,4个LED灯全灭。code
将全部的灯所有都亮xml
gpio.hblog
#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文件内容以下token
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)
将全部的灯所有都灭
test.c文件内容以下
#include <gpio.h> int main(void) { led_init(); led_alloff(); return 0; }
全部led闪烁
test.c文件内容以下
#include <gpio.h> int main(void) { led_init(); while(1) { led_allon(); delay1(); led_alloff(); delay1(); } return 0; }
跑马灯
int i = 0; led_init(); while(1) { led_alloff(); led_on(i); delay1(); i = (i+1) % 4; } return 0; }
Exynos 4412 SCP_Users Manual_Ver.0.10.00_Preliminary0.pdf