驱动开发指南 第八章 汇编LED灯实验

《I.MX6U 嵌入式 x Linux 驱动开发指南 V1.6 6》第八章 汇编LED灯实验

正点原子【第二期】手把手教你学Linux之ARM(MX6U)裸机篇

视频选集时间
P6第6.1讲 汇编LED驱动实验-原理分析 35:31
P7第6.2讲 汇编LED驱动实验-汇编基本语法 28:07
P8第6.3讲 汇编LED驱动实验-驱动编写 30:55
P9第6.4讲 汇编LED驱动实验-编译程序 22:45
P10第6.5讲 汇编LED驱动实验-烧写bin文件到SD卡中并运行27:43

硬件环境

正点原子Linux开发板(ALIENTEK I.MX6U ALPHA V2.2)
底板+核心板(EMMC版)+7寸RGB屏1024*600'
SD卡+USB读卡器

硬件原理图
在这里插入图片描述
在这里插入图片描述
请添加图片描述
GPIO1_IO03 输出低电平点亮、输出高电平熄灭

根据芯片手册查看寄存器应该如何设置

时钟树 CCM 相关寄存器
CCM_CCGRx 配置为 0xFFFFFFFF | 复位值均为 0xFFFFFFFF

IO复用 IOMUXC 相关寄存器
IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 配置为 0x00000005
IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03 配置为 0x000010B0

IO配置 GPIO 相关寄存器
GPIO1_GDIR 的 bit[3] 配置为 1 时作为输出
GPIO1_DR 的 bit[3] 配置为 0 时输出低电平点亮 | 配置为 1 时输出高电平熄灭

led.s

.global _start

_start:
#if 0
	/**
	 * CCM_CCGR0
	 * CG1  bit[ 3: 2]:11 aips_tz2_clk_enable
	 * CG0  bit[ 1: 0]:11 aips_tz1_clk_enable
	 */
	ldr r0, = 0x020C4068 /* 寄存器 CCGR0 */
	ldr r1, = 0x0000000F
	str r1, [r0]
	
	/**
	 * CCM_CCGR1
	 * CG13 bit[27:26]:11 gpio1_clk_enable
	 * CG9  bit[19:18]:11 sim_s_clk_enable
	 */
	ldr r0, = 0x020C406C /* 寄存器 CCGR1 */
	ldr r1, = 0x0C0C0000
	str r1, [r0]
	
	/**
	 * CCM_CCGR2
	 * CG8  bit[17:16]:11 ipmux1_clk_enable
	 */
	ldr r0, = 0x020C4070 /* 寄存器 CCGR2 */
	ldr r1, = 0x00030000
	str r1, [r0]
	
	/**
	 * CCM_CCGR3
	 * CG10 bit[21:20]:11 mmdc_core_aclk_fast_core_p0_enable
	 */
	ldr r0, = 0x020C4074 /* 寄存器 CCGR3 */
	ldr r1, = 0x00300000
	str r1, [r0]
	
	/**
	 * CCM_CCGR4
	 * CG7  bit[15:14]:11 pl301_mx6qper2_mainclk_enable
	 * CG3  bit[11:10]:11 sim_cpu_clk_enable
	 */
	ldr r0, = 0x020C4078 /* 寄存器 CCGR4 */
	ldr r1, = 0x0000C0C0
	str r1, [r0]
	
	/**
	 * CCM_CCGR5
	 * CG8  bit[17:16]:11 sim_main_clk_enable
	 */
	ldr r0, = 0x020C407C /* 寄存器 CCGR5 */
	ldr r1, = 0x00030000
	str r1, [r0]
	
	/**
	 * CCM_CCGR6
	 */
	ldr r0, = 0x020C4080 /* 寄存器 CCGR6 */
	ldr r1, = 0x00000000
	str r1, [r0]
#endif
	/* 2、设置 GPIO1_IO03 复用为 GPIO1_IO03 */
	ldr r0, = 0x020E0068 /* 将寄存器 SW_MUX_GPIO1_IO03_BASE 加载到 r0 中 */
	ldr r1, = 0x00000005 /* 设置寄存器 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, = 0x00000000
	str r1, [r0]
	
loop:
	b loop

Makefile

ARM_LINUX_IMX6ULL=/home/xlbtlmy/Desktop/IMX6ULL/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin
PREFIX_IMX6ULL=arm-linux-gnueabihf-

CC=$(ARM_LINUX_IMX6ULL)/$(PREFIX_IMX6ULL)gcc
LD=$(ARM_LINUX_IMX6ULL)/$(PREFIX_IMX6ULL)ld
OBJCOPY=$(ARM_LINUX_IMX6ULL)/$(PREFIX_IMX6ULL)objcopy
OBJDUMP=$(ARM_LINUX_IMX6ULL)/$(PREFIX_IMX6ULL)objdump

IDD=./imxdownload
SD=/dev/sdb

led.bin:led.s
	$(CC) -g -c led.s -o led.o
	$(LD) -Ttext 0x87800000 led.o -o led.elf
	$(OBJCOPY) -O binary -S -g led.elf led.bin
	$(OBJDUMP) -D led.elf > led.dis

sd:
	chmod +x $(IDD)
	$(IDD) led.bin $(SD)
	sync

clean:
	rm -rf *.o *.bin *.elf *.dis load.imx

编译

make

烧录到SD卡

make sd

开发板设置成从SD卡启动

即可观察到LED0点亮

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值