如何点灯
步骤如下
-
1、看原理图确定控制LED的引脚
-
2、看主芯片手册确定如何设置/控制引脚
这里JZ2440的芯片,就是S3C2440 -
3、写程序
主芯片引脚输出高电平或低电平就可以改变LED状态
我们不关心GPIO引脚输出的逻辑电压,只关心高电平或低电平
主芯片输出的两种情况
第一种
此时主芯片
- 输出3.3V电压,点亮LED
- 输出0V电压,熄灭LED
第二种
此时主芯片
- 输出0V电压,点亮LED
- 输出3.3V电压,熄灭LED
引脚驱动能力不足的情况
有可能有的引脚能够发出的最大电流不能够点亮LED
这时候就需要我们来改进这个电路——
使用三极管
有可能芯片只能输出1.2V,但足以使得三极管导通
那么电流从3.3V处往下流动,就能点亮LED
另一种方法
当芯片输出低电平/0V,第一个三极管就没有办法导通
则电流流向接地的那个电阻
那么右边的那个三极管就会导通
电流流经LED,LED点亮
原理图导读
搜索LED可以找到LED
我们再搜索nLED
找到了这个引脚
注意
- 这个nLED1在原理图中被称为net,同名的net都是连接在一起的
- n表示低电平有效
思考:
怎么让GPF4输出1/0
- 1、将此引脚配置为输出引脚
- 2、设置状态
这就需要查看芯片手册
芯片手册导读
在原理图中找到了和LED相连的引脚
我们下一步就需要去芯片手册里查找,如何配置这个引脚
打开相应的章节
可以看到2440有很多引脚
我们只要去找我们需要的GPF4
去F组
或者直接搜索GPFCON
就能找到相应寄存器
由上表可以得知,我们需要设置GPFCON中的bit9和bit8
设置为0b01,则GPF4为输出
0b表示2进制
如何让他输出高电平/低电平
将对应的状态输出到对应的位即可
即配置GPFDAT的bit4
- 0,LED点亮
- 1,LED熄灭
总结
配置
- GPFCON[9,8] = ob01
- GPFDAT[4] = 0/1
下面提到的写法比较粗暴
- 优点是,作为第一个裸板程序,它很简单
- 缺点是,这样的配置方式会破坏寄存器的其他位,实际中并不会使用这种方法
IO配置
经过计算得知,GPFCON的bit8配置为1,对应16进制就是0x0100
参考寄存器的地址
我们就要吧0x0100写到GPFCON,即写到0x5600,0050上
状态配置
配置GPFDAT的bit4为1
对应16进制是0x10
即将0x10写入GPFDAT,即写入0x5600,0054,此时熄灭
吧0写到地址0x5600,0054,此时点亮
程序的编写
几条汇编
在开始编程前,先看几条简单的汇编
-
1、LDR(load)
读内存命令(4个字节)
例:LDR R0,[R1]
假设R1的值是x,读取地址X上的数据(四个字节),到R0中 -
2、STR(store)
写内存命令
STR R0,[R1]
假设R1的值是x,把R0的值写道地址x(四个字节) -
3、B (跳转)
-
4、MOV(move)
MOV R0,R1
把R1的值赋值给R0
MOV R0,#0x100
R0=0x100 -
5、LDR R0,=0X12345678
这是一条伪指令,它会被超分为几条阵阵的arm指令
为什么引出这条指令?
比如这样一条指令
MOV R0,#0X12345678
arm的指令是32位,有一部分表示MOV,一部分表示R0
剩余的不足32位,不能表示任意值,只能表示简单值(立即数)
所以引入伪指令
编程
我们写的第一个程序,指的是汇编
以前写的单片机程序,一上来就写main,那是因为它们一开始就封装好了
/*
*点亮LED:GPF4
*/
.text //表明它是代码段
.global _start
_start:
/*配置GPF4为输出引脚
*把0x100写到地址0x56000050上,熄灭led
*/
ldr r1, =0x56000050 /*将这个地址存放到r1中*/
ldr r0, =0x100 /*或者使用 mov r0, #0x100 将0x100放入r0 */
str r0, [r1] /*将r0的值写入到r1的地址中*/
/*设置GPF4输出高电平
*把0x00写到地址0x56000054上,点亮led
*/
ldr r1, =0x56000054 /*将这个地址存放到r1中*/
ldr r0, =0 /*或者使用 mov r0, #0x100 将0放入r0 */
str r0, [r1] /*将r0的值写入到r1的地址中*/
halt: /*假设这个程序只有十几个字节*/
b halt /*这十几个字节后的内容是不确定的,所以要让他在这里死循环*/
注意,最后需要有一个空行,否则汇编的时候会报警告
我们是在windows下编辑这个程序
编辑结束后,上传到linux服务器编译
编译得到bin文件后,再拉回到windows
最后烧写到开发板上
交叉编译
关于交叉编译,可以参考我之前的博文
https://blog.csdn.net/qq_28258885/article/details/110630897
将之前写好的汇编.S文件放入ubuntu
编译的流程参考我的这篇博文
https://blog.csdn.net/qq_28258885/article/details/111554614
arm-linux-gcc -c led_on.S -o led.o
由于已经是.S了,所以我们直接进行汇编,所以参数是-c
arm-linux-ld -Ttext 0 led.o -o led.elf
可能存在汇编多个文件出现多个.o,这个步骤是将它们链接起来,生成elf
-Ttext 0 的含义就是让程序从地址0开始执行
上方有关编译流程的博文指出,elf不能放在flash中
所以我们接下来要将elf文件转成bin文件
arm-linux-objcopy -O binary -S led.elf led.bin
以上参数仅作为了解
这样我们就生成了bin文件
上传并烧写
烧写至Nand Flash
去除eop连接,选择Nand启动并重新上电
点灯成功
S3C2440汇编点灯.MP4