【ARM】Tiny4412裸板编程之LED(C语言)

00. 目录

01. 控制原理

我们的LED在核心板上,因此须要看核心板的原理图
在这里插入图片描述linux

打开核心板原理图(Tiny4412-1412-Schematic.pdf)
在这里插入图片描述
在这里插入图片描述web

由上图可知,Tiny4412有4个用户LED灯,控制它们四个引脚分别是GPM4_0~ GPM4_3,由原理可知,当IO引脚为高电平时,LED灯灭,当IO引脚为低电平时LED亮。咱们要作的工做就是设置GPM4_0~ GPM4_3为输出功能,且控制且输出电平高低便可。shell

02. 配置寄存器

由原理图可知,程序只进行了两步操做。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

03. 程序示例一

将全部的灯所有都亮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)

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