Linux学习之ARM(IMX6U)裸机篇之汇编LED驱动实验

1、编写汇编代码

首先建立1_leds文件夹

用vscode打开文件夹1_leds,然后在1_leds工作区下建立leds.s汇编文件

然后编写根据IMX6ULL手册编写汇编代码

.global _start  /* 全局标号 */

/*
 * 描述:	_start函数,程序从此函数开始执行此函数完成时钟使能、
 *		  GPIO初始化、最终控制GPIO输出低电平来点亮LED灯。
 */
_start:
	/* 例程代码 */
	/* 1、使能所有时钟 */
	ldr r0, =0X020C4068 	/* CCGR0 */
	ldr r1, =0XFFFFFFFF  
	str r1, [r0]		
	
	ldr r0, =0X020C406C  	/* CCGR1 */
	str r1, [r0]

	ldr r0, =0X020C4070  	/* CCGR2 */
	str r1, [r0]
	
	ldr r0, =0X020C4074  	/* CCGR3 */
	str r1, [r0]
	
	ldr r0, =0X020C4078  	/* CCGR4 */
	str r1, [r0]
	
	ldr r0, =0X020C407C  	/* CCGR5 */
	str r1, [r0]
	
	ldr r0, =0X020C4080  	/* CCGR6 */
	str r1, [r0]
	

	/* 2、设置GPIO1_IO03复用为GPIO1_IO03 */
	ldr r0, =0X020E0068	/* 将寄存器SW_MUX_GPIO1_IO03_BASE加载到r0中 */
	ldr r1, =0X5		/* 设置寄存器SW_MUX_GPIO1_IO03_BASE的MUX_MODE为5 */
	str r1,[r0]

	/* 3、配置GPIO1_IO03的IO属性	
	 *bit 16:0 HYS关闭
	 *bit [15:14]: 00 默认下拉
     *bit [13]: 0 kepper功能
     *bit [12]: 1 pull/keeper使能
     *bit [11]: 0 关闭开路输出
     *bit [7:6]: 10 速度100Mhz
     *bit [5:3]: 110 R0/6驱动能力
     *bit [0]: 0 低转换率
     */
    ldr r0, =0X020E02F4	/*寄存器SW_PAD_GPIO1_IO03_BASE */
    ldr r1, =0X10B0
    str r1,[r0]

	/* 4、设置GPIO1_IO03为输出 */
    ldr r0, =0X0209C004	/*寄存器GPIO1_GDIR */
    ldr r1, =0X0000008		
    str r1,[r0]

	/* 5、打开LED0
	 * 设置GPIO1_IO03输出低电平
	 */
	ldr r0, =0X0209C000	/*寄存器GPIO1_DR */
   ldr r1, =0		
   str r1,[r0]

/*
 * 描述:	loop死循环
 */
loop:
	b loop 				

2、编写Makefile

在1_leds文件夹下建立Makefile文件

然后编写Makefile代码

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

我们最终烧写到SD卡中的是bin文件,用正点原子的imxdownload烧写工具

首先建立目标文件leds.bin 它的依赖为leds.s

然后用交叉编译器 arm-linux-gnueabihf-gcc 编译文件 将.s文件编译成.o文件

arm-linux-gnueabihf-ld 链接文件。arm-linux-gnueabihf-ld 用来将众多的.o 文件链接到一个指定的链接位置。链接生成 led.elf 文件

arm-linux-gnueabihf-objcopy 格式转换 arm-linux-gnueabihf-objcopy 更像一个格式转换工具,我们需要用它将 led.elf 文件转换为leds.bin 文件

arm-linux-gnueabihf-objdump 反汇编。有时候需要查看其汇编代码来调试代码。

3、编译工程

用make命令编译工程,然后产生leds.bin文件

4、烧写到SD卡

插入SD卡检测到/dev/sdb,/dev/sdb1表示SD卡只有1个分区,使用imxdownload时权限不足用

chmod 777 imxdownload修改权限,最后烧录到SD卡中

5、实验现象

将SD卡插入im6ull开发板中,重新上电,便可看见实验现象。

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-19 09:30:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-19 09:30:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-02-19 09:30:01       87 阅读
  4. Python语言-面向对象

    2024-02-19 09:30:01       96 阅读

热门阅读

  1. Python内置函数05——filter

    2024-02-19 09:30:01       46 阅读
  2. pytorch导出为onnx,使用onnxruntime进行推理

    2024-02-19 09:30:01       41 阅读
  3. UDP协议

    UDP协议

    2024-02-19 09:30:01      51 阅读
  4. [Optimization] Codes Answer to online quiz 1

    2024-02-19 09:30:01       50 阅读
  5. harbor v1.7.1镜像仓库无法访问,并提示502 Bad Gateway

    2024-02-19 09:30:01       48 阅读
  6. Nginx错误502 Bad Gateway

    2024-02-19 09:30:01       53 阅读
  7. AutoSAR(基础入门篇)7.3-使用DEV配置SWC&RTE

    2024-02-19 09:30:01       52 阅读
  8. Rust-所有权(ownership)

    2024-02-19 09:30:01       53 阅读
  9. Rust语言之sha-256爆破

    2024-02-19 09:30:01       49 阅读