汇编目前应用开发已经很少用到了,但是作为嵌入式开发人员还是需要有一定汇编基础
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'反汇编所有的段
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
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卡里面去的。