历史上的今天
今天是:2025年04月11日(星期五)
2020年04月11日 | ARM裸板程序的开发和编译(以点亮LED灯为例)
2020-04-11 来源:eefocus
制作好交叉编译工具链后,怎么确定是否有效呢,当然是编译一个程序烧写到板上跑一下了。这里我们以点亮LED灯为例描述如何使用我们制作的交叉编译工具链编译裸板程序。
首先,需要了解下Nor flash,Nand flash,片内内存,片外内存,地址空间这几个概念。其中,Nor flash是CPU可以直接通过硬件信号读取的,不需要配置,但是Norflash的写操作是需要配置和实现驱动的。片内内存不需要配置,CPU可以直接通过硬件信号读写。这是因为Nor flash和片内内存在硬件设计上就已经固化了他们的电气特性。而Nand flash的读写都必须配置,并且需要实现驱动。CPU通过相应的Nand flash控制器间接的读写数据。片外内存的读写也是需要配置的,通过内存控制器进行配置,配置好后CPU就可以发出合适的硬件信号进行直接读写。
通常,Nor flash,片内内存,片外内存是统一编址的,他们在CPU的地址空间内,而Nand flash是独立编址的。原因就是前面的描述,CPU无法直接访问Nand flash的地址。S3C2440的地址空间如下,注意,不同启动模式下,片内内存(Internal SRAM)的地址是不一样的。

这里的地址空间只是存储器的地址空间,还有CPU内部的寄存器地址空间,这些地址也是可以直接访问的,同常在高位地址。S3C2440的寄存器地址空间为0x4800000~0x5fffffff。
因为Norflash和片内内存不需要配置就可以读取,因此开发板只能从这两个地方启动。具体就是把代码烧写到Nor flash或者Nand flash处,如果在Nand flash,启动时硬件会自动拷贝代码到4KB的内部RAM。GT2440开发板nGCS0接的是Norflash。无论哪种模式启动,上电后CPU跳转到0地址处开始执行。如果在片内内存中,我们必须用4KB的代码完成Nand flash,内存控制器的初始化,并且把代码搬运到片外内存中。如果在Nor flash中,我们同样需要初始化内存控制器。由于裸板程序较小,不会超过4KB,因此我们暂时不需要做这些操作(如果在Norflash中我们可直接运行的代码量更大)。
此外,ARM处理器还有多种异常。系统上电和看门狗超时都会产生复位异常,跳转到0地址处执行。因此如果没有喂狗程序,我们必须先关闭看门狗,这是裸板程序必须实现的操作。此外,如果我们需要进入C语言代码,C语言都是由函数构成的。函数的调用需要堆栈,因此我们也要设置堆栈寄存器SP。注意SP必须指向我们当前CPU可以直接读写的内存(当前只有4KB内部RAM是可以直接读写的)。因此如果我们从Nor flash启动,在没有设置内存控制器前,我们是不能进入C代码的。这里我们将从Nand flash启动。
下面,我们开始写代码点亮LED等。GT2440的LED管脚如下:

我们在汇编代码start.s中关闭看门狗,初始化堆栈SP。
.text
.global _start
_start:
ldr r0,=0x53000000
mov r1,#0
str r1,[r0] /*关闭看门狗*/
ldr sp,=1024*4 /*不能超过内部ram,sdram还没有初始化*/
bl main
loop:
b loop
在C代码test.c中,我们点亮LED灯。注意GPIO寄存器是CPU内部寄存器,不需要配置即可直接读写。
#define GPBCON (*(volatile unsigned int *)0x56000010)
#define GPBDAT (*(volatile unsigned int *)0x56000014)
int main(int argc, char *argv[])
{
GPBCON = 1 << 10 | 1 << 12 | 1 << 14 | 1 << 16;/*设置LED管脚为输出模式*/
GPBDAT = ~(0x1 << 5); /*点亮其中两盏灯*/
return 0;
}
Makefile如下:
ARCH=arm
CC=$(ARCH)-linux-gcc
LD=$(ARCH)-linux-ld
OBJCOPY=$(ARCH)-linux-objcopy
led.bin:start.s test.c
$(CC) -g -c start.s test.c
$(LD) -Ttext 0x0 -g start.o test.o -o led_elf
#裸板程序,非操作系统环境,必须去除ELF可执行文件中的操作系统头部,转换为二进制文件
$(OBJCOPY) -O binary -S led_elf led.bin
clean:
rm -rf led.bin led_elf *.o
为了使我们制作的交叉编译工具可用,我们还需要设置环境变量。
source setenv.sh
#!/bin/sh
#指向交叉编译工具链
export PATH=${PATH}:/project/trunk/easyLinux/buildroot/ext/usr/bin
export LD_LIBRARY_PATH=/project/trunk/easyLinux/buildroot/ext/usr/lib
make, 即可得到led.bin。
把led.bin烧写到Nand flash中,设置开发板从Nand flash中启动,我们发现LED灯被成功点亮了。
史海拾趣
|
复合视频基带信号(CVBS)只是用负脉冲进行同步的。我在调试一个视频处理电路时,需要提取这个同步。但实际中遇到如下问题: 视频信号是经交流耦合到ADC采样的,这样在明场景和暗场景下负脉冲的最低值会变化。我首先想到的是数字处理的方法,提出 ...… 查看全部问答> |
|
在WIN98称霸的时代,每次使用U盘拷资料都是首先安装U盘厂商提供的驱动或者万能驱动程序,然后U盘才可以被系统识别,那个时候也没有这个疑问,后来到了2000/XP时代,安装U盘已经完全傻瓜式了,厂商不在需要提供驱动程序,直接把U盘插在USB口上就能使 ...… 查看全部问答> |
|
STC12C5A32S2这个片子,串口下载的时候,无法下载。出现以下提示 这个片子我按照厂家提供的下载电路搭建的,第一次下载成功了,再下载就无法下载了,上次下的程序还再执行,只要上上电就执行程序,就是不下载,我也按照顺序,先点下载然后再上电,还是不行,哪位给解决一下,谢谢。 Chinese:正在尝试与 MCU/单片 ...… 查看全部问答> |
|
要做个项目,以arm9为基础,控制器是别人开发的,提供接口给我们,我们负责应用程序的开发,自己做的程序需要查询mysql数据库,所以想把mysql集成到板子里去,想请教下这么做是否可行,可行的话要如何做,能推荐几本参考书?谢谢… 查看全部问答> |
|
因为100pin的没有PF和PG脚,所以貌似FSMC只能用在NOR Mux和NAND 16bit两种模式下了。24位的地址也只能接16M的FLASH,但是片选是不是就只有一个PD7了?那岂不是只能接一片?即使用NAND也就只能接两片8bit的了。请版主给说说,死等哈 ...… 查看全部问答> |
|
SPICE模型库网址http://www.intusoft.com/models.htmhttp://www.cadence.com/products/orcad/downloads/pspice_models/index.aspxhttp://www.aplac.hut.fi/aplac/models/main.htmlhttp://www.maxim-ic.com/tools/spice/http://www.altera.com.cn/su ...… 查看全部问答> |




