驱动开发指南 第八章 汇编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读卡器

硬件原理图
驱动开发指南 第八章 汇编LED灯实验_第1张图片
在这里插入图片描述
请添加图片描述
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点亮

你可能感兴趣的:(Linux视频教程自学,arm,linux,imx6ull)