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

S3C2410的初始化代码主要涉及到对系统主要模块的配置、运行环境的建立、系统     时钟   、MMU等模块的配置,下面按执行顺序依次都各个部分进行分析:

 l程序入口:(ResetHandler)

在程序一开始,首先进行的一些操作主要保证初始化程序能够顺利的运行,因此主要包括关闭WDT、中断,配置锁相环等。

 大神教会你嵌入式开发中的S3C2410初始化_设计制作_MEMS/传感技术

 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级sec         TI   on模式的地址映射,一个sec         TI   on的大小为1M,也就是说从逻辑地址到物理地址的转变是这样的一个过程:一个32位的地址,高12位决定了该地址在页表中的index,这个index的内容决定了该逻辑sec  TI on对应的物理sec  TI on;低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&wri     te   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。

47
37
0
10

相关资讯

  1. 1、emui11第三批更新名单有哪些机型?emui11第三批更新名单介绍2597
  2. 2、win10自带的ie浏览器在哪4702
  3. 3、网易大神如何绑定角色?网易大神绑定角色的方法5062
  4. 4、imovie怎么保存视频?imovie保存视频的方法1196
  5. 5、手机支付宝怎么注销账号?手机支付宝注销账户流程详解1053
  6. 6、怎么看Windows11系统是激活的?Windows11检查激活状态方法4423
  7. 7、怎么使用支付宝电子社保卡支付宝电子社保卡的使用方法3112
  8. 8、网易邮箱大师怎么添加日程提醒?网易邮箱大师新建日程提醒的方法3083
  9. 9、Win7怎样去掉桌面图标阴影?Win7去掉桌面图标阴影的方法1072
  10. 10、Win10输入法无法切换怎么办?Win10输入法无法切换的解决方法387
全部评论(0)
我也有话说
0
收藏
点赞
顶部