文章目录
- 一.硬件知识
-
- 1.LED原理图
- 2.芯片手册
-
- Ⅰ.找LED原理图
- Ⅱ.找对应引脚
- Ⅲ.在芯片手册中查找引脚信息
- Ⅳ.查看寄存器说明
- Ⅴ.配置寄存器
- 二.S3C2440框架与启动过程
- 三.要用到的软件
-
- 1.远程登陆工具 MobaXterm
- 2.FTP传输工具FileZilla
- 3.交叉编译工具arm-linux-gcc
- 四.编写点亮LED的程序
-
- 1.汇编语言版
- 2.C语言版
2020.3.18-19
裸机点亮LED可以分为三步:
-
看原理图,确定控制LED的引脚
-
看芯片手册,确定如何设置/控制引脚
-
编写驱动程序
一.硬件知识
1.LED原理图
原理图将LED抽象化,就像下面这样:
或者如下,控制芯片引脚输出0V来点亮LED:
如示,这种情况,引脚输出1.2V低电压,使第一个三极管导通,这样俩个三极管的连接点电压就接近于0(导通了第一个三极管的GND),这样第二个三极管就不能导通,LED处于熄灭状态;反之,当引脚输出低电平时,俩个三极管之间有电压,第二个三极管导通,点亮LDE,间接实现了引脚低电平点亮LED:
Ⅱ.找对应引脚
根据同名的nLED 1(n表示低电平有效)的信息找出,与之相连的GPIO引脚,可以看出与GPF4引脚相连:
然后查看GPF4引脚所支持功能:
可以看出主要是由俩个寄存器来控制:GPFCON(配置寄存器)、GPFDAT(数据寄存器)
可以得知GPFCON的信息:
-
起始地址:0X56000050
-
可读可写
-
复位值为0
-
可以配置引脚的模式:
所以要想点亮LED1,只需要使GPF4输出低电平,可以在GPF4的GPFCON寄存器中的对应位写入01(代表输出)、在GPFDAT寄存器的对应位中写入0(代表低电平)!
也就是在:
0X56000050地址中写入0X100
0X5600054地址中写入0
二.S3C2440框架与启动过程
S3C2440的核心是SOC, SOC(System on Chip),指的是片上系统,MCU只是芯片级的芯片,而SOC是系统级的芯片,它既MCU(51,avr)那样有内置RAM、ROM同时又像MPU那样强大,不单单是放简单的代码,可以放系统级的代码,也就是说可以运行操作系统(将就认为是MCU集成化与MPU强处理力各优点二合一) 。
S3C2440中的SOC框架大体如下:
打开后输入登陆密码就可以远程登陆Ubuntu了:
3.交叉编译工具arm-linux-gcc
之前在Linux中,只要使用gcc就可以生成可执行文件,但gcc仅仅适用于PC机,要想在ARM板子上运行程序,就要生成ARM可执行的文件,这个时候就用到Linux中的交叉编译工具arm-linux-gcc了
四.编写点亮LED的程序
1.汇编语言版
要知道,能够使机器识别的语言只有0、1,也就是二进制语言,也就是机器码(一般以十六进制显示),所以程序最终都是转化为机器码执行的。
然鹅,程序员所编写的一般是C语言,或者是汇编语言,这些代码都是要经过编译器的编译后的得到机器码,然后存储在内存中,CPU会通过读写这些机器码来执行相关的程序。
所以,编写程序可以使用汇编语言,一般是C语言写的,这里体会一下汇编语言的魅力。
涉及到的汇编代码:
-
LDR(load):读内存命令
-
STR(store):写内存命令
-
B:跳转
-
MOV(move):赋值
用法如下:
出现伪指令的原因是:ARM是32位的,一次只能操作32位的指令,指令中不仅包含了值,还包含了操作对象的信息,所以当赋值过大时,就会拆分为几次指令,来实现。
0X56000050地址中写入0X100
0X5600054地址中写入0
汇编.S代码为:
接下来就是把.S代码通过FileZilla上传到Ubuntu中,经过交叉编译后,返回Windows,再由oflash烧写进S3C2440
我们可以通过交叉编译工具的反汇编,来查看我们编写的汇编代码的机器码形式:

可以看出,我们反汇编所得到的汇编码与我们的不同,这是因为我们编写汇编语言的时候用到了伪指令,而反汇编的时候已经转换为汇编语言的正规军了。此外也可以查看机器码与汇编码的关系,可以通过手册来查看汇编代码与机器码之间的关系,更进一步加深我们对程序的理解。
2.C语言版
C语言实现点亮LED,通过对GPF4的对应寄存器地址实现操作来。
C的main函数如下:
看起来和我们平常写的代码没有什么区别,仔细看一下,发现少了头文件:#include
这是因为我们不需要C的stdio库,我们只是利用了C语言中的指针,对内存地址进行赋值而已。
但问题来了,main函数中的指针指向的地址以何为标准main函数中也没有指明,而且烧录之后,ARM又是怎么调用main函数呢
所以还有写一个引导程序,用汇编写一个引导程序的作用有俩点:
- 确定地址在ARM内存中的起始位置,也就是分配内存空间
- 引导ARM加载main函数
写的汇编代码如下:
然后通过FTP软件将.c文件和.S文件传到Ubuntu中,利用交叉编译工具将C文件和S文件分别编译,然后链接起来,最后生成.bin文件,再传回主机,通过oflash将持续烧写到Nand FLASH。
一切就绪后,LED可以正常点亮。
这就是裸机开发的流程。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!