原创 点亮第一盏灯 (ARM LPC2131 Proteus + Keil For ARM)

ARM 9浏览

学习ARM最基本的是能够让系统跑起来,起码能跑到main函数,控制一个GPIO。
如此一来点亮一盏LED灯就是入门操作了。

1. 建立Keil工程
Open Keil -> File -> New -> Project -> NXP -> LPC2131

第一步可以用Keil自带的Startup.s来学习

在工程配置里面勾上产生HEX文件,便于Proteus仿真用

同时选择Debug为Proteus,这样就可让Proteus和Keil联调了。

下面开始画Proteus电路图如下:

Proteus基本电路图很简单,基本上只要电源、接地接对了就可以跑了。

96919749-9fd9-40b2-a40b-0263ab637fac.JPG

这样设置就可以让Keil和Proteus联调了

接下来就是写ARM的Code,由于我们用来Keil默认的Startup.s,所以第一步先不碰可怕的汇编。
像写PC程序一样写个main函数如下:

int main(void)
{
    while(1);
}

编译通过,产生Hex文件,用如下方式让Proteus的ARM连接上Keil编译的HEX程序

这样Proteus就设定了ARM的程序输入的HEX文件

到这里就可用Keil和Proteus联调debug,虽然代码只有while(1),但是可以调试的。

接下来就是如何通过控制GPIO来点亮LED灯了。

了解2131控制GPIO有如下步骤:
1. 设置PIN的功能选择为GPIO
2. 设置PIN的输出方向
3. 设置PIN输出的电平1/0
对应程序如下:

// arm2131 ledon projec main function
#define vWriteReg(addr, val)            (*((volatile unsigned long *)(addr)) = (val))
#define dReadReg(addr)                  (*((volatile unsigned long *)(addr)))
#define vWriteRegMask(addr, mask, val)  vWriteReg(addr, dReadReg(addr) & (~(mask)) | (val&(mask)))

#define REG_BASE            (0xE0000000)
#define REG_PIN0_SEL        (REG_BASE + 0x2C000)
#define RET_IO0_ST          (REG_BASE + 0x28000)
#define REG_IO0_SET         (REG_BASE + 0x28004)
#define REG_IO0_DIR         (REG_BASE + 0x28008)
#define REG_IO0_CLR         (REG_BASE + 0x2800C)

int main(void)
{
    // P0.0 function select as GPIO
    vWriteRegMask(REG_PIN0_SEL, 0x03, 0x00);
    vWriteReg(REG_IO0_DIR, 1<<0);
    vWriteReg(REG_IO0_CLR, 1<<0);

    while(1);
}

至此LED灯就被点亮啦。

如下是相应的工程文件

http://space.ednchina.com/Upload/2009/9/5/51f78044-180d-4e17-8018-c0fb26c13e87.rar(Proteus + Keil 工程 档案)