您的位置:首页 > 编程语言

裸板点亮LED流水灯源代码分析(含启动代码和C文件)

2014-10-14 15:29 579 查看
今天学习了韦东山第一期视频中的点亮LED流水灯实验,以下是源代码:

/*  start.S为启动代码,目的是初始化硬件,本实验需要初始化的硬件有:初始化外设即LED所在的端口地址,关闭关门狗*/

start.S

.globl _start

_start:

------------------------------------------------------------------------------------------

/* 硬件相关的设置 : 把外设的基地址告诉CPU */

    /* Peri port setup */

    ldr r0, =0x70000000

    orr r0, r0, #0x13

    mcr p15,0,r0,c15,c2,4       @ 256M(0x70000000-0x7fffffff)

    

/* 关看门狗 */

/* 往WTCON(0x7E004000)写0 */

ldr r0, =0x7E004000
mov r1, #0
str r1, [r0]

//以上为初始化硬件

----------------------------------------------------------------------------------------------
/* 设置栈 */
ldr sp, =8*1024     //应该预留8K内存空间,在上电启动的时候从nand flash中复制前8K的数据到预留的内存中,本次启动文件较小,其实用不了8K空间
bl xxxxx   /* 调用C函数 ,该C函数才是主函数,相当于main函数的功能*/

halt:
b halt

以下是C函数源代码:

---------------------------------------------------------------------------------------------------------------------------------

void delay()       //delay延时函数,这个应该不用再解释了吧!

{
volatile int i = 0x10000;
while (i--);

}

int xxxxx()

{
int i = 0;

volatile unsigned long *gpmcon = (volatile unsigned long *)0x7F008820;   //指向CON寄存器地址
volatile unsigned long *gpmdat = (volatile unsigned long *)0x7F008824;    //指向DAT寄存器地址

/* gpm0,1,2,3设为输出引脚 */
*gpmcon = (*gpmcon & ~0xffff) | 0x1111;

while (1)
{
*gpmdat = (*gpmdat & ~0xf) | i;
delay(0x10000);

i++;

if (i == 16)
i = 0;

}

return 0;

}

总结:裸板程序也需要自己写启动代码和C函数代码,只有这样才能深刻理解功能实现的整个过程,如果使用例如ADS等集成开发环境,需要做的只是点击几下按钮,这样虽然方便,却会漏过很多细节的东西,所以不推荐使用集成开发环境。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息