点亮LED
程序员文章站
2022-03-16 17:30:45
...
为什么使用LED?
在嵌入式系统软件(bootloader kernel)开发初期,由于串口等硬件尚未被初始化,因此调试手段相当有限,这是通常会采用LED来作为程序调试的重要手段。
1. LED原理图分析
1. 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. 思维导图设计
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
@日期:2018年1月20日
.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