全部博文(36)
分类: 嵌入式
2012-08-16 13:06:05
正式开始裸机实验啦,这个是非常重要的一步。Mini2440入手已经比较久了,可是都没有怎么玩过,总是各种蛋疼的事,所以趁着现在时间比较充裕的时候,从最基础的全部玩一遍。首先是裸机,其实所谓裸机就是没有带操作系统的,所有的硬件资源都是开放你给玩的,你完全可以把它当做一个高级一点的单片机使用,比普通的单片机就是操作稍微复杂一些,其他都是差不多的。
那么我们为什么要进行裸机实验了,注意这里说的是实验,因为在工程项目中,2440是不可能用于裸机的,到现在我接触的行业中的,都是带着操作系统跑的,只是底层更新的快慢问题。所以我们这里只是做实验来学习,因为裸机让我们从底层更加理解ARM CPU的操作过程,对以后带上操作系统进行开发非常重要,当然还有bootloader的移植也是一样。
我用的实验软件是ADS,这也是非常常用的一款软件,ARM公司推出的,我们实验的话用它还是比较容易的,基本用不了它太多的功能,我们主要的目的是学习2440这款芯片的各种功能用法。
在进行裸机之前,介绍一下一个重要的模板,我们实验的时候可以在这个模版上进行,这个模板把所有进行实验前的环境都进行了设置,那么我们也还是得对模版进行了解一下。
1.下面这个是头文件
2.下面这个是源文件
关于头文件:
2440addr.h:2440的寄存器变量和地址的定义,这样我们就可以直接使用寄存器变量名进行操作
2440addr.inc:汇编语言定义的2440的寄存器变量和地址
2440lib.h::包含了一些常用的函数声明,如串口打印,LCD背光控制
2440slib.h:也是一些函数的声明,主要是关于MMU的
def.h:常用的宏定义,如U32,BYTE,大小等
IIC.h:iic实验的时候的一些宏定义和函数声明
Memcfg.inc:内存bank配置文件
mmu.h:mmuc相关的一些宏定义
关于源文件:
2440lib.c:2410PLL UART LED 端口初始化,这个我们一般都是自己在主文件中实现
2440slib.s:MMU CACHE TLB等功能的一些相关汇编操作
init.s:启动程序,主要是配置内存,ISR,堆栈,为进入我们的c环境做准备
Main.c:主函数,我们主要就是在这个里面进行实验代码的书写了。
mmu.c:mmu相关操作的函数
看了上面的模版,我们基本清楚了,我们实验主要就是在Main文件中进行了,所以我们看一下最原始的Main文件的代码
/*************************************************
Function name: 这是基础实验的一个模版
Parameter : 无
Description : 做基础实验,直接调用该模板即可
Return : 无
Argument : 无
Autor & date : Daniel
**************************************************/
#define GLOBAL_CLK 1
#include
#include
#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"
#include "mmu.h"
#include "profile.h"
#include "memtest.h"
#define LED1 (1<<5)
#define LED2 (1<<6)
#define LED3 (1<<7)
#define LED4 (1<<8)
#define KEY1 (1<<0)
#define KEY2 (1<<3)
#define KEY3 (1<<5)
#define KEY4 (1<<6)
/*************************************************
Function name: delay
Parameter : times
Description : 延时函数
Return : void
Argument : void
Autor & date :
**************************************************/
void delay(int times)
{
int i;
for(;times>0;times--)
for(i=0;i<4000;i++);
}
/*************************************************
Function name: Main
Parameter : void
Description : 主功能函数
Return : void
Argument : void
Autor & date :
**************************************************/
void Main(void)
{
Set_Clk();
MMU_Init();
}
上面的Main函数里面的两个函数请注意一下.
第一个是设置时钟的。这样各个部分才能按照正常的规范工作。
第一个是mmu初始化的,主要是用于中断相关的部分,因为我们的中断向量表默认是在虚拟0x0处,所以我们必须把它映射到物理地址0x30000000,也是RO_BASE处。
主体框架出来了,我们即将开始裸奔了,但是我们还是可以看看启动文件,分析一下。