失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 嵌入式I.MX6ULL裸机开发学习(一)汇编LED驱动程序

嵌入式I.MX6ULL裸机开发学习(一)汇编LED驱动程序

时间:2022-02-10 03:56:45

相关推荐

嵌入式I.MX6ULL裸机开发学习(一)汇编LED驱动程序

一.学习之路的开始

购买了I.MX6ULL mini开发板进行学习,开发环境为Linux,上学期的Linux课程中,我已将电脑配置好Ubuntu,熟悉了Linux基本操作。之前并没有学过怎么在物理机与虚拟机之间方便交换文件,看正点原子的视频下载了Filezilla,设置好虚拟机IP地址后,很方便就可以进行文件传输。

然后是安装交叉编译器。交叉编译器安装时,用uname -a指令才发现虚拟机的系统是32位系统,并不是之前所想的64位,安装出错,下载正确位数的交叉编译器才安装成功。

二.交叉编译器的概念

交叉编译器也叫做交叉编译工具链(cross compilation tool chain),是在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,比如在PC平台(X86 CPU)上编译出能运行在以ARM为内核的CPU平台上的程序, 编译得到的程序在X86 CPU平台上是不能运行的,必须放到ARM CPU平台上才能运行,虽然两个平台用的都是Linux系统。

三.汇编语言编写LED驱动程序

完整代码如下:

.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、设置GPIO1_IO03复用为GPIO1_IO03 */ldr r0, =0X020E0068/* 将寄存器SW_MUX_GPIO1_IO03_BASE加载到r0中 */ldr r1, =0X5/* 设置寄存器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, =0X10B0str r1,[r0]/* 4、设置GPIO1_IO03为输出 */ldr r0, =0X0209C004/*寄存器GPIO1_GDIR */ldr r1, =0X0000008str r1,[r0]/* 5、打开LED0* 设置GPIO1_IO03输出低电平*/ldr r0, =0X0209C000/*寄存器GPIO1_DR */ldr r1, =0str r1,[r0]/** 描述:loop死循环*/loop:b loop

STR将R1值0xFFFFFFFF作为R0中的值,使能CCGR时钟。在手册上可以看到CGR值为11时候,时钟在任何模式下都打开。

在核心板电路图可看到,LED0连接芯片引脚GPIO1_3口

设置IO复用方式,将其设置为GPIO。

设置复用的寄存器为IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03,寄存器地址为0x020E0068,将值设置为0101,ALT5模式,即作GPIO1功能。

同理再设置GPIO1_IO03,寄存器为IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03,查手册可得地址与寄存器各位上的功能,配置其电气属性。

GPIO1_DR控制数据。GPIO1_GDIR控制Direction Control,也就是设定是输入还是输出。

四.编译驱动程序

makefile如下:

led.bin:led.sarm-linux-gnueabihf-gcc -g -c led.s -o led.oarm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elfarm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.binarm-linux-gnueabihf-objdump -D led.elf > led.disclean:rm -rf *.o led.bin led.elf led.dis

使用交叉编译器编译led.s为led.o文件,再将.o文件链接为.elf文件,在Linux系统下可执行.elf文件,但由于目前为裸机开发,需要再继续编译为bin二进制文件才能烧录进开发板。

五.程序烧录

STM32与51是烧写进内部FLASH,但I.MX6ULL不能这样操作,必须将裸机程序写入SD卡后,SD卡插入开发板,使用SD卡启动进行烧录程序。

SD卡首先格式化为FAT32文件系统,在虚拟机Ubuntu下点右下角连接,将SD卡连接进虚拟机。bin文件烧写进SD卡并不是单纯将其拷贝进SD卡,而是要将其放入绝对地址上,SD卡绝对地址头64K存放的是关于SD卡的分区设置数据。此外bin文件还要在前面添加头部,这需要使用imxdownload软件。执行命令./imxdownload led.bin /dev/sdf,就成功烧录进SD卡。

如果觉得《嵌入式I.MX6ULL裸机开发学习(一)汇编LED驱动程序》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。