2.2 底层驱动的设计 底层驱动包含三部分内容:BOOT向量表部分,S3C44B0X监控程序部分及税控机在Nucleus下的BSP。 BOOT向量表 因系统选用的是Nucleus操作系统,对S3C44B0X的中断是向量模式。所以在boot.s(汇编语言编写)文件中主要是设置向量表的跳转地址。表1为ARM7TDMI的异常向量表。 地 址 异 常 进入模式 0x0000,0000 复位 管理模式 0x0000,0004 未定义指令 未定义模式 0x0000,0008 软件中断 管理模式 0x0000,000C 中止(预取指令) 中止模式 0x0000,0010 中止(数据) 中止模式 0x0000,0014 保留 保留 0x0000,0018 IRQ IRQ 0x0000,001C FIQ FIQ 表1 ARM7TDMI的异常向量表 S3C44BOX把复位信号也作为中断来处理,系统复位时程序(pc)指针被置成0,使程序跳到0x00000000开始运行。在boot.s文件的开始(0地址)使用了一条跳转指令: B 0x1000 其作用是在系统上电复位或者手动复位后系统程序指针跳到0地址执行时,系统将程序跳转到0x1000即4K地址的地方继续执行(4K地址烧入监控程序)。 44B0X的监控程序 负责初始化系统以及拷贝应用程序到内存并且运行。该部分关键的两个文件是mon.s和Main.c,mon.s(汇编语言编写)文件用来初始化中断、存储器、堆栈等,进行系统初始化,建立C程序运行环境。由于在BOOT向量表中直接跳转到了监控程序的起始处执行程序,之前并没有对44B0进行硬件上的寄存器等进行初始化,所以在这个程序中的开始是先屏蔽中断,然后配置时钟控制寄存器,再配置存储器控制寄存器,设定中断向量,设定各个模式下的堆栈,建立好C语言的运行环境,负责把自身代码从ROM中拷贝到内存中并且拷贝初始化 数据区以及初始化0数据段,最后跳到Main函数执行C语言的函数体。Main.c是监控程序的主程序入口文件,主要是进行端口的初始化,设定系统主时钟,初始化串口并且设定波特率等工作方式,并将应用程序从NandFlash上读取到内存中并运行。下面是监控程序中存储控制寄存器配置的源代码。 … adr r0, ResetHandler ldr r1, =ResetHandler sub r0, r1, r0 ldr r1, =SMRDATA sub r0, r1, r0 ldmia r0, {r1-r13} ldr r0, =0x01c80000 ;BWSCON Address stmia r0, {r1-r13} SMRDATA: .word 0x01000000 @ BWSCON: 总线宽度与等待状态控制寄存器 @ bank6: SDRAM 16bit; bank0: ROM 8bit; bank1: @ peripheral at Bank 3-5 : 8bit, nBE @ Not using UB/LB @ WAIT disable .word 0x00002b50 @ Bankcon0 boot rom 39vf040 512k NorFlash @:Tacs=1; Tcos="1"; Tacc="4"; Toch="1"; Tcah="1" .word 0x00001f00 @ Bankcon1网口控制芯片 16bit: Tacs="0"; Tcos="4"; Tacc="14"; Toch="0"; Tcah="0" .word 0x00001f00 @ Bankcon2权限锁 N/A .word 0x00001f00 @ Bankcon3 NandFlash : Tacs="0"; Tcos="4"; Tacc="14"; Toch="0"; Tcah="0" .word 0x00001f00 @ Bankcon4键盘数据口 : Tacs="0"; Tcos="4"; Tacc="14"; Toch="0"; Tcah="0" .word 0x00001f00 @ Bankcon5 8bit 外接数据口 : Tacs="0"; Tcos="4"; Tacc="14"; Toch="0"; Tcah="0" .word 0x00018008 @ Bankcon6 SDRAM; Trcd=2clocks; column addr 8-bit .word 0x00001f00 @ Bankcon7液晶以及16C554(扩展串口) @: Tacs="0"; Tcos="4"; Tacc="14"; Toch="0"; Tcah="0" .word 0x008005fe @ REFRESH 15.6us .word 0x00000000 @ Bank 6/7 size: 32M/32/8M .word 0x00000020 @ MRSRB6 CAS latency = 2clocks .word 0x00000020 @ MRSRB7 CAS latency = 2clocks @Tacs 在nGCSn 有效之前地址建立时间 @Tcos 在nOE上芯片选择建立时间 @Tacc 存取周期 @Toch 在nOE上芯片选择保持时间 @Tcah 在nGCSn有效地址保持时间 @Trcd RAS 到 CAS 延时y |