一、汇编指令学习
ldr r0, [r1]
:假设r1的值是x,读取地址x上数据(4字节)到r0中str r0, [r1]
:假设r1的值是x,把r0的值(4字节)写到地址x上mov r0, r1
:把r1的值赋给r0,相当于c语言r0=r1mov r0, #0x100
:直接赋值操作r0=0x100ldr 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寄存器中
二、代码编写
硬件连接(低电平点亮)
寄存器
寄存器地址
PBCON
GPBDAT
说明
- 需要把PBCON配置为output,GPBDAT对应位置设置输出0/1电平
- 配置GPB5、6、7、8为输出PBCON写入0x00015400
+配置GPB5、6、7、8输出0100值0x00000040
代码
编译环境
代码量较小使用Nas上的docker版ubuntu编译运行/etc/init.d/ssh start
:开启sshssh -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的办法
- win10可用DNW说明
- supervivi截图,选择v下载到nand flash
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。