嵌入式开发之路(1)裸板程序LED

开发板:TX2440

开发环境:ubuntu12.04

 

在linux下用vim工具编写程序代码(启动代码,主程序,makefile),在linux下进行交叉编译,生成二进制arm可执行文件,通过vmware共享目录传输到window环境下,用jFlash烧写到arm norflash中直接运行。

 

实现目标:1)点亮单个LED灯

     2)点亮多个LED灯

       3)流水灯实验

 

实验心得:1)要学会自己编写启动代码,arm的启动代码汇编和传统汇编有一定的差异。启动代码主要是对硬件的初始化,关闭WATCHDOG防止cpu重复启动,设置堆栈,以及帮助程序跳转至主程序的main函数入口。

2)Makefile的书写需要加强

3)32位处理器的代码和传统8位mcu的差异还是比较大的,应该说,代码编写难度明显加大,需要操控的寄存器更多。同时,这一点和arm更为强大的性能是成正比的。

 

 

小结:

1)启动代码参考

  1. .text  
  2. .global _start  
  3. _start:  
  4.     ldr r0,=0x56000010  
  5.     ldr r1,=0x00155555  
  6.     str r1,[r0]  
  7.     ldr r0,=0x56000014  
  8.     mov r1,#0x0  
  9.     str r1,[r0]  
  10. MAIN_LOOP:  
  11.     b MAIN_LOOP  

Makefile参考

led.bin:led.c
arm-linux-gcc -g -c -o led.o led.c
arm-linux-ld -Ttext 0x30000000 -g led.o -o led.elf -e main
arm-linux-objcopy -O binary -S led.elf led.bin
.PYTHON:clean
clean:
rm *.o led.elf led.bin

 

 

主程序代码:

 

#define GPBCON (*(volatile unsigned *)0x56000010)
#define GPBDAT (*(volatile unsigned *)0x56000014)
#define GPBUP (*(volatile unsigned *)0x56000018)
#define MPLL100MHz 0x0007f022
#define CLKDIV2 0x02
#define rMPLLCON (*(volatile unsigned *)0x4c000004)
#define rCLKDIVN (*(volatile unsigned *)0x4c000014)
int main()
{
int i = 0;
int count = 0;
int LEDS[4] = {0x1c0, 0x1a0, 0x160, 0xe0};

rMPLLCON = MPLL100MHz;
rCLKDIVN = CLKDIV2;
GPBCON = 0x00155555;
GPBUP = GPBUP & 0xFF00;

while(1)
{
for(count = 0; count != 4; ++ count)
{
GPBDAT=LEDS[count];
for(i = 0; i<0x30000;i++ );
}
}
}

 

 

新知识点

1)nandflash和norflash:

 

S3C2440

的启动时读取的第一条指令是在

0x00

上,

分为成

nand flash

和

nor flash

上启动。

 

 nor flash

有自己的地址线和数据线,

可以采用类似于

memory

的随机访问方式,

在

nor flash

上可以直接运行程序,

所以

nor flash

可以直接用来做

boot

,

采用

nor flash

启动的时候会把

地址

映射

到

0x00

上。

mini2440

就是直接把

vivi

直接烧录在

nor flash

上。

 

 nand flash

是

IO

设备,数据、地址、控制线都是共用的,需要软件区控制读取时序,

所以

不能像

nor flash

、内存一样随机访问,不能

EIP

(片上运行),因此不能直接作为

boot

。

 

S3C2440

把

boot loader

烧到

nand flash

上启动,

因为

在

S3C2440

里有一个内置的

SRAM

,

叫做

stepping stone

(

垫脚石,很形象

…)

,系统启动加电后,会把

nand flash

上的起始

4KB

的内容拷贝到

SRAM

里执行,

这样就实现了从

nand flash

启动

。

如果

bootloader

小于

4KB

的话(像

vboot

),在

SRAM

里就能

boot

,大于

4KB

的话

(

u-boot

,

vivi

)

,在

SRAM

里做一

些基本初始化后,再把

bootloader

的剩余部分拷贝到

SDRAM

里(

>0x30000000

)。

 

//==========================================================================//

注:

bootloader

是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我

们可以初始化硬件设备、

建立内存空间的映射图,

从而将系统的软硬件环境带到一个合适的

状态,

以便为最终调用操作系统内核准备好正确的环境。

通常,

bootloader

是严重地依赖于

硬件而实现的,特别是在嵌入式世界。

因此,在嵌入式世界里建立一个通用的

bootloader

几乎是不可能的。

尽管如此,我们仍然可以对

 

Boot Loader 

归纳出一些通用的概念来,以

指导用户特定的

 

bootloader

设计与实现。

 

//==========================================================================// 

我们使用

S3C2440

的时候,

经常通过

nor flash

启动,

进入

vivi

的菜单

(

S3C2440

的

nor flash

已经烧录好了

vivi

)

,

之后

通过

vivi

的

USB

下载功能,

把其他的

bootloader

下载到

nand flash

里,下载完成后,再通过

nand flash

启动,测试我们的

boot loader

。

 

 

nor flash

适合做代码存储并

EIP

的,

nand flash

适合用来作大量数据存储的。

 

Nand 

flash

启动:

 nand 

flash

存储器的前

4K

将被自动加载到

Stepping 

stone

(内部

SRAM

缓冲器),然后系统自动执行这些载入的启动代码,这

4K

的启动代码需要将

nand flash

中的内容复制到

SDRAM

中执行。

nand flash

的前

4K

空间放启动代码,

SDRAM

速度较快,用

来执行主程序的代码。

 

//==========================================================================//

注:

SDRAM(Synchronous Dynamic Random Access Memory)

,同步

动态随机存储

器

,

同步是指

 

Memory

工作需要同步时钟,

内部的命令的发送与数据的传输都以它为基准;

动态是指

存储阵列

需要不断的刷新来保证数据不丢失;

随机是指数据不是线性依次存储,

而

是自由指定地址进行数据读写。

posted @ 2014-09-13 00:12  Geek-Alan  阅读(382)  评论(0)    收藏  举报