做网站虚拟主机要多大,网络营销app有哪些,DW网站建设出现哪些问题,购物网站 后台嵌入式Linux驱动开发——汇编点灯 本文章开始记录学习嵌入式Linux的过程#xff0c;使用的开发板是正点原子的阿尔法#xff0c;以及左老师的书籍和视频。然后这个系列不会介绍基础知识#xff08;书上都有#xff09;#xff0c;主要是记录思考过程以及需要注意的点。 代…嵌入式Linux驱动开发——汇编点灯 本文章开始记录学习嵌入式Linux的过程使用的开发板是正点原子的阿尔法以及左老师的书籍和视频。然后这个系列不会介绍基础知识书上都有主要是记录思考过程以及需要注意的点。 代码编写
使能时钟
这个地方的代码还是很简单的主要就是去哪找CCM的地址不过也不算难找比如CCGR0就是0x020c4068。
然后找到GPIO1的时钟由CCM_CCGR1 的 bit27 和 bit26 这两个位控制将这两个位都设置位 11 即可 .global _start /* 全局标号 */
/** 描述 _start函数程序从此函数开始执行此函数完成时钟使能、* GPIO初始化、最终控制GPIO输出低电平来点亮LED灯。*/
_start:/* 1、使能GPIO1时钟 */ldr r1, 0xFFFFFFFF ldr r0, 0X020C406C /* CCGR1 */str r1, [r0].global _start: 这是一个全局标签标记了程序的起始位置。_start: 这是程序的入口点程序将从这里开始执行。ldr r1, 0xFFFFFFFF: 这一行使能CCGR1。ldr r0, 0X020C406C: 这一行将立即数 0X020C406C 加载到寄存器 r0 中这个值是GPIO1的时钟寄存器的地址。str r1, [r0]: 这一行将寄存器 r1 中的值写入到地址为 r0 的内存位置即将生成的掩码写入到GPIO1的时钟寄存器从而启用GPIO1时钟。
设置复用
ldr r0, 0X020E0068: 这一行将立即数 0X020E0068 加载到寄存器 r0 中这个值是SW_MUX_GPIO1_IO03_BASE寄存器的地址也是像上面那样找。这个寄存器用于控制GPIO1_IO03引脚的复用功能。ldr r1, 0X5: 这一行将立即数 0X5 加载到寄存器 r1 中。在i.MX系列处理器中设置为5的MUX_MODE表示该引脚被设置为GPIO模式即将该引脚设置为普通GPIO引脚功能。str r1, [r0]: 这一行将寄存器 r1 中的值写入到地址为 r0 的内存位置即将MUX_MODE设置为5从而将GPIO1_IO03引脚的复用功能设置为GPIO1_IO03。 /* 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]设置IO /* 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, 0X10B0str r1,[r0]
设置GPIO
这个的地址有一点点不一样在GPIO Memory Map/Register Definition里面。 /* 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 编译
这四条命令用于将汇编代码编译、链接、转换为二进制文件并生成反汇编文件具体作用如下
arm-linux-gnueabihf-gcc -g -c led.s -o led.o arm-linux-gnueabihf-gcc使用arm-linux-gnueabihf工具链中的gcc编译器。-g生成带有调试信息的目标文件。-c表示只编译不链接。led.s源文件名这里是汇编代码文件。-o led.o指定输出的目标文件名为led.o这里是编译后的目标文件。 arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf arm-linux-gnueabihf-ld使用arm-linux-gnueabihf工具链中的ld链接器。-Ttext 0X87800000指定链接地址这里设置程序的起始地址为0X87800000。led.o输入的目标文件名即刚刚生成的目标文件。-o led.elf指定输出的可执行文件名为led.elf这里是链接后的可执行文件。 arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin arm-linux-gnueabihf-objcopy使用arm-linux-gnueabihf工具链中的objcopy工具。-O binary指定目标文件的格式为二进制。-S去除调试符号和调试信息。-g保留全局符号信息。led.elf输入的可执行文件名即刚刚生成的可执行文件。led.bin指定输出的二进制文件名为led.bin这里是转换后的二进制文件。 arm-linux-gnueabihf-objdump -D led.elf led.dis arm-linux-gnueabihf-objdump使用arm-linux-gnueabihf工具链中的objdump工具。-D显示反汇编代码。led.elf输入的可执行文件名即刚刚生成的可执行文件。 led.dis将反汇编的结果输出到led.dis文件中这里是生成的反汇编文件。
kaliubuntu:~/linux/driver/01_leds$ arm-linux-gnueabihf-gcc -g -c led.s -o led.o
kaliubuntu:~/linux/driver/01_leds$ arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf
kaliubuntu:~/linux/driver/01_leds$ arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
kaliubuntu:~/linux/driver/01_leds$ arm-linux-gnueabihf-objdump -D led.elf led.dis
makefile
led.bin:led.sarm-linux-gnueabihf-gcc -g -c led.s -o led.oarm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elfarm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.binarm-linux-gnueabihf-objdump -D led.elf led.dis
clean:rm -rf *.o led.bin led.elf led.dis这个Makefile文件用于管理编译、链接、转换和清理操作具体作用如下 led.bin: led.s定义了一个目标文件led.bin它依赖于led.s文件。也就是说当led.s文件被修改时会触发后续的编译、链接、转换操作。 arm-linux-gnueabihf-gcc -g -c led.s -o led.o编译led.s文件为目标文件led.o这里使用了arm-linux-gnueabihf工具链中的gcc编译器并且指定生成带有调试信息的目标文件。 arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf链接led.o文件为可执行文件led.elf这里使用了arm-linux-gnueabihf工具链中的ld链接器并且指定了链接地址为0X87800000。 arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin将led.elf文件转换为二进制文件led.bin这里使用了arm-linux-gnueabihf工具链中的objcopy工具并且指定了输出的文件格式为二进制。 arm-linux-gnueabihf-objdump -D led.elf led.dis生成反汇编文件led.dis这里使用了arm-linux-gnueabihf工具链中的objdump工具并且指定了显示反汇编代码。 clean:定义了一个伪目标clean用于清理生成的目标文件和中间文件。 rm -rf *.o led.bin led.elf led.dis删除所有的目标文件和生成的二进制文件以及反汇编文件。
代码烧录 这个就是使用imxdownload比较简单 kaliubuntu:~/linux/driver/01_leds$ ./imxdownload led.bin /dev/sdb
I.MX6ULL bin download software
Edit by:zuozhongkai
Date:2019/6/10
Version:V1.1
log:V1.0 initial version,just support 512MB DDR3V1.1 and support 256MB DDR3
file led.bin size 88Bytes
Board DDR SIZE: 512MB
Delete Old load.imx
Create New load.imx
Download load.imx to /dev/sdb ......
61 records in
61 records out
3160 bytes (3.2 kB, 3.1 KiB) copied, 0.0569602 s, 55.5 kB/s
结果