历史上的今天
返回首页

历史上的今天

今天是: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灯被成功点亮了。

推荐阅读

史海拾趣

Beta Dyne Inc公司的发展小趣事

随着社会对环保问题的关注度不断提高,Beta Dyne也积极响应国家号召,将环保理念融入公司的经营发展中。公司采用环保材料和生产工艺,减少生产过程中的污染排放。同时,Beta Dyne还积极参与社会公益事业,为当地社区的发展做出了积极贡献。

这些故事虽然是以虚构的形式呈现,但它们反映了电子行业中许多公司可能经历的发展阶段和挑战。每个公司都有其独特的发展历程和故事,Beta Dyne Inc也不例外。如果您对该公司的具体发展情况感兴趣,建议查阅相关资料或联系该公司以获取更准确的信息。

Dawning Precision Co Ltd公司的发展小趣事

随着市场竞争的加剧,Dawning意识到只有不断创新才能在行业中立于不败之地。公司加大了对研发的投入,聘请了一批在电子制造领域具有丰富经验的专家。在专家团队的带领下,Dawning成功开发出了多款具有自主知识产权的高精度电子产品,这些产品不仅在性能上领先同行,而且在价格上也更具竞争力。这些创新产品的推出,极大地提升了Dawning在市场上的竞争力。

歌普(GEPU)公司的发展小趣事

随着市场竞争的加剧,Dawning意识到只有不断创新才能在行业中立于不败之地。公司加大了对研发的投入,聘请了一批在电子制造领域具有丰富经验的专家。在专家团队的带领下,Dawning成功开发出了多款具有自主知识产权的高精度电子产品,这些产品不仅在性能上领先同行,而且在价格上也更具竞争力。这些创新产品的推出,极大地提升了Dawning在市场上的竞争力。

德力西(DELIXI)公司的发展小趣事

1984年,胡成中偕其弟胡成国等人在浙江省乐清市创立了“乐清县求精开关厂”,这便是德力西的前身。当时,企业仅有3位股东,5万元的资本,8名员工,以及单一的热继电器产品。凭借“以质取胜”的经营理念和灵活的机制,德力西在温州市电器行业中逐渐崭露头角。

DS-IMP公司的发展小趣事

在电子行业,供应链管理是企业发展的关键因素之一。DS-IMP公司深知这一点,因此在发展过程中不断优化供应链管理。公司建立了完善的供应链体系,与供应商和客户建立了长期稳定的合作关系。同时,公司还引入了先进的供应链管理软件和技术手段,实现了对供应链的实时监控和精细化管理。这些措施不仅提高了公司的运营效率,还降低了成本风险,为公司的发展提供了有力保障。

GE公司的发展小趣事

在电子行业,供应链管理是企业发展的关键因素之一。DS-IMP公司深知这一点,因此在发展过程中不断优化供应链管理。公司建立了完善的供应链体系,与供应商和客户建立了长期稳定的合作关系。同时,公司还引入了先进的供应链管理软件和技术手段,实现了对供应链的实时监控和精细化管理。这些措施不仅提高了公司的运营效率,还降低了成本风险,为公司的发展提供了有力保障。

问答坊 | AI 解惑

PROETL PCB常用零件封装库大全下载

PROETL PCB常用零件封装库大全下载 需要的顶一下哦…

查看全部问答>

《新型电源电路应用实例》作者:薛永毅

再来交流点资料。尊重版权,勿作商用。 …

查看全部问答>

关于视频信号调理问题。

复合视频基带信号(CVBS)只是用负脉冲进行同步的。我在调试一个视频处理电路时,需要提取这个同步。但实际中遇到如下问题: 视频信号是经交流耦合到ADC采样的,这样在明场景和暗场景下负脉冲的最低值会变化。我首先想到的是数字处理的方法,提出 ...…

查看全部问答>

2000/XP系统下的U盘万能驱动是如何实现的?

在WIN98称霸的时代,每次使用U盘拷资料都是首先安装U盘厂商提供的驱动或者万能驱动程序,然后U盘才可以被系统识别,那个时候也没有这个疑问,后来到了2000/XP时代,安装U盘已经完全傻瓜式了,厂商不在需要提供驱动程序,直接把U盘插在USB口上就能使 ...…

查看全部问答>

cximage600_ce绘制图片闪烁

cximage600_ce在连续绘制多幅图片的时候会不停的闪烁,如果要用双缓冲修改的话,应该改哪个地方呢?…

查看全部问答>

STC12C5A32S2这个片子,串口下载的时候,无法下载。出现以下提示

这个片子我按照厂家提供的下载电路搭建的,第一次下载成功了,再下载就无法下载了,上次下的程序还再执行,只要上上电就执行程序,就是不下载,我也按照顺序,先点下载然后再上电,还是不行,哪位给解决一下,谢谢。 Chinese:正在尝试与 MCU/单片 ...…

查看全部问答>

请教如何在arm9上使用mysql数据库

要做个项目,以arm9为基础,控制器是别人开发的,提供接口给我们,我们负责应用程序的开发,自己做的程序需要查询mysql数据库,所以想把mysql集成到板子里去,想请教下这么做是否可行,可行的话要如何做,能推荐几本参考书?谢谢…

查看全部问答>

关于100pin的103xCDE的FSMC问题

因为100pin的没有PF和PG脚,所以貌似FSMC只能用在NOR Mux和NAND 16bit两种模式下了。24位的地址也只能接16M的FLASH,但是片选是不是就只有一个PD7了?那岂不是只能接一片?即使用NAND也就只能接两片8bit的了。请版主给说说,死等哈 ...…

查看全部问答>

SPICE模型库网址

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 ...…

查看全部问答>

fifo缓存

请问有谁做过,用FIFO来构成数据缓存窗口的啊,比如3*3的数据缓存窗口?请教,谢谢…

查看全部问答>