汇编+C点亮led-以替代uboot的方式执行

本文档详细介绍了如何通过编写main.c、led.h、led.c、start.S等源文件,并结合Makefile和led.lds链接脚本,实现C语言和汇编混合编程来控制LED。编译过程生成了LED的ELF和bin文件,并添加sunxi头,最终烧写到TF卡中,以替代uboot的方式执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

main.c

#include "led.h"

static void delay()
{
    unsigned int i = 0;

    for(i = 0; i < 50000; i++);
}

int main()
{
    led_init();

    while(1)
    {
        led1_on();
        delay();
        led1_off();
        delay();

        led2_on();
        delay();
        led2_off();
        delay();

    }

    return 0;
}

led.h

#ifndef _LED_H_
#define _LED_H_

void led_init();

void led1_on();

void led1_off();

void led2_on();

void led2_off();

#endif

led.c

#define GPIO_BASE           0x01C20800
#define GPIO_PH_CFG2_BASE   (GPIO_BASE + 0x104)
#define GPIO_PH_DAT_BASE    (GPIO_BASE + 0x10C)

#define GPIO_PH_CON         (*(volatile unsigned *)GPIO_PH_CFG2_BASE)
#define GPIO_PH_DAT         (*(volatile unsigned *)GPIO_PH_DAT_BASE)

void led_init()
{
    /* clear PH21 */
    GPIO_PH_CON &= ~(0x7 << 20);

    /* clear PH20 */
    GPIO_PH_CON &= ~(0x7 << 16);


    /* set PH21 output */
    GPIO_PH_CON |= (0x1 << 20);

    /* set PH20 output */
    GPIO_PH_CON |= (0x1 << 16);
}

void led1_on()
{
    GPIO_PH_DAT |= (1 << 21);
}

void led1_off()
{
    GPIO_PH_DAT &= ~(1 << 21);
}

void led2_on()
{
    GPIO_PH_DAT |= (1 << 20);
}

void led2_off()
{
    GPIO_PH_DAT &= ~(1 << 20);
}

start.S

.section .init

.global _start

_start: b reset

reset:
        mrs r0, cpsr
        and r1, r0, #0x1f
        teq r1, #0x1a
        bicne r0, r0, #0x1f
        orrne r0, r0, #0x13             @set svc mode
        orr r0, r0, #0xc0               @disable fiq, irq
        msr cpsr, r0

        /* setup stack */
        ldr sp, =(1024 * 10)

        /* start main */
        bl main

loop:
        b loop

Makefile

CC = arm-linux-gnueabihf-gcc
LD = arm-linux-gnueabihf-ld
AS = arm-linux-gnueabihf-as
OBJCP = arm-linux-gnueabihf-objcopy

OBJ = led.o main.o start.o

all: $(OBJ)
    $(LD) -T led.lds $(OBJ) -o led.elf
    $(OBJCP) -O binary -S led.elf led.bin

led.o:
    $(CC) -c led.c

main.o:
    $(CC) -c main.c

start.o:
    $(AS) start.S -o start.o

clean:
    rm $(OBJ) led.elf led.bin

led.lds

SECTIONS
{
    .text : {*(.init) *(.text)}
}

编译

make

make后生成以下文件:
led.elf ELF格式文件
led.bin 去掉了ELF头的纯可执行文件

添加sunxi头

./mksunxiboot led.bin led.hex

烧写到TF卡

sudo dd if=led.hex of=/dev/sdb bs=1024 seek=8
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值