S3C2440汇编点灯

目录

    • 如何点灯
    • 主芯片输出的两种情况
    • 引脚驱动能力不足的情况
    • 原理图导读
    • 芯片手册导读
      • 总结
        • IO配置
        • 状态配置
    • 程序的编写
      • 几条汇编
      • 编程
      • 交叉编译
    • 上传并烧写

如何点灯

步骤如下

  • 1、看原理图确定控制LED的引脚

  • 2、看主芯片手册确定如何设置/控制引脚
    这里JZ2440的芯片,就是S3C2440

  • 3、写程序

主芯片引脚输出高电平或低电平就可以改变LED状态
我们不关心GPIO引脚输出的逻辑电压,只关心高电平或低电平

主芯片输出的两种情况

第一种
S3C2440汇编点灯_第1张图片
此时主芯片

  • 输出3.3V电压,点亮LED
  • 输出0V电压,熄灭LED

第二种
S3C2440汇编点灯_第2张图片
此时主芯片

  • 输出0V电压,点亮LED
  • 输出3.3V电压,熄灭LED

引脚驱动能力不足的情况

有可能有的引脚能够发出的最大电流不能够点亮LED
这时候就需要我们来改进这个电路——
使用三极管
S3C2440汇编点灯_第3张图片
有可能芯片只能输出1.2V,但足以使得三极管导通
那么电流从3.3V处往下流动,就能点亮LED

另一种方法

S3C2440汇编点灯_第4张图片
当芯片输出低电平/0V,第一个三极管就没有办法导通
则电流流向接地的那个电阻
那么右边的那个三极管就会导通
电流流经LED,LED点亮

原理图导读

S3C2440汇编点灯_第5张图片
搜索LED可以找到LED
我们再搜索nLED
S3C2440汇编点灯_第6张图片
找到了这个引脚

注意

  • 这个nLED1在原理图中被称为net,同名的net都是连接在一起的
  • n表示低电平有效

思考:
怎么让GPF4输出1/0

  • 1、将此引脚配置为输出引脚
  • 2、设置状态

这就需要查看芯片手册

芯片手册导读

在原理图中找到了和LED相连的引脚
我们下一步就需要去芯片手册里查找,如何配置这个引脚

S3C2440汇编点灯_第7张图片
打开相应的章节

S3C2440汇编点灯_第8张图片
可以看到2440有很多引脚
我们只要去找我们需要的GPF4
去F组
S3C2440汇编点灯_第9张图片
或者直接搜索GPFCON
就能找到相应寄存器

由上表可以得知,我们需要设置GPFCON中的bit9和bit8
设置为0b01,则GPF4为输出
0b表示2进制

如何让他输出高电平/低电平
S3C2440汇编点灯_第10张图片

将对应的状态输出到对应的位即可
即配置GPFDAT的bit4

  • 0,LED点亮
  • 1,LED熄灭

总结

配置

  • GPFCON[9,8] = ob01
  • GPFDAT[4] = 0/1

下面提到的写法比较粗暴

  • 优点是,作为第一个裸板程序,它很简单
  • 缺点是,这样的配置方式会破坏寄存器的其他位,实际中并不会使用这种方法

IO配置

经过计算得知,GPFCON的bit8配置为1,对应16进制就是0x0100
S3C2440汇编点灯_第11张图片

S3C2440汇编点灯_第12张图片
参考寄存器的地址
我们就要吧0x0100写到GPFCON,即写到0x5600,0050上

状态配置

配置GPFDAT的bit4为1
S3C2440汇编点灯_第13张图片
对应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

S3C2440汇编点灯_第14张图片
以上参数仅作为了解
这样我们就生成了bin文件
S3C2440汇编点灯_第15张图片

上传并烧写

S3C2440汇编点灯_第16张图片
烧写至Nand Flash
去除eop连接,选择Nand启动并重新上电

点灯成功

S3C2440汇编点灯.MP4

你可能感兴趣的:(S3C2440,裸机相关,汇编相关,嵌入式,linux,点灯,S3C2440,JZ2440)