裸板点亮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等集成开发环境,需要做的只是点击几下按钮,这样虽然方便,却会漏过很多细节的东西,所以不推荐使用集成开发环境。
/* 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等集成开发环境,需要做的只是点击几下按钮,这样虽然方便,却会漏过很多细节的东西,所以不推荐使用集成开发环境。
相关文章推荐
- tiny6410裸机实验第2章--------------点亮LED灯(原理和代码分析)
- Eboot启动代码分析
- BT源代码学习心得(七):跟踪服务器(Tracker)的代码分析(HTTP协议处理对象)
- s3c2410汇编启动代码与中断跳转分析
- s3c44b0x启动代码分析
- S3C2410软件调试总结和启动代码分析
- VC6启动代码分析
- linux 启动代码分析--xscale
- 2410启动代码分析
- Spring源代码分析之(二):IOC容器在web容器中的启动
- u-boot启动过程分析——基于lpc2210的移植代码
- BT源代码学习心得(八):跟踪服务器(Tracker)的代码分析(用户请求的实际处理)
- BT源代码学习心得(八):跟踪服务器(Tracker)的代码分析(用户请求的实际处理) 转自CSDN:gushenghua的专栏
- 重温Linux源代码 -- 启动代码
- Atmel at91rm9200的armlinux的bootloader启动代码分析
- BT源代码学习心得(六):跟踪服务器(Tracker)的代码分析(初始化)
- BT源代码学习心得(七):跟踪服务器(Tracker)的代码分析(HTTP协议处理对象)
- S3c2410软件调试总结(转载)、启动代码分析大杂烩
- ARM启动代码的分析
- NSGA-2源代码分析(1)源代码结构