首页 > 代码库 > 嵌入式开发之路(1)裸板程序LED

嵌入式开发之路(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

工作需要同步时钟,

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

动态是指

存储阵列

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

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

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

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