历史上的今天
返回首页

历史上的今天

今天是:2025年02月06日(星期四)

正在发生

2021年02月06日 | 基于S3C6410的ARM11学习基础知识

2021-02-06 来源:eefocus

ARM11和之前学习的STM32的开发是很不一样的。STM32,都是把代码烧到STM32芯片FLASH中,然后代码从FLASH中执行,而且程序执行是不需要外部挂ram的,因为芯片的内部就集成了一定大小的ram。


而ARM11是不一样的,内部没有FLASH和ram,所以就需要外挂flash设备和ram设备,然后ARM11通过存储控制器来操作这些设备。



从图中就可以直观的看出区别了。对于S3C6410,因为内部没有存储器,所以需要将代码烧录到外挂的FLASH设备,这里FLASH设备可以有多种,但是一定要芯片支持的flash才行,这个在芯片的数据手册中是有说明的。程序执行,是需要内存的,所以还要外挂一个内存设备,用来执行程序,这里内存设备也可以有多种,但是也是要看芯片的数据手册看是支持哪一种内存设备。


两种的开发方式也是不同的。开发STM32程序,我们基本上都是用keil图形化界面开发,编译链接这些东西都是编译器搞定的,我们不需要写makefile,不需要写链接脚本,也不需要写启动代码,因为这些ST公司都为我们做好了。而且写的程序基本上都是用C语言写的。


但是ARM11开发就不一样的,需要在linux中开发,需要安装交叉编译工具链,这个时候就没有图形化开发界面了,需要自己写makefile,需要自己写链接脚本,而且重要的一点,需要自己写bootloader,也就是启动代码。


两种开发的指令也是不一样的,ARM11采用的是ARM指令,也就是32位指令,都是4字节对齐。但是STM32采用的是THUMB2指令,其中包含THUMB的16位指令,所以指令不是严格的4字节对齐。但是写STM32程序的时候,都是用C语言写的,所以对这些就不怎么关心。


但是在ARM11中开发就不一样了,因为开发bootloader代码时,是需要用汇编代码来写的,所以就要熟悉ARM11的汇编指令。会编写makefile,也要会编写链接脚本。


当然,STM32和ARM11还有其他的很多地方不一样。这里,就不介绍了,等到了具体的地方再加说明。


先来了解下ARM11的启动流程。



从ARM启动手册中截取的图。图中的BL是指bootloader。


一、 上电后,程序首先执行BL0程序,这个程序是芯片厂商固化在芯片中的程序。在这程序中,会有一些初始化东西,最重要的是对存储器控制器的初始化,使芯片能够访问外部的FLASH启动设备。


二、 BL0初始化后,会根据启动管脚的选择(因为ARM11支持多种存储介质启动),将外部启动存储设备的前8K数据给拷贝到stepping stone中,然后跳转到stepping stone执行。这个时候,执行的就是我们写的BL1程序。


三、 在BL1程序,我们会对芯片的一些寄存器进行设置,外部的一些外设进行初始化,比如nandflash,dram,串口等等。并对C语言环境进行配置,因为之后的程序有可能是用C语言写的。然后将外部存储启动设备中剩下的超过8K的程序拷贝到DRAM中,然后跳转到DRAM中执行程序。


所以,我们首先是要设定BL1的程序,在这个程序中,我们需要对芯片的一些寄存器进行设置,对外部的外设初始化,然后将FLASH中的代码拷贝到DRAM中,设置C语言环境,也就是配置堆,栈,BSS段清零。



看看STM32启动流程,上电后,芯片会采集boot0,boot1管脚的值,然后决定是从FLASH启动,还是从RAM启动。选择好后,就开始执行启动代码的程序,对堆栈定义(设置堆栈大小,以及地址),然后设置中断向量表,然后进行时钟,NVIC的初始化。接着调用_main,注意这里_main不是我们所写的main函数,而是系统自带的函数,该函数就是初始化C所需资源,也就是设置堆栈,映射代码中变量到内存中,然后再跳转到我们编写的main函数,开始执行我们写的程序。


可见,STM32还是要相对简单一些的,因为STM32,对这些工作,ST公司都已经做好了,也就是在写程序之前添加的那个启动的汇编代码,所以我们关心的就是我们写的main函数设计。但是在ARM11中,我们除了关心我们的main函数设计,还要关心bootloader设计。


二话不说,ARM11走起。


首先,肯定是要安装编译环境。首先需要装一个虚拟机,然后再虚拟机上安装交叉工具链。也就是arm-linux- 的编译工具。这些,网上都有很多教程,参照教程就可以实现了。


然后就是程序的编写,也就是bootloader的编写。在这里,bootloader程序是保存在start.S文件中。另外,程序最终是放在nandflash中,程序是从nandflash中启动的。我对这个bootloader起名叫qboot。


然后就是编写makefile。



Codeall : start.o
	arm-linux-ld  -Tqboot.lds -o qboot.elf  $^
	arm-linux-objcopy -O binary qboot.elf qboot.bin
	arm-linux-objdump -D -S qboot.elf > dump
	
%.o : %.S
	arm-linux-gcc  -g -c $^
%.o : %.c
	arm-linux-gcc  -g -c $^
	
clean:
	rm *.o *.elf dump




其实也很简单,就是将我们写的start.S汇编代码转化为bin文件。因为bin文件才能烧到nandflah中,被芯片执行。


然后就是编写链接脚本




+ 查看代码


ENTRY(_start) @ 程序入口是_start


SECTIONS{


. = 0x50008000; @ 链接的起始地址是0x50008000


. = ALIGN(4); @ 地址4字节对齐


.text : @ 代码段


{


start.o(.text) @ start的代码段放在最前


*(.text) @ *表示剩下的所有代码


}


. = ALIGN(4); @ 代码段地址,4字节对齐


.data : @ 数据段


{


*(.data) @ 所有数据段


}


. = ALIGN(4); @ bss段地址,4字节对齐


bss_start = .; @ 表明bss_start段起始地址,后面会用到


.bss :


{


*(.bss) @ 所有bss段


}


bss_end = .; @ 表明bss_start段结束地址,后面会用到


}






链接脚本是用来后面确定程序指令的地址用的。链接脚本中要设置代码段,数据段,bss段的链接地址。这里链接的起始地址是0x50008000,这个是内存的地址范围内,这个在数据手册中有体现。



从图中,看出第一个dram的地址范围是0x50000000开始,到0x5FFFFFFF结束的。所以这里将链接地址设置到这个范围内,因为后面程序会被拷贝到内存中,在内存中执行。


有了基础的这些东西,后面就可以开始程序之旅了。


推荐阅读

史海拾趣

ELESTA GmbH公司的发展小趣事

2019年,ELESTA GmbH荣获GEO全球卓越奖,这是对公司多年来在精益生产和生态环保方面卓越表现的肯定。该奖项的获得不仅提升了ELESTA的品牌形象和知名度,也进一步增强了公司在全球电子行业中的竞争力和影响力。

以上五个故事涵盖了ELESTA GmbH公司从创立到发展的关键阶段和里程碑事件,展现了公司在电子行业中不断进取、创新发展的历程。

ALPS公司的发展小趣事

1997年,ELESTA继电器有限公司正式成立,专注于制造符合IEC 61810-3标准的强制导向触点继电器。这一战略举措进一步巩固了ELESTA在电子继电器领域的领先地位,并为公司的长期发展奠定了坚实的基础。

Curtis Instruments Inc公司的发展小趣事

随着全球市场的不断变化和竞争的加剧,Curtis不断加强全球布局和战略合作。公司与多家国际知名企业建立了长期合作关系,共同开发新产品、拓展新市场。此外,Curtis还积极参与国际展览和交流活动,展示公司的最新技术和产品成果,提高品牌知名度和影响力。这些全球布局和战略合作有助于Curtis更好地应对市场挑战、把握发展机遇。

DDK公司的发展小趣事

DDK公司自创立之初,便以技术创新为核心竞争力。公司投入大量研发资源,不断探索新的电子技术和材料,力求在激烈的市场竞争中脱颖而出。在经历了数次技术突破后,DDK公司成功研发出了一款高性能、低能耗的芯片产品,这一产品迅速在市场上获得了广泛认可,为DDK公司赢得了良好的口碑和市场份额。

Digitron公司的发展小趣事

Digitron公司成立于XXXX年,由一群热衷于电子技术的工程师和科学家创立。在成立初期,公司专注于开发高精度、高可靠性的温度数据记录器。这些设备在医药、冷链物流等领域得到了广泛应用,为Digitron公司赢得了良好的声誉。随着技术的不断进步,Digitron公司逐渐扩大了产品线,推出了更多适用于不同行业的数据记录器和传感器。

康龙(CONCRAFT)公司的发展小趣事

康龙(CONCRAFT)公司成立于XXXX年,创始人XXX凭借其敏锐的商业眼光和对电子行业的深入理解,决定专注于电子连接器的研发和生产。公司初始阶段面临资金、技术和市场的重重挑战,但创始人带领团队夜以继日地工作,成功开发出了具有竞争力的连接器产品。随着产品的不断完善和市场推广的加强,康龙逐渐在电子连接器领域崭露头角。

问答坊 | AI 解惑

单片机

51单片机C语言应用程序设计实例精讲…

查看全部问答>

求教,vxworks读pci设备,还有其它

cpu为奔腾的,跑vxworks,版本是5.5, 因为项目需要,用fpga开发了一个pci接口的16路串口 在cpu对该串口进行读写的测试过程中,数据的正确性没问题 存在的问题是读pci口的速度太慢,每读一个32位双字,需要16个pci时钟周期 写pci口很快,一般3 ...…

查看全部问答>

wince gui移植 文字滚动问题

在gui移植的时候,原来的芯片是支持480*272的,现移植到支持800*480的芯片上,可以移植后一切正常,就是在超过480宽的像素位置之后,所有的字体都向左滚动,并且第一个字符不会显示,直接从第二个字符开始滚动,哪位高手知道这是为什么啊??…

查看全部问答>

分支预测(bi-mode yags预测原理)

小弟最近研究分支预测方面的东西,看了几篇国外的论文对一些东西还是不理解,网上也很难找到其他的资料。目前对bi-mode和yags这两个分支预测器有几个疑问,还望知道的大侠指点一二。 1.BI-MODE分支预测中选择模式历史表(choice PHT)和有向模式历 ...…

查看全部问答>

LPC2292 CAN、UART驱动程序

哪位高人帮忙写下LPC2292的CAN、UART接口驱动啊??? 最好能带注释的 先谢过…

查看全部问答>

示波器V2.0装配调试(flt9006)VOL.1----修整板子

  -------------------------**************************-------------------------------- 一些相关内容请看 示波器V2.0调试过程贴 https://bbs.eeworld.com.cn/thread-154006-1-1.html -------------------------********************* ...…

查看全部问答>

LED半导体照明电源及控制电

replyreload += \',\' + 692905;作为一种新的光源,近年来各大公司和研究机构对LED电源和驱动电路的研究方兴未艾。与荧光灯的电子镇流器不同,LED驱动电路的主要功能是将交流电压转换为直流电压,并同时完成与LED的电压和电流的匹配。随着硅集成电 ...…

查看全部问答>

不要简单贴上源代码.....至少贴上错误信息&稍微简单梳理一下流程......

嘿嘿,忽然想尝试一下,利用标题,发那些比较简单的呼吁性质一类的话语。因为我觉得一般很少有人会看帖子,特别是那么长的。chunyang大叔的那个帖子都到40多页去了,我去...... [ 本帖最后由 辛昕 于 2012-1-20 19:35 编辑 ]…

查看全部问答>

求助。altium designer 。创建原理图字样点不了

  就是不可以选那个,  那没亮,,,求帮助。  …

查看全部问答>