IMX6ULL裸机学习----LED正点原子在韦东山开发板上实现

前言

  • 一、IMX6ULL 启动流程?

    二、LED代码移植

    1.硬件介绍

    2.代码移植

    总结


前言

        最近在学习IMX6ULL这个开发板,手边有韦东山老师的imx6ull全功能板子,为了练习学习的初步效果,采用了正点原子的视频课程进行学习。首先移植了一个基本的LED控制实验。


提示:以下是本篇文章正文内容,下面案例可供参考

一、IMX6ULL 启动流程?

        我们手头上的开发板一般都有直接的拨码开关来控制IMX6ULL的启动方式,常见的有SD卡、USB、EMMC等。这里各位根据开发板设置一下即可。(具体IMX6ULL的启动方式选择和启动设备选择可参考正点原子的,感觉写的不错)。

我这里选择SD卡进行。

二、LED代码移植

1.硬件介绍

正点原子开发板LED原理图如下:

IMX6ULL裸机学习----LED正点原子在韦东山开发板上实现_第1张图片

 韦东山开发板LED原理图如下:

 IMX6ULL裸机学习----LED正点原子在韦东山开发板上实现_第2张图片

2.代码移植

原子采用的是GPIO1_3,韦东山开发板采用的是GPIO5_3.其配在过程主要如下:

①、使能 GPIO 对应的时钟( 原子已经全部开启,可以不用动
②、设置寄存器 IOMUXC_SW_MUX_CTL_PAD_XX_XX ,设置 IO 的复用功能,使其复用
GPIO 功能( 设置对应引脚 )。
③、设置寄存器 IOMUXC_SW_PAD_CTL_PAD_XX_XX ,设置 IO 的上下拉、速度等( 设置对应引脚 )。
④、第②步已经将 IO 复用为了 GPIO 功能,所以需要配置 GPIO ,设置输入 / 输出、是否使
用中断、默认输出电平等( 设置对应引脚 )。

例程中,对应的引脚地址已全部更改,注释保留原子的,具体大家可以上原子网站找,同时为开发板上电,有微弱电流,会使LED亮,为确保修改成功,添加了延时函数,大家调整delay中的r2即可观察到闪烁频率的不同。具体代码如下:

.global _start  /* 全局标号 */

/*
 * 描述:	_start函数,程序从此函数开始执行此函数完成时钟使能、
 *		  GPIO初始化、最终控制GPIO输出低电平来点亮LED灯。
 */
_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、设置GPIO5_IO03复用为GPIO1_IO03 */
	ldr r0, =0X2290014	/* 将寄存器SW_MUX_GPIO1_IO03_BASE加载到r0中 */
	ldr r1, =0X5		/* 设置寄存器SW_MUX_GPIO1_IO03_BASE的MUX_MODE为5 */
	str r1,[r0]

	/* 3、配置GPIO5_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, =0X02290058	/*寄存器SW_PAD_GPIO1_IO03_BASE */
    ldr r1, =0X10B0
    str r1,[r0]

	/* 4、设置GPIO5_IO03为输出 */
    ldr r0, =0X020AC004	/*寄存器GPIO1_GDIR */
    ldr r1, =0X0000008		
    str r1,[r0]

flash:
	/* 5、打开LED0
	 * 设置GPIO5_IO03输出低电平
	 */
	ldr r0, =0X020AC000	/*寄存器GPIO1_DR */
    ldr r1, =0		
    str r1,[r0]
	
	bl delay

	ldr r0, =0X020AC000
	ldr r1, =8
	str r1,[r0]
	
	bl delay

	b flash
 

/*
 * 描述:	loop死循环
 */
loop:
	b loop 				

	
// 延时函数:函数名:delay
delay:
	ldr r2, =1000000
	ldr r3, =0x0
delay_loop:	
	sub r2, r2, #1				//r2 = r2 -1
	cmp r2, r3					// cmp会影响Z标志位,如果r2等于r3则Z=1,下一句中eq就会成立
	bne delay_loop
	mov pc, lr					// 函数调用返回


总结

仅仅用于学习中笔记的记录,LED在不同开发板实现要点:

1、不同开发板启动方式有EMMC、SD卡和USB,这里仅仅是裸机学习,因此可以采用SD卡和USB,这里采用SD卡进行,USB暂未进行。

2、对于不同引脚,应该进行修改

3、用汇编添加了延时函数

你可能感兴趣的:(RAM裸机编程,linux,c语言,imx)