汇编led驱动的代码编写以及ubuntu下的烧录


前言

今天在做汇编led驱动的时候的一些记录总结.


一、实验代码详解

实验流程:

  1. 使能时钟,简单的,我们为了偷懒直接将寄存器CCGR0-CCGR6设置为0xffffffff,也就是说,我们把所有的时钟都使能了
  2. 配置IO口复用为GPIO复用,因为此次实验led0对应GPIO3,于是配置IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 寄存器为5
    在这里插入图片描述
    在这里插入图片描述
  3. 配置GPIO的电气特性,即 SW_PAD_GPIO1_IO03_BASE 寄存器
  4. 设置GPIO1_IO03为输出模式,即 GPIO1_GDIR 寄存器
  5. 点灯 低电平点亮,即GPIO1_DR 寄存器
    汇编代码如下:
.global _start


_start:

/* enable all clock  need to write the register CCGR0-CCGR6 to 0xffffffff */
ldr r0, =0x020C4068  /* register CCGR0 */
ldr r1, =0xffffffff 
str r1, [r0]    /* write the oxfffffffff to the CCGR0 */

ldr r0, =0x020c406c  /* register CCGR1 */
str r1, [r0]   

ldr r0, =0x020c4070  /* register CCGR2 */
str r1, [r0] 

ldr r0, =0x020c4074  /* register CCGR3 */
str r1, [r0] 

ldr r0, =0x020c4078  /* register CCGR4 */
str r1, [r0] 

ldr r0, =0x020c407c  /* register CCGR5 */
str r1, [r0] 

ldr r0, =0x020c4080  /* register CCGR6 */
str r1, [r0] 

/* multiplex the IO , make the IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 = 5 */
ldr r0, =0x020e0068 /* address */
ldr r1, =0x05 
str r1, [r0]

/* config Properties , config the Rigerster SW_PAD_GPIO1_IO03_BASE */
ldr r0, =0x020e02f4
ldr r1, =0x10b0
str r1, [r0]

/* set the GPIO1_IO03 -> OUTPUT mode   Register GPIO1_GDIR */
ldr r0, =0x0209c004
ldr r1, =0x0000008
str r1, [r0]

/* open led0 , set the register GPIO1_DR to low */
ldr r0, =0x0209c000 
ldr r1, =0
str r1,[r0]

/* loop */
loop:
    b loop
    

二、编译

1、arm-linux-gnueabihf-gcc 编译文件

arm-linux-gnueabihf-gcc -g -c led.s -o led.o

上述命令就是将 led.s 编译为 led.o,其中“-g”选项是产生调试信息,GDB 能够使用这些调试信息进行代码调试。“-c”选项是编译源文件,但是不链接。“-o”选项是指定编译产生的文件名字,这里我们指定 led.s 编译完成以后的文件名字为 led.o。
在这里插入图片描述

2、arm-linux-gnueabihf-ld 链接文件

arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf

上述命令中-Ttext 就是指定链接地址,“-o”选项指定链接生成的 elf 文件名,这里我们命名为 led.elf。请添加图片描述

3、arm-linux-gnueabihf-objcopy 格式转换

arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin

上述命令中,“-O”选项指定以什么格式输出,后面的“binary”表示以二进制格式输出,选项“-S”表示不要复制源文件中的重定位信息和符号信息,“-g”表示不复制源文件中的调试信息。
请添加图片描述

4、arm-linux-gnueabihf-objdump 反汇编

arm-linux-gnueabihf-objdump -D led.elf > led.dis

上述代码中的“-D”选项表示反汇编所有的段,反汇编完成以后就会在当前目录下出现一个名为 led.dis 文件

请添加图片描述
led.dis 里面是汇编代码,而且还可以看到内存分配情况。
请添加图片描述

5、编写Makefile文件

leds.bin:leds.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 led.bin led.elf led.dis

请添加图片描述
用法: make make clean

三、代码烧写

1、将 imxdownload 拷贝到工程根目录下

请添加图片描述

2、给予 imxdownload 可执行权限

chmod 777 imxdownload 

请添加图片描述

3、向 SD 卡烧写 bin 文件

./imxdownload led.bin /dev/sdd 

成功点亮请添加图片描述


总结

简单记录一下,唐怡佳继续加油叭!

  • 19
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小唐YiJiaTang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值