1、点亮LED灯
学习单片机的第一件事就是点亮LED灯,学习ARM开发,也不例外,先拿LED来开刀
我们如何开始呢?我们分为3步:
- 看原理图 ----- 确定引脚连线
- 看芯片手册 ----- 确定引脚功能
- 写程序 ----- 完成功能开发
以后每个裸板程序都是按照这个步骤来的。
Ⅰ、打开原理图
原理图需要看懂哪一些东西呢?对于LED灯,只需要知道点亮LED是高电平还是低电平。
打开原理图,我靠,密密麻麻,怎么找啊
别紧张,在查找框中输入LED。由图可以看出LED外接3.3v,LED是发光二极管,只有两端有电压差才会亮,所以是低电平亮,高电平灭。
看原理图的真正目的是找到芯片连接的管脚。LED1连接着GPF4,目的达成
Ⅱ、打开芯片手册
全英文,什么鬼,如何下手?
为了先有个体验,不提倡从头看到尾再来开发,那样会失去兴趣的。前面原理图指明LED1连接在GPF4上,那么先搜索GPF4看看。往下一直找,发现这样的表格。需要都统哪些东西呢?我们不妨来想一想,我们需要什么。要点亮LED,需要高电平来驱动,那么引脚就需要具有输出功能以及能输出1数据。
GPFCON寄存器就是控制引脚输出方向的,如果要让GPF4具有输出功能,那么只要往寄存器GPFCON的bit8-bit9写入01即可。如何写入呢?注意到ARM上寄存器都是有地址的,只要往地址0x56000050起始的32位中的bit8-bit9写入数据即可。
GPFDAT就是用来存放0或者1寄存器的,这个寄存器加上控制寄存器就可以输出0或者1。
?,三个步骤已经完成两个了,剩下编程,如何编程呢?
Ⅲ、汇编编程
为什么是汇编编程呢,因为ARM裸机就是什么都没有,只有一堆硬件。我们需要汇编这种机器级的语言,因为C语言需要栈,此时我们还没有分配栈呢,所以没有办法运行c程序。
这里会用到的汇编指令:
ldr:读寄存器 ldr r0,[x];将地址x上的4字节内容加载到寄存器r1上
str:写寄存器 str r0,[x];将r0写到地址x上,也是4个字节
mov:移动赋值数据 mov r0,r1;把r1的值赋给r0
B: 跳转指令 b halt; 跳到目标halt处执行
伪指令:ldr r0,=0x12345678;作用是为了给r0赋任意值,它本身会被拆成多条指令
?,为了写个点灯程序,真的不容易。开始撸吧。
如何利用上述的汇编语句向寄存器写入值呢?
很简单,无非就是将地址和数据利用ldr存放在寄存器中,再利用str将数据写入到地址中。0x56000050代表的就是GPFCON寄存器,0x100就是bit[8:9] = 10也就是输出功能
因此,输出高电平也是操作寄存器的。
ldr r1, =0x56000050
ldr r0, =0x100 /* mov r0, #0x100 */
str r0, [r1]
完整代码!!!!
.text表明后面编译的存放在代码段
.global _start设置为全局变量,这样链接器就知道从哪里开始执行程序
_start:是Linux作为程序的默认进入点
b halt:相当于while(1)
Ⅳ、编译
写完程序,还不能运行,需要借助Linux交叉编译工具,进行编译。
如何利用这些命令进行编译,自己百度,哈哈哈!!!
先编译:
arm-linux-gcc -c -o led_on.o led_on.s
再链接:
arm-linux-ld -Ttext 0 led_on.o -o led_on.elf
生成bin文件:
arm-linux-objcopy -O binary -S led_on.elf led_on.bin
Ⅴ、运行
用烧录器烧录到nandflash,板子启动之后就可以看到LED1亮起来了
终于完成了点灯,相比keil只写main函数要复杂的多。加油吧!!!