正点原子Mini Linux—汇编驱动LED

  本人现在大一,刚开学学习C语言的时候就开始接触CSDN了,现在也想在这里记录我的学习过程,因此写了这第一篇博客。
  (内容如果有错误,欢迎大家指正)

1、汇编代码编程

  今天学习了Linux ARM裸机篇的汇编LED驱动,学习了简单的GPIO使用,其大致原理和stm32的GPIO初始化类似,下面列出编程步骤:
  1、时钟的使能设置      寄存器CCGR0~CCGR6全部置位1(为了新手方便,不单独设置,具体参考IMX6ULL参考手册699页)
  2、GPIO复位的选择设     寄存器IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03复用为GPIO功能(1571页)
  3、IO引脚的属性设置     寄存器IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03(1793页)
  4、输入输出设置       寄存器GPIOx_GDIR设置输入输出(此处寄存器为GPIO1_GDIR)
  5、高低电平的设置      寄存器GPIOx_DR设置输出的电平高低(此处寄存器为GPIO1_DR)
  下面上汇编代码:

.global _start /* 全局标号 */
_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
 	ldr r1, = 0x5
	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    低转换率 48
 	*/
	ldr r0, = 0x020E02F4
	ldr r1, = 0x10B0
 	str r1, [r0]	
 	
 	/* 4、设置GPIO1_IO03为输出 */
	ldr r0, = 0x0209C004
	ldr r1, = 0x00000008
	str r1, [r0]

	/* 5、打开LED0 */
	ldr r0, = 0x0209C000
 	ldr r1, = 0
 	str r1, [r0]
 	
loop:	
	b loop        @ loop死循环 

虽然整段代码没有什么难度,但我在编写完之后烧录开发板还是出现了一点小问题,这里给出一点小意见,命令尽量小写书写,书写地址时x需要小写,后面字母可以大写(害,我就是犯了这么简单致命的错误)。

2、代码编译

因为上面编写好的汇编代码不能直接进行烧录,需要进行一系列的编译操作:
1、使用arm-linux-gnueabihf-gcc,将.c .s文件变为.o文件
2、将所有的.o文件连接为elf格式的可执行文件
3、将elf文件转为bin文件
4、将elf文件转为汇编,反汇编
为了方便之后修改程序,这里可以使用Makefile进行编写(创建的文件名字必须为Makefile)

led.bin:led.s 
	arm-linux-gnueabihf-gcc -g -c led.s -o led.o			/* gcc编译文件 */ 
	arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf	/* 链接文件,0x87800000为起始地址 */
	arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin 	/* 格式转换 */
 	arm-linux-gnueabihf-objdump -D led.elf > led.dis 		/* 反汇编 */
clean:
	rm -rf *.o led.bin led.elf led.dis

这样就能直接使用make语句进行编译,make clean进行删除,非常方便。

3、代码烧写

这里我们将通过SD卡来给开发板烧录代码,需要使用开发光盘里的imxdownlaod软件,将这个软件复制到代码目录中,在终端上执行下面的命令:

./imxdownload <.bin file> 

SD卡的位置可以通过访问 ls /dev/sd*进行查看

最后就可以将SD卡插入到开发板上,调整拨码开关,上电,LED等就会亮起来了。(恭喜进阶电灯工程师/手动滑稽)

今天的学习就是这些了,谢谢观看。

你可能感兴趣的:(正点原子Mini Linux—汇编驱动LED)