星星点灯(点亮LED灯)

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函数要复杂的多。加油吧!!!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值