打印

[转贴] ARM7 编程要点及示例

[复制链接]
1682|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sherry88|  楼主 | 2010-8-30 13:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ARM7 编程要点及示例
ARM7 编程要点及示例
ARM编程可参考程序示例 ARM_Boot Flash ROM驱动
VxWorks image 装入ARM的过程:
ARM7 有两种运行模式, Boot 模式和 Normal 模式, Boot模式主要是把程序装入(down load 或load )Flash ROM中用的,
Normal模式是一般运行程序用的.
ARM7 Boot 模式时, Flash 的地址是0x70000000片选型号是CS0 (Normal模式下,Flash地址为0x00000000)
ARM7内部有128byte的BootROM和2K的SRAM,当需要Download VxWorks
image时,ARM启动采用Boot方式启动运行存在128byte
BootROM中的程序初始化ARM内部的COM口,从COM口接受数据到2K的SRAM,这2K程序是用来真正Load
VxWorks的,2K程序Load完毕后系统自动跳转到这2K程序执行,它的作用是再次初始化内部的COM口,通过COM口接受VxWorks到DRAM,然后由DRAM写入FLASH。在主板2K
SRAM运行的Boot Load程序执行过程,可参看程序示例中ARM Boot Load程序

写入完毕后,切换到Normal模式重新启动系统,系统自动跳到FLASH 0X00000000开始运行VXWORKS。
用PC机上的COM1与ARM内部的UART1(COM)通信来Download VxWorks。


主要管脚定义
32条数据线: D0-------D31
28条地址线: A0-------A27 little endian 定义, 相对应数据排列 0 1 2 3 4 5 6--------27
6条片选信号脚: CS0-------CS5, 其实作用相当于地址线 A28------A31
4个8位的PORT口: PORT A, PORT B , PORT D主要用于外围芯片信号的控制. PORT E有双作用.
例如 PORT A 控制键盘的行信号, PORT B 用于RS232, PORT D 用于控制MODEM, FPGA..
外部中断信号EINT, EXTFIQ.
编程时要根据主板原理图和硬件手册进行.
看硬件图纸, 该芯片和CPU的那些管脚连结. 特别是 PORT 口和片选线.
查CPU手册, 得到PORT 口和该片选的硬件地址.
编程: 用PORT口直接对芯片操作,如开,关,RESET等, 用片选地址和芯片内地址结合对该外围芯片操作.

Exception vectors, 中断向量表及中断分配

Vector 地址 Exception
Exception Mode Priority(1=High)
0x0 Reset
Svc 1
0x4 Undefined Instruction
Undef 6
0x8 Software Interrupt
Svc 6
0xC Prefetch Abort
Abort 5
0x10 Data Abort
Abort 2
0x14 Reserved
Not applicable Not applicable
0x18 Interrupt (IRQ)
irq 4
0x1C Fast Interrupt (FIQ)
Fiq 3

这个向量表必须要放置在系统地址0x00000000 (一般是逻辑地址, 即经过MMU映射后的地址)处.
一般是在这些地址上放跳转指令 BL, 跳到相应的地址空间执行相应的程序.
如系统执行从0x00000000 Reset开始, Reset 跳转到某一地址开始运行操作系统.

程序示例,中断向量表 (ARM asm):

__VectorStart ; Start of ARM processor vectors
LDR pc,ResetV ; 00 - Reset
LDR pc,UndefV ; 04 - Undefined instructions
LDR pc,SWIV ; 08 - SWI instructions
LDR pc,PAbortV ; 0C - Instruction fetch aborts
LDR pc,DAbortV ; 10 - Data access aborts
LDR pc,UnusedV ; 14 - Reserved (was address exception)
LDR pc,IRQV ; 18 - IRQ interrupts
LDR pc,FIQV ; 1C - FIQ interrupts


中断号分配 (FIQ, IRQ)
中断类型 中断号 Name
说明
FIQ 0 外部中断 EXTFIQ 管脚 NEXT FIQ
… … … …
IRQ 5 外部中断 EINT1 管脚 NEINT1
IRQ 6 外部中断 EINT2 管脚 NEINT2
IRQ 7 外部中断 EINT3 管脚 NEINT3
… … … …
IRQ 12 内部中断 UTXINT1 UART1 TX FIFO 为空
… … … …

中断号也是寄存器INTMR和INTSR的位,所以在ARM中中断的编程要点是
看硬件图纸, 该外设和CPU的那一个管脚连结.
查CPU手册, 得到中断号及INTMR,INTSR的地址.
编程
注: 如果不是写底层driver, 只是在系统上层编程(如VxWorks, Linux) 知道中断号即可.
程序示例(VxWorks):
//登记中断号 5, 和相应的中断例程 ComISR.
intConnect ( ( VOIDFUNCPTR * ) 5, ComISR, 0 ) ;
//使能这中断
intEnable ( ( VOIDFUNCPTR * ) 5 );
……
ARM Interrupts: ARM processors implement fast and normal level of
interrupt,signalled externally, synchronise interrupts before an exception is
raised. A fast interrupt requst (FIQ) will desable subsequent normal and fast
interrupt by setting the I and F bit in CPSR,and a normal interrup request(IRQ)
will disable subsequent normal interrupt by setting I bit in CPSR.

计时器中断编程过程
ARM7一般内部有两个16位计时器(Timer
counter)和一个32位实时时钟(RTC),计时器中断属于IRQ中断,这里以计时器1为例叙述一下中断的编程过程
设置interrup mask INTMR1寄存器 0x80000240 第8位TC1OI计时器1为使能. 在0x800000300 计时器 1
的数据寄存器TC1D写入指定数据,这样数据开始从这个给定的数开始递减计数,计数递减至 0 后,会产生一个溢出underflow
IRQ中断请求,中断状态寄存器INTSR1 0x80000240 第8位TC1OI置位.系统会跳到中断向量表地址 0x00000018
处,执行相应的中断程序,中断程序通过判断中断的类型(判断中断状态寄存器的位),来执行相应的中断服务程序ISR.
中断状态寄存器标志位复位,计时器开始重新开始计时.


存储空间管理单元(MMU)
物理地址映射
重点在于片选地址CS的选取,另外MMU映射需要参考这个物理地址

ARM7 物理地址映射表
地址 内容
大小
备注
0xF000.0000 Unused 256Mbytes
0xE000.0000 Unused 256Mbytes
0xD000.0000 DRAM Bank 1 256Mbytes
0xC000.0000 DRAM Bank 0 256Mbytes 外接DRAM
0x8000.2000 Unused --1Gbytes
0x8000.0000 内部寄存器地址 8Kbytes 主要的I/O和控制
0x7000.0000 Boot ROM 128 bytes 片内,封有Boot程序
0x6000.0000 On-chip SRAM 2 Kbytes 片内,存放Load程序
0x5000.0000 PCMCIA-1(NCS[5]) 4*64 Mbytes
0x4000.0000 PCMCIA-0(NCS[4]) 4*64 Mbytes
0x3000.0000 外部扩展(NCS[3]) 256Mbytes
0x2000.0000 外部扩展(NCS[2]) 256Mbytes
0x1000.0000 ROM Bank 1(NCS[1]) 256Mbytes
0x0000.0000 ROM Bank 0(NCS[0]) 256Mbytes 外接Flash ROM


MMU 虚拟(逻辑)地址和物理地址的映射实例
Vxworks支持的ARM架构的处理器,一般是RAM的起始位置为0x0,而实际上ARM的物理地址0x0是ROM的起始地址,RAM在高位地址.这就需要系统在Boot过程中,执行MMU程序,重新映射RAM和ROM的地址.即RAM起始地址为0x0.

MMU主要有ARM7中协处理器coprocessor 15控制,coporocessor主要控制:
片内的MMU
指令和数据缓存(IDC)
Write Buffer(WB)
MMU有两层页表(two-level page table)用来进行虚拟地址向物理地址转换,CP15定义16个寄存器,只有MRC和MCR指令才能对它们操作.
在VxWorks系统中,MMU表分成两部分:boot up table和final
table.在文件ramAtHigh.h中定义.该表在文件romInit.s中初始化,语句为:
BL _ramAtHigh_1(2)

MMU映射实例
虚拟(逻辑)地址(VxWorks系统) 硬件物理地址
RAM 首地址 0x0000.0000
Low Address 0x0000.1000
High Address 0x0060.0000
ROM 0x0100.0000


其他的地址逻辑地址和物理地址映射地址不变
0x8000.0000 内部寄存器
..................
.................
相同的颜色映射对应的地址





ROM 0x0000.0000 VxWorks image和文件系统
RAM 首地址 0xC000.0000 存放LCD,MMU表等
0xC004.0000 中断向量表等
0xC004.1000 VxWorks运行位置
0xC064.0000 VxWorks从ROM解压后Copy的位置
其他的地址映射地址不变
0x8000.0000 内部寄存器
..............
..............


其中,Low Address,High Address在系统配置文件config.h和Makefile中设置,参见BSP文件示例


相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

91

帖子

1

粉丝