首页 > 代码库 > 嵌入式开发之路(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)启动代码参考
- .text
- .global _start
- _start:
- ldr r0,=0x56000010
- ldr r1,=0x00155555
- str r1,[r0]
- ldr r0,=0x56000014
- mov r1,#0x0
- str r1,[r0]
- MAIN_LOOP:
- 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