您的位置 首页 新能源

大神教会你嵌入式开发中的S3C2410初始化

大神教会你嵌入式开发中的S3C2410初始化-在程序一开始,首先进行的一些操作主要保证初始化程序能够顺利的运行,因此主要包括关闭WDT、中断,配置锁相环等。

S3C2410的初始化代码首要涉及到对体系首要模块的装备、运转环境的树立、体系时钟、MMU等模块的装备,下面按履行次序顺次都各个部分进行剖析:

l程序进口:(ResetHandler)

在程序一开端,首要进行的一些操作首要确保初始化程序可以顺畅的运转,因而首要包含封闭WDT、中止,装备锁相环等。

大神教会你嵌入式开发中的S3C2410初始化

l装备memory接口

memory接口是确保数据拜访正确的基本保障,此处首要装备SFR寄存器中0x48000000开端的memory接口寄存器组,确保每个bank的位宽、拜访类型(waitable)以及时序参数正确。假如没有特别的要求,一般来说时序参数运用默认值即可。

l初始化仓库

ARM 有6种运转形式,有必要为每一种形式供给独立的仓库空间,在仓库设置之前是不能进行C函数的调用的。arm的仓库形式是从高地址递减的,咱们可以将仓库的首地址设在0x33ff8000处,往低顺次为FIQ、IRQ、Abort、Undef、SVC,其间SVC和User形式不予区别。仓库巨细一般可在头文件或许当时文件中修正。

l运转空间的初始化

这段代码首要完结两个功用,一是将RW数据搬运到RW空间(咱们生成ROM镜像时,RW数据是跟在RO数据之后的),二是初始化ZI数据段。当然,这段代码存在的条件是代码的运转环境仅仅规范的两段式:一段RO空间和一段RW空间;而且在C程序进口时没有调用编译器的链接库(__main)。后者现已供给相应的功用,而且支撑愈加杂乱的运转环境界说(运用SCF文件)。

l__rt_lib_init

在ADS1.2的环境中,假如在C进口没有调用编译器的链接库(__main),那么在C程序一开端要调用该函数以初始化运转时的函数库,以确保对ADS供给的某些库函数可以正常调用。

lMMU初始化

2410 的MMU支撑1级&2级地址映射,在咱们现在的运用中均选用1级secTIon形式的地址映射,一个secTIon的巨细为1M,也就是说从逻辑地址到物理地址的改动是这样的一个进程:一个32位的地址,高12位决议了该地址在页表中的index,这个index的内容决议了该逻辑secTIon对应的物理secTIon;低20位决议了该地址在section中的偏移(index)。

因而从0x0~0xffffffff的地址空间一共可以分红0x1000(4K)个section,页表中每项的巨细为32个bit,因而页表的巨细为0x4000(16K)。一切示例程序的页表一致寄存在地址0x33ff8000。

每个页表项的内容如下:

31 20 19 12 11 10 9 8 5 4 32 1 0

Section对应的物理地址NULLAP0Domain1CB10

注:最低两位(10)是section分页的标识。

AP:Access Permission,区别只读、读写、SVC&其它形式。

Domain:每个section都归于某个Domain,一个有16个Domain,每个Domain的特点由CP15的R3寄存器操控。在一切示例程序中,都只包含两个Domain,一个是SFR地址以下(包含SFR)的空间,可拜访;另一个是SFR以上的空间,不行拜访。

C、B:这两位决议了该section的cache&write buffer特点,这与该段的用处(RO or RW)有密切关系。不同的用处要做不同的设置。

CB详细意义

00无cache,无写缓冲,任何对memory的读写都反映到ASB总线上。对memory的操作进程中CPU需求等候。

01无cache,有写缓冲,读操作直接反映到ASB总线上。写操作CPU将数据写入到写缓冲后持续运转,由写缓冲进行ASB操作。

10有cache,写通形式,读操作首要考虑cache hit;写操作时直接将数据写入写缓冲,假如一起呈现cache hit,那么也更新cache。

10有cache,写回形式,读操作首要考虑cache hit;写操作也首要考虑cache,假如hit,则只修正cache,并将cache对应半行的dirty比特置位;假如miss,则写入写缓冲,触发ASB总线操作。

尽管MMU仅仅运用了逻辑地址到物理地址的linear transfer(值不改动),可是因为MMU可以引进cache&write buffer,因而体系性能有很大的进步!

装备时钟比、从头设置PLL

2410内部有三个时钟:FCLK、HCLK、PCLK,别离供CPU、AHB总线和

APB总线运用,为了下降功耗,一般都挑选周期比为1:2:4的合理装备。 一起将PLL装备为运转环境时钟,一般都到达最高202M。

IO初始化

将IO口装备为对应的功用选项,一起一般会点亮相应的LED灯。

中止初始化

2410的内存空间没有remap的机制,应该中止进口时钟坐落零地址。因而中

断服务机制可以描绘如下:

首要,不论运用那种发动方法,有必要确保一下代码段坐落内存的0x0地址:

b ResetHandler

b HandlerUndef ;handler for Undefined mode

b HandlerSWI ;handler for SWI interrupt

b HandlerPabort ;handler for PAbort

b HandlerDabort ;handler for DAbort

b 。 ;reserved

b HandlerIRQ ;handler for IRQ interrupt

b HandlerFIQ ;handler for FIQ interrupt

除ResetHandler外,其他各项都是由如下的宏界说的一段代码:

HandlerFIQ HANDLER HandleFIQ

MACRO

$HandlerLabel HANDLER $HandleLabel

$HandlerLabel

sub sp,sp,#4 ;decrement sp(to store jump address)

stmfd sp!,{r0};PUSH the work register to stack

ldr r0,=$HandleLabel ;load the address of HandleXXX to r0

ldr r0,[r0] ;load the contents

str r0,[sp,#4] ;store the contents(ISR) of HandleXXX to stack

ldmfd sp!,{r0,pc} ;POP the work register and pc(jump to ISR)

MEND

这段代码的意义是经过仓库将中止向量表中的内容赋给PC指针(如HandleFIQ是寄存着FIQ服务程序进口地址的地址),天然程序就跳到相应的进口地址。

可见,中止向量表寄存的是各个中止服务程序的进口地址,它是用来被加载的,而并不是可履行代码。为了一致,一切示例程序都将中止向量表放在0x33ffff00开端的地址,并依据进口地址顺次摆放。

需求留意的是假如各种形式的服务程序用C言语界说,那么类型有必要用__irq界说,以确保可以正确回来。

初始化串口

串口一致选用UART0,形式选用115200、1bit STOP、No Parity。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/xinnengyuan/101991.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部