1.点亮1个led程序分析(汇编)

来源:互联网 发布:人工智能平台有哪些 编辑:程序博客网 时间:2024/06/05 09:11

最终目标:    点亮led灯

1:通过原理图,确定nLED_1的引脚关系 ---- GPF4

2:查看S3C2440手册,找到控制GPF4引脚的方法 ---- GPFCON(配置寄存器) ---- GPFDAT(数据寄存器)

3:往GPFCON和GPFDAT这两个寄存器写数据,实现点亮led灯

 

寄存器相关截图:

 

 

所以,需要点亮nLED_1,我们要通过GPFCON寄存器设置GPF4引脚作为输出引脚,通过GPFDAT寄存器设置0或1开控制LED灯的亮灭。

更直白点是,往0x56000050(GPFCON)、0x56000054(GPFDAT) 写入数据

 

汇编代码:

 

@******************************************************************************@ File:led_on.S@ 功能:LED点灯程序,点亮LED1@******************************************************************************                   .text.global _start_start:                 LDR     R0,=0x56000050      @ R0设为GPFCON寄存器。此寄存器                                        @ 用于选择端口B各引脚的功能:                                        @ 是输出、是输入、还是其他            MOV     R1,#0x00000100                    STR     R1,[R0]             @ 设置GPF4为输出口                        LDR     R0,=0x56000054      @ R0设为GPBDAT寄存器。此寄存器                                        @ 用于读/写端口B各引脚的数据            MOV     R1,#0x00000000      @ 此值改为0x00000010,                                        @ 可让LED1熄灭            STR     R1,[R0]             @ GPF4输出0,LED1点亮MAIN_LOOP:            B       MAIN_LOOP


分析:

1. LDR指令

LDR 伪指令用于加载立即数或一个地址值到指定寄存器

LDR     R0,=0x56000050    @加载地址0x56000050到R0寄存器   -----  GPFCON寄存器

 

2.MOV指令

MOV    R1,#0x00000100    @把十六进制数 0x00000100 赋值给R1寄存器 

这里的0x00000100 === 配置GPF4为输出,需要对GPFCON寄存器的[9:8]进行赋值,也就是 0000000100000000b 转换成十六进制 0x00000100


3.STR指令

 STR     R1,[R0]           @向R0寄存器写入R1寄存器的数据   即: CPFCON ===>  0x00000100    设置GPF4为输出引脚


后面的 0x56000054 的操作一样的原理


Makefile文件

---------------------------------------------------------------------

led_on.bin : led_on.S
arm-linux-gcc -g -c -o led_on.o led_on.S                                 #编译 led_on.S 
arm-linux-ld -Ttext 0x0000000 -g led_on.o -o led_on_elf     #连接成elf可执行程序, -Ttext 0x00000000 定义代码段开始地址(0地址)
arm-linux-objcopy -O binary -S led_on_elf led_on.bin           #转换elf文件为bin文件(方便烧写)
clean:
rm -f   led_on.bin led_on_elf *.o

 --------------------------------------------------------------------


烧写 --- 上电 

nLED_1 成功点亮啦~!