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

工作需要同步时钟,

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

动态是指

存储阵列

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

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

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

时间: 2024-08-11 07:39:38

嵌入式开发之路(1)裸板程序LED的相关文章

刚接触开发板之烧写裸板程序

使用串口操作开发板的前提是开发板上已经有烧好的程序,因此开发板在没有烧好程序时,应先烧写程序.方法有: 1.使用并口工具烧写:接线(参考百问网JZ2440V2开发板使用手册),使用oflash烧写(速度比较慢),可烧写.bin文件,从新上电观察效果.可烧写u_boot. 2.使用openJTAG烧写,接线,使用oflash烧写(oflash烧写完后,会复位开发板). 3.使用Jlink烧写,请看如何烧写S3C2440裸板程序:JLink只支持烧写Nor Flash,不支持Nand Flash.要

从零开始写一个arm下的裸板程序

从零开始写一个arm下的裸板程序.我们整个程序是基于uboot运行的. 所有我们可以借助uboot中的printf来输出,默认开发版的标准输出是串口. 电脑的默认标准输出的屏幕. 1.需要创建的文件由include文件夹,用来存放头文件. 2.创建一个hw.h头文件. 3.编写一个common.h,它定义了借用uboot的printf的宏.和NULL这个宏的定义. 4.hw.c 硬件相关的文件. 5.main.c c文件. 6.start.s 汇编文件. 7.ld.lds 链接脚本, 8.Mak

JZs3c2440裸板程序GPIO操作总结

分别用汇编,汇编+C两种方式 ***************************************汇编编程led_on.s****************************************.text.global _start_start:  ldr ro,=0x***  //要操作的寄存器地址GPFCON  mov r1,#0x***   //要修改的寄存器值  str r1,[r0] ldr ro,=0x***  //要操作的寄存器地址GPFDATE  mov r1,

嵌入式开发平台开机自启应用程序

https://www.cnblogs.com/downey-blog/p/10473939.html https://www.cnblogs.com/aaronLinux/p/6804531.html https://blog.csdn.net/catfish408/article/details/78865548 原文地址:https://www.cnblogs.com/retry/p/12607407.html

【嵌入式开发】 嵌入式开发工具简介 (裸板调试示例 | 交叉工具链 | Makefile | 链接器脚本 | eclipse JLink 调试环境)

作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42239705  参考博客 : [嵌入式开发]嵌入式 开发环境 (远程登录 | 文件共享 | NFS TFTP 服务器 | 串口连接 | Win8.1 + RedHat Enterprise 6.3 + Vmware11) 开发环境 : -- 操作系统 : Vmware11 + RedHat6.3 企业版 + Win8.1; -- 硬件 : OK-6410-A 开发

【嵌入式开发】裸机引导操作系统和ARM 内存操作 ( DRAM SRAM 类型 简介 | Logical Bank | 内存地址空间介绍 | 内存芯片连接方式 | 内存初始化 | 汇编代码示例 )

[嵌入式开发]ARM 内存操作 ( DRAM SRAM 类型 简介 | Logical Bank | 内存地址空间介绍 | 内存芯片连接方式 | 内存初始化 | 汇编代码示例 ) 一. 内存 简介 1. 两大内存分类 ( 1 ) DRAM 简介 ( 定期刷新 | 速度慢 | 成本低 ) DRAM 简介 : 1.硬件描述 : DRAM 基本由一个个小电容基本原件组成, 电容的两端保留电荷; 2.优缺点描述 : ① 优点 : 成本很低, 很便宜; ② 缺点 : 需要 定期刷新数据, 速度较慢; a.

Tiny6410_SMDK从SD卡直接启动裸板代码

今天折腾了一天终于可以可以直接从SD卡启动6410的裸板程序了,这也让我实现了完全在linux下开发裸板代码.详细过程如下: 1.通过查SMDK6410_IROM_APPLICATION NOTE_REV 1.00,可以查到如下 其中BL1是开发板自动运行的固件代码 从上可以知道应将代码烧到最后地址-(1025+1+16)*512字节处 2.测试代码如下: 1     .text 2     .code 32 3     .globl _start 4     _start: 5     ldr

嵌入式开发板丨ARM开发板 学习必备资料- 迅为电子

摘要: ARM开发板 迅为三星Exynos嵌入式开发平台超强GPS模块 iTOP-Exynos4412开发板采用 Exynos4412的主芯片,具有更高的主频和更丰富外设,配置 2GB 双通道 DDR3的内存及 16GB 存储,具有稳定性强.可靠性高,能适用于对性能和处理能力有更高要求的嵌入式系统应用场合. iTOP-Exynos4412开发板内置有无线 WIFI 模块.Bluetooth.GPS.Camera.3G等模组,支持 HDMI1.4(1080P/60Hz)显示,客户可以直接从开发平台

ARM嵌入式开发板

iTOP-4412 ARM嵌入式开发板----主要特点 iTOP-4412开发平台是北京迅为电子研发设计的嵌入式开发板平台,核心板配备64位双通道2GB DDR3,16GBEMMC存储,三星原厂S5M8767电源管理芯片,低功耗.底板板载高精度GPS模块,WIFI蓝牙模块,CAN,RS485等工业接口.资料,源码全开源. iTOP-4412 ARM嵌入式开发板 iTOP-4412 ARM嵌入式开发板 iTOP-4412 ARM嵌入式开发板----硬件参数屏幕屏幕尺寸 选配7寸高清电容屏/9.7寸