【Linux裸机开发】- 汇编点灯

汇编点灯

汇编作用意义

汇编目前应用开发已经很少用到了,但是作为嵌入式开发人员还是需要有一定汇编基础

  1. 需要用汇编初始化一些SoC外设。
  2. 使用汇编初始化DDR,I.MX6U(I.MX内部的ROM,NXP在内部96KB的ROM中存放了自己编写的启动代码,这些启动代码可以读取DDR配置信息,并且完成DDR的初始化)。
  3. 设置sp指针,一般指向DDR,设置好C语言运行环境。

汇编点灯思路

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设置为5复用为GPIO。
③、寄存器IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03是设置GPIO1_IO03的电气属性。
④、配置GPIO功能,设置输入输出。设置GPIO1_DR寄存器bit3为1,也就是设置为输出模式。设置GPIO1_DR寄存器的bit3,为1表示输出高电平,为0表示输出低电平。

汇编代码

/* LED_汇编驱动 */
.global _start @全局标号

_start:
    /* 使能时钟 */
    ldr r1,=0xffffffff

    ldr r0,=0x020c4068 @CGGR0
    str r1,[r0]

    ldr r0,=0x020c406C @CGGR1
    str r1,[r0]

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

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

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

    ldr r0,=0x020c407C @CGGR5
    str r1,[r0]

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

    /* 复用时钟 IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03
     * 复用为 GPIO
     */
    ldr r0,=0x02e0068
    ldr r1,=0x5
    str r1,[r0]

    /* 电器特性 IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03
     * bit0     0      压摆率
     * bit5:3   110    驱动能力R0/6
     * bit7:6   10     速度100MHz
     * bit11    0      关闭开漏输出
     * bit12    1      使能pull/keeper
     * bit13    0      使能keeper
     * bit15:14 00     下拉100K
     * bit16    0      关闭HYS
     */
    ldr r0,=0x020e02f4
    ldr r1,=0x10b0
    str r1,[r0]

    /* 设置GPIO功能 */
    ldr r0,=0x0209c004  @ GPIO1_GDIR
    ldr r1,=0x8         @ GPIO1_IO3配置为输出
    str r1,[r0]

    ldr r0,=0x0209c000  @ GPIO1_DR
    ldr r1,=0x1         @ 设置为低电平
    str r1,[r0]

loop:
    b loop



编译程序

①、编译文件:将.c .s文件变为.o

arm-linux-gnueabihf-gcc -g -c led.s -o led.o //'-c'编译源文件

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

arm-linux-gnueabihf-ld -Ttext 0x87800000 led.o -o led.elf //'-Ttext'指定链接地址

③、格式转换:将elf文件转为bin文件。

arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin //'-O binary'指定以binary格式输出

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

arm-linux-gnueabihf-objdump -D led.elf > led.dis //'-D'反汇编所有的段

Makefile文件的编写

led.bin:led.s
	arm-linux-gnueabihf-gcc -g -c led.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 *.elf *.dis *.bin

烧写bin文件

6ULL支持SD卡、EMMC、NAND、nor、SPI flash等等启动。裸机例程选择烧写到SD卡里面,在ubuntu下向SD卡烧写裸机bin文件。烧写不是将bin文件拷贝到SD卡中,而是将bin文件烧写到SD卡绝对地址上。而且对于I.MX而言,不能直接烧写bin文件,比如先在bin文件前面添加头部。完成这个工作,需要使用正点原子提供的imxdownload软件。

给予imxdownload可执行权限:

Chmod 777 imxdownload

烧写:

./imxdownload led.bin /dev/sdf

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

你可能感兴趣的:(Linux裸机开发)