一、汇编指令学习

ldr r0, [r1]:假设r1的值是x,读取地址x上数据(4字节)到r0中
str r0, [r1]:假设r1的值是x,把r0的值(4字节)写到地址x上
mov r0, r1:把r1的值赋给r0,相当于c语言r0=r1
mov r0, #0x100:直接赋值操作r0=0x100
ldr r0, =0x12345678:伪指令,最后会实现r0=0x12345678。因为arm一条指令是32位除了包含数据本身还要包含指令,一条命令无法操作太长的数据
sub r0, r1, #4/寄存器:减法意思就是r0=r1-4/寄存器值
add r0, r1, #4/寄存器:加法意思就是r0=r1+4/寄存器值
bl xxx:执行两部操作1.跳转到xxx 2.返回地址(下一条指令地址)保存到lr寄存器中

二、代码编写

硬件连接(低电平点亮

寄存器
  • 寄存器地址

image.png

  • PBCON

  • GPBDAT

image.png

说明
  • 需要把PBCON配置为output,GPBDAT对应位置设置输出0/1电平
  • 配置GPB5、6、7、8为输出PBCON写入0x00015400

image.png
+配置GPB5、6、7、8输出0100值0x00000040
image.png

代码
编译环境

代码量较小使用Nas上的docker版ubuntu编译运行
/etc/init.d/ssh start:开启ssh
ssh -p 1922 root@10.0.0.2:ssh指定端口

汇编
.text
.global _start
_start:
    ldr r0, =0x56000010
    mov r1, #0x00015400
    str r1, [r0]

    ldr r0, =0x56000014
    ldr r1, =0x00000040
    str r1, [r0]
halt:
    b halt

Makefile

all:
    arm-linux-gcc -c -o led_on.o led_on.s
    arm-linux-ld -Ttext 0x00000000 led_on.o -o led_on_elf
    arm-linux-objcopy -O binary -S led_on_elf led_on.bin
clean:
    rm -f led_on.bin led_on_elf *.o
c语言
  • 指针


指针的类型决定了写入的字节数

  • C代码(点亮0010)
int main(){
    unsigned int *pGPBCON = (unsigned int *)0x56000010;
    unsigned int *pGPBDAT = (unsigned int *)0x56000014;
    *pGPBCON = 0x00015400;
    *pGPBDAT = 0x00000080;
    return 0;
}
  • 汇编代码(引导C函数)
.text
.global _start
_start:
    /*设置栈*/
    ldr sp, =4096 /*nand启动 设置在4k顶部*/
    //ldr sp, =0x4000000 + 4096 /*nor启动*/
    /*调用main*/
    bl main
halt:
    b halt
  • Makefile
all:
    arm-linux-gcc -c -o led.o led.c
    arm-linux-gcc -c -o start.o start.S
    arm-linux-ld -Ttext 0x00000000 start.o led.o -o led_elf
    arm-linux-objcopy -O binary -S led_elf led.bin
clean:
    rm -f led_on.bin led_on_elf *.o

二、程序下载

因为目前使用的是64M版本不支持minitools工具所以用supervivi结合DNW的办法


Kyseng
1 声望3 粉丝

电子爱好者一枚,利用工作空余时间记录一下学习过程