嵌入式linux裸板开发--点亮LED

2019-07-13 01:02发布

啰嗦几句(* ̄︶ ̄):
时间过的好快,上次写文章是在8月底,到现在居然都3个多月了,这么长一段时间都没学习嵌入式,真是惭愧(心里小人儿都开始骂自己了:你这学习进度真是忒慢了!),首先是懒癌犯了,还有就是这段时间也确实经历很多,完成了找工作这项人生大事,还有就是准备毕业论文(这个真是着实太难了,最头疼一件事o(╥﹏╥)o)。So,博客是敦促我学习的好地方,一定得好好加油继续,这条路不能停,药不能停。 ==========这是一条很正式的,转变画风的下划线============
上一篇文章写的是linux下通过gcc完成程序源文件的编译执行的过程。以及makefile文件的编写,最后在终端平台输出myhello word!
有了这个基础,这次学习的就是通过linux编译生成的代码在ARM上完成硬件实现。因为还不涉及到系统移植,所以还是裸板程序开发。

1.源代码编写

ARM裸板程序需要代码原料主要包括:汇编文件,C文件,makefile文件。每个文件都有各自功能。
(1)汇编文件
完成关看门狗;配置时钟;初始化sdram;设置栈;以及跳转到C函数执行入口(相当于main函数),代码如下(该例程不需要配置时钟和sdram)。 @****************************************************************************** @ File:crt0.S @ 功能:通过它转入C程序 @****************************************************************************** @注:正常汇编程序还需要初始化时钟,SDRAM功能,但对于点亮LED不需要。直接使用12Mhz .text .global _start _start: @程序代码段开始处,各段在链接脚本定义 ldr r0,=0x53000000 @看门狗控制寄存器地址(32位地址赋值语句,r0地址为0x53000000) @ ldr和mov区别就是,ldr传输32位数据,而mov只能传8位数 mov r1, #0x0 @立即数赋值给r1寄存器 str r1, [r0] @把r1寄存器内的数据0x0给r0地址 @以上三条语句为看门狗控制寄存器赋值为0 ldr sp,= 4*1024 @设置堆在大小为4K(NAND FLASH前4k) bl main @跳转 到main函数,同时保存了下一条指令地址 haltloop: (2)C文件
汇编的代码量相对较少,只执行一些必要的初始化功能,真正功能部分在C文件里。C文件主要执行:寄存器地址宏定义;外设初始化;功能实现等。 本例点亮的led引脚是GPF4,因此需要查询2440的参考手册,查看GPF的相关寄存器地址,主要配置的寄存器是GPFCON(控制寄存器)和GPFDAT(数据寄存器)。GPFCON主要控制引脚的工作模式(模式有:输入,输出,复用),其中每两位控制一个引脚的状态,从下图可以看出:
这里写图片描述 引脚的高低电平由GPFDAT控制,每一位控制一个引脚,如图:
这里写图片描述 所以学会看芯片手册还是很重要的,明白各个寄存器并进行编程,同时应该掌握移位操作,在寄存器编程比较常用。该部分代码如下: #define GPFCON (*(volatile unsigned long*)0x56000050) #define GPFDAT (*(volatile unsigned long*)0x56000054) #define GPFUP (*(volatile unsigned long*)0x56000058) #define GPIO_Pin_0 ((volatile unsigned char)0x00) #define GPIO_Pin_1 ((volatile unsigned char)0x01) #define GPIO_Pin_2 ((volatile unsigned char)0x02) #define GPIO_Pin_3 ((volatile unsigned char)0x03) #define GPIO_Pin_4 ((volatile unsigned char)0x04) int main() { GPFCON = 0X01<<(GPIO_Pin_4*2); //GPF_4输出模式 GPFDAT = ~(0X01 << (GPIO_Pin_4)); //GPF_4输出0 return 0; } (3)makefile文件
编写编译规则,和上篇文章原理一样。linux有专门针对ARM的编译工具,主要用到的有这个3个:
  1. arm-linux-gcc:主要在文件编译时,由(.C/.S)文件编程成.o目标文件时使用。
  2. arm-linux-ls:主要对所有.o目标文件链接生成一个可执行文件
  3. arm-linux-objcopy:主要对可执行文件进行二进制转换成.bin可以烧录用的文件
文件代码如下: led_on.bin : crt0.S led_lighton.c arm-linux-gcc -g -c -o crt0.o crt0.S arm-linux-gcc -g -c -o led_lighton.o led_lighton.c arm-linux-ld -Ttext 0x0000000 -g -o led_on_elf crt0.o led_lighton.o arm-linux-objcopy -O binary -S led_on_elf led_on.bin clean: rm -f led_on.bin led_on_elf *.o
上述的3个文件分别为:crt0.S,led_lighton.c,Makefile。这是最简单的例程文件了,合适入门。代码文件下载地址链接:
http://download.csdn.net/download/ludaoyi88/10151739

1.文件编译链接

汇编文件和C文件需要编译链接后生成可执行文件,可执行文件再转换成.bin二进制文件,才能烧录到开发板上执行。而这些编译链接与转换都在makefile里写好,只需在linux终端输入make命令执行即可。
通过secureCRE远程登录到linux主机(这里用虚拟机),FTP文件传输工具连接到linux主机,在Windows下编写上述3个代码文件,整个过程和上篇文章一样,不再赘述。
将3个代码文件上传上linux主机的相关文件路径下,在终端键入make命令,执行makefile文件,执行结果如下图: 这里写图片描述 上述可以看到生成了led_on.bin的二进制文件,将此文件烧录到开发板,烧录方法可以用:oflash,dnw,tftpd,nfs等方法下载,前3种方法之前文章有讲解使用方法。这里使用Windows下由dnw下载程序,先将二进制文件传入window再下载(开发板应拨码至nand)。如图: 这里写图片描述 下载成功后,复位开发板,可以看到一个led灯变亮。效果如图(成功咯O(∩_∩)O哈哈~)。这仅仅是裸板开发的入门,如果有其他外设话就复杂了,同志仍需努力!
这里写图片描述