Linux-ARM裸机开发-汇编LED驱动实验流程

一、汇编LED原理分析

为什么要学习Cortex-A汇编:

①、需要用汇编初始化一些SOC外设。

②、使用汇编初始化DDR,I.MX6U不需要。

③、设置sp指针,一般指向DDR,设置好C语言运行环境。

ALPHA开发板LED灯硬件原理分析:

STM32 IO初始化流程:

①、使能GPIO时钟。

②、设置IO复用,将其复用为GPIO

③、配置GPIO的电气属性。

④、使用GPIO,输出高/低电平。

I.MX6ULL IO初始化:

①、使能时钟,CCGR0~CCGR6这7个寄存器控制着6ULL所有外设时钟的使能。为了简单,设置CCGR0~CCGR6这7个寄存器全部为0XFFFFFFFF,相当于使能所有外设时钟。

②、IO复用,将寄存器IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03(查看原理图可知)的bit3~0设置为0101=5,这样GPIO1_IO03就复用为GPIO。

③、寄存器IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03是设置GPIO1_IO03的电气属性。包括压摆率、速度、驱动能力、开漏、上下拉等。

④、配置GPIO功能,设置输入输出。设置GPIO1_DR寄存器bit3为1,也就是设置为输出模式。设置GPIO1_DR寄存器的bit3,为1表示输出高电平,为0表示输出低电平。

三、汇编简介

汇编由一条一条指令构成,指令就涉及到汇编指令。

Int a,b;

a=b;

假设a地址为0X20,b地址为0x30

LDR R0, =0X30

LDR R1, [R0]

LDR R0, =0X20

STR R1, [R0]

我们在使用汇编编写驱动的时候最常用的就是LDR和STR这两个指令。

四、编写驱动

.global _start @全局标号

_start:
    /*初始化,使能所有外设时钟 */
    ldr r0,=0x020c4068 @CCGR0
    ldr r1,=0xffffffff 
    str r1,[r0]

    ldr r0,=0x020c406c
    str r1,[r0]

    ldr r0,=0x020c4070
    str r1,[r0]

    ldr r0,=0x020c4074
    str r1,[r0]

    ldr r0,=0x020c4078
    str r1,[r0]

    ldr r0,=0x020c407c
    str r1,[r0]

    ldr r0,=0x020c4080
    str r1,[r0]

    /*配置gpio是否复用 */
    ldr r0,=0x020e0068 @
    ldr r1,=0x5 
    str r1,[r0]

    /*配置gpio 初始化*/
    ldr r0,=0x020e02f4 @
    ldr r1,=0x10b0
    str r1,[r0]

    /*设置gpio使能输出 */
    ldr r0,=0x0209c004 @
    ldr r1,=0x8
    str r1,[r0]

    /*gpio输出0 */
    ldr r0,=0x0209c000 @
    ldr r1,=0x0 
    str r1,[r0]

    loop:
        b loop

五、编译程序

1、编译Makefile程序

①、使用arm-linux-gnueabihf-gcc将.c .s文件变为.o

②、将所有的.o文件连接为elf格式的可执行文件。

③、将elf文件转为bin文件。

④、将elf文件转为汇编,反汇编。

链接:

链接就是将所有.o文件链接在一起,并且链接到指定的地方。本实验链接的时候要指定链接起始地址。链接起始地址就是代码运行的起始地址。

对于6ULL来说,链接起始地址应该指向RAM地址。RAM分为内部RAM和外部RAM,也就是 DDR。6ULL内部RAM地址范围0X900000~0X91FFFF。也可以放到外部DDR中,对于I.MX6U-ALPHA开发板,512MB字节DDR版本的核心板,DDR范围就是0X80000000~0X9FFFFFFF。对于256MB的DDR来说,那就是0X80000000~0X8FFFFFFF

裸机代码的链接起始地址为0X87800000。要使用DDR,那么必须要初始化DDR,对于I.MX来说bin文件不能直接运行,需要添加一个头部,这个头部信息包含了DDR的初始化参数,I.MX系列SOC内部boot rom会从SD卡,EMMC等外置存储中读取头部信息,然后初始化DDR,并且将bin文件拷贝到指定的地方。

Bin的运行地址一定要和链接起始地址一致。位置无关代码除外。

led.bin : leds.s 
	arm-linux-gnueabihf-gcc -g -c leds.s -o led.o
	arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf
	arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
	arm-linux-gnueabihf-objdump -D led.elf > led.dis

clean:
	rm -rf *.o led.bin led.elf led.dis

六、烧写bin文件

STM32烧写到内部FLASH。而6ULL支持SD卡、EMMC、NAND、nor、SPI flash等等启动。裸机例程选择烧写到SD卡里面,开发板BOOT_CFG启动编码器要设置1和7为ON其它为OFF。

在ubuntu下向SD卡烧写裸机bin文件。烧写不是将bin文件拷贝到SD卡中,而是将bin文件烧写到SD卡绝对地址上。而且对于I.MX而言,不能直接烧写bin文件,比如先在bin文件前面添加头部。完成这个工作,需要使用正点原子提供的imxdownload软件。

Imxdownload使用方法,确定要烧写的SD卡文件,我的是/dev/sdb,可以使用ls /dev/sd*查看。

给予imxdownload可执行权限:

Chmod 777 imxdownload

烧写:./imxdownload led.bin /dev/sdb

Imxdownlaod会向led.bin添加一个头部,生成新的load.imx文件,这个load.imx文件就是最终烧写到SD卡里面去的。

七、启动头文件

1、Boot Rom做的事情。

设置内核时钟为396MHz。使能MMU和Cache,使能L1cache L2 cache MMU,目的就是为了加速启动。

从BOOT_CFG设置的外置存储中,读取image,然后做相应的处理。

2、IVT和Boot Data数据

Bin文件前面要添加头部。可以得到,我们烧写到SD卡中的load.imx文件在SD卡中的起始地址是0x400,也就是1024。

头部大小为3KB,加上偏移的1KB,一共是4KB,因此在SD卡中bin文件起始地址为4096。

IVT大小为32B/4=8条。

IVT+Boot Data的数据,很多是我从NXP官方u-boot.imx文件里面提取出来的。

3、DCD数据

Device configuration data,DCD数据就是 配置6ULL内部寄存器的。

首先,将CCRG0~CCGR6全部写为0XFFFFFFFF,表示打开所有外设时钟。然后就是DDR初始化参数。设置DDR控制器,也就是初始化DDR。

4、其他的数据

检查数据命令、NOP命令、解锁命令。这些其实也都属于DCD

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值