欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

点亮LED

程序员文章站 2022-03-16 17:30:45
...

为什么使用LED?
在嵌入式系统软件(bootloader kernel)开发初期,由于串口等硬件尚未被初始化,因此调试手段相当有限,这是通常会采用LED来作为程序调试的重要手段。

1. LED原理图分析

1. LED原理图

点亮LED
点亮LED
LED的实质是发光二极管,若想点亮LED,只需要LED两端的电压呈现一定的压差即可,从原理图来看,只需要nLED_x端为低电平即可点亮LEDx。

2. GPIO

GPIO(Gerneral-Purpose Input/Output Ports):通用输入/输出端口。在嵌入式系统中,CPU经常需要控制许多结构简单的外部设备或这电路,这些设备通常只要求两种状态(开/关),对这些设备的控制,使用传统的串口或者USB口就显得复杂,所以,在嵌入式微处理器上通常提供了一种“通用可编程I/O端口”,也就是GPIO。
一个GPIO端口至少需要两个寄存器,一个是“控制寄存器”,用于选择该端口作为输入还是输出。另一个是存放数据的“数据寄存器”。

2. 芯片手册导读

S3C2440芯片手册:链接:https://pan.baidu.com/s/1hud9ikO 密码:civ2
通过查阅S3C2440芯片手册,确定GPB控制寄存器和GPB数据寄存器的设置值

3. 思维导图设计

点亮LED

4. LED驱动代码

led.lds

OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
    .= 0x30008000;
    .= ALIGN(4);
    .text:
    {
        start.o(.text)
        *(.text)
    }
    .= ALIGN(4);
    .data:
    {
        *(.data)
    }
    .= ALIGN(4);
    bss_start = .;
    .bss:
    {
        *(.bss)
    }
    bss_end = .;
}

led.S

@平台支持:Mini2440 Friendly ARM
@程序功能:点亮led1
@作者:FGC
@日期:2018120.text
.global _start
_start:

_start:
    bl led_init
    bl led1_on

end:
    b end

#define GPBCON 0x56000010   @定义GPIO_B控制寄存器
#define GPBDAT 0x56000014   @定义GPIO_B数据寄存器

led_init:
    ldr r0, =GPBDAT
    mov r1, #0xf << 5
    str r1, [r0]
    mov pc, lr

led1_on:
    ldr r0, =GPBCON
    mov r1, #0x400
    str r1, [r0]

    ldr r0, =GPBDAT
    mov r1, #0x0
    str r1, [r0]
    mov pc, lr

Makefile

all: start.o 
    arm-linux-ld -Tgboot.lds -o gboot.elf $^
    arm-linux-objcopy -O binary gboot.elf gboot.bin

%.o : %.S
    arm-linux-gcc -g -c $^

%.o : %.c
    arm-linux-gcc -g -c $^

.PHONY: clean
clean:
    rm *.o *.elf *.bin
相关标签: 嵌入式系统