(一)arm裸机开发---汇编led驱动程序

学习新的系列,arm裸机开发。主芯片使用的是imx.6ull芯片,平台使用的是正点原子的imx.6ull alpha开发板。本节介绍汇编led驱动的开发过程。

为什么我们要用汇编来写led程序呢?因为cortex-a芯片上电之后sp指针(堆栈指针)没有初始化,没有c语言运行的环境。所以必须先用汇编语言初始化sp指针,ddr等,把c语言运行环境搭好。

一.硬件原理图

从下方原理图可以看到将GPIO1_3设置为低就可以点亮灯。
led
gpio1_3

二.初始化流程

1.使能GPIO1_3的时钟
2.设置GPIO的复用功能为io
3.设置GPIO的电器属性
4.设置GPIO的输入输出

1.使能GPIO1_3的时钟

简单起见,我们将所有模块的时钟都使能。即CCM_CCGR0~CCM_CCGR6寄存器都设置为0Xffff_ffff,地址从0x020C_4068 ~ 0x020C_4080.

2.设置GPIO的复用功能为IO

查找文献(芯片参考手册)可知,设置GPIO1_3复用功能的寄存器为IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03,地址为0x020E_0068。值要设置为0x5.

3.设置GPIO的电器属性

查找文献可知,设置GPIO1_3电器属性的寄存器为IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03,地址为
0x020E_02F4。值要设置为0x000010B0

4.设置GPIO的输入输出

查找文献可知,GPIO1_GDIR用来设置输入/输出,地址是0x0209_C004,值为0x8。
查找文献可知,GPIO1_DR用来设置输出为0还是1,地址是0x0209_C000,值为0x0

三.编写驱动程序

将上面的步骤汇编实现。

.global _start 
/*
 *描述:这是一个点亮led的项目;
 *分为以下几步:
 *1.使能GPIO1_3的时钟
 *2.设置GPIO的复用功能为io
 *3.设置GPIO的电器属性
 *4.设置GPIO的输入输出
 */

 _start:
@使能所有时钟
ldr r0,=0x020C4068
ldr r1,=0Xffffffff
str r1,[r0]

ldr r0, =0x020C406c
ldr r1, =0Xffffffff
str r1, [r0]

ldr r0, =0x020C4070
ldr r1, =0Xffffffff
str r1, [r0]

ldr r0, =0x020C4074
ldr r1, =0Xffffffff
str r1, [r0]

ldr r0, =0x020C4078
ldr r1, =0Xffffffff
str r1, [r0]

ldr r0, =0x020C407c
ldr r1, =0Xffffffff
str r1, [r0]

ldr r0, =0x020C4080
ldr r1, =0Xffffffff
str r1, [r0]

@设置GPIO的复用功能为io
ldr r0, =0x020E0068
ldr r1, =0X5
str r1, [r0]

@设置GPIO的电器属性
ldr r0, =0x020E02F4
ldr r1, =0x000010B0
str r1, [r0]

@设置GPIO的输入输出
ldr r0, =0x0209C004
ldr r1, =0x00000008
str r1, [r0]

ldr r0, =0x0209C000
ldr r1, =0x0
str r1, [r0]

@死循环
loop:
    b loop

四.编译下载

1.编写makefile

led.bin:led.s
	#gcc编译为.o文件
	arm-linux-gnueabihf-gcc -g -c led.s -o led.o
	#ld链接,并且指定运行地址
	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

.PHONY:clean
clean:
	rm -r *.o led.elf led.bin led.dis

2.烧到SD卡。

首先调整拨码开关为sd卡启动。
使用imxdownload将bin文件烧到sd卡中,前提sd卡的文件格式是fat32,给imxdownload执行权限。
chmod 755 imxdownload

#烧写
./imxdownload led.bin /dev/sdd

imxdownload 在 led.bin 文件前面添加了一些数据头以后生成load.imx 。最终烧写到 SD 卡里面的就是这个 load.imx 文件,而非led.bin。

tips:之前学51的时候,点一个灯是一个很简单的事,没想到放到arm_imx.6ull这么复杂。路漫漫其修远兮,吾将上下而求索。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值