Mode_USR EQU 0×10 ; 定义用户模式标志代码
Mode_FIQ EQU 0×11 ; 定义快速中断模式标志代码
Mode_IRQ EQU 0×12 ; 定义普通中断模式标志代码
Mode_SVC EQU 0×13 ; 定义管理模式标志代码
Mode_ABT EQU 0×17 ; 定义中止模式标志代码
Mode_UND EQU 0×1B ; 定义未定义模式标志代码
Mode_SYS EQU 0×1F ; 定义系统模式(特权模式)标志代码
;
I_Bit EQU 0×80 ; 设置普通中断是否有效
F_Bit EQU 0×40 ; 设置快速中断是否有效
;// <h> 堆栈大小设置(字节)
;// <o0> 未定义模式堆栈大小 <0×0-0xFFFFFFFF:8>
;// <o1> 管理模式堆栈大小 <0×0-0xFFFFFFFF:8>
;// <o2> 中止模式堆栈大小 <0×0-0xFFFFFFFF:8>
;// <o3> 快速中断模式堆栈大小 <0×0-0xFFFFFFFF:8>
;// <o4> 普通中断模式堆栈大小 <0×0-0xFFFFFFFF:8>
;// <o5> 用户模式堆栈大小 <0×0-0xFFFFFFFF:8>
;// </h>
UND_Stack_Size EQU 0×00000000 ; 定义未定义模式堆栈大小
SVC_Stack_Size EQU 0×00000008 ; 定义管理模式堆栈大小
ABT_Stack_Size EQU 0×00000000 ; 定义中止模式堆栈大小
FIQ_Stack_Size EQU 0×00000000 ; 定义快速中断模式堆栈大小
IRQ_Stack_Size EQU 0×00000080 ; 定义普通中断模式堆栈大小
USR_Stack_Size EQU 0×00000400 ; 定义用户模式堆栈大小
Stack_Size EQU (UND_Stack_Size + SVC_Stack_Size + ABT_Stack_Size + \
FIQ_Stack_Size + IRQ_Stack_Size + USR_Stack_Size)
; 将所有的堆栈大小进行相加,得到总堆栈大小
AREA STACK, NOINIT, READWRITE, ALIGN="3"
; 声明堆栈代码段(不初始化内存,可读写,字节对齐) ;
Stack_Mem SPACE Stack_Size ; 申请堆栈内存空间
Stack_Top EQU Stack_Mem + Stack_Size
; 定义堆栈开始地址(最大地址,堆栈向下访问)
;// <h> 堆空间大小设置(字节)
;// <o> 堆空间大小 <0×0-0xFFFFFFFF>
;// </h>
Heap_Size EQU 0×00000000 ; 定义堆空间大小(配合最后的动态内存申请使用)
AREA HEAP, NOINIT, READWRITE, ALIGN="3"
; 声明堆代码段(不初始化内存,可读写,字节对齐)
Heap_Mem SPACE Heap_Size ; 申请堆的内存空间
; VPBDIV definitions
VPBDIV EQU 0xE01FC100 ; 定义”VPBDIV”的物理地址
;// <e> VPBDIV 设置
;// <i> Peripheral Bus Clock Rate
;// <o1.0..1> VPBDIV: VPB 时钟设置
;// <0=> VPB 时钟 = CPU 时钟 / 4
;// <1=> VPB 时钟 = CPU 时钟
;// <2=> VPB 时钟 = CPU 时钟 / 2
;// <o1.4..5> XCLKDIV: XCLK 引脚设置
;// <0=> XCLK 引脚 = CPU 时钟 / 4
;// <1=> XCLK 引脚 = CPU 时钟
;// <2=> XCLK 引脚 = CPU 时钟 / 2
;// </e>
VPBDIV_SETUP EQU 0 ; 定义是否设置”VPBDIV”(后边程序中作为处理标志使用),0表示下面对VPBDIV值的设定无效,1表示设置有效
VPBDIV_Val EQU 0×00000000 ; 在VPBDIV_SETUP有效时,定义”VPBDIV”的值
; 00:总线为CPU的1/4 | 01:相同 | 10:1/2 | 11:无效设置
; Phase Locked Loop (PLL) definitions
PLL_BASE EQU 0xE01FC080 ; PLL 控制寄存器的基地址
PLLCON_OFS EQU 0×00 ; PLLCON 对应基地址的增量
PLLCFG_OFS EQU 0×04 ; PLLCFG 对应基地址的增量
PLLSTAT_OFS EQU 0×08 ; PLLSTAT 对应基地址的增量
TT
PLLFEED_OFS EQU 0×0C ; PLLFEED 对应基地址的增量
PLLCON_PLLE EQU (1<<0) ; PLL 使能位(置位时使能PLL)
PLLCON_PLLC EQU (1<<1) ; PLL 连接位(置位时连接PLL)
PLLCFG_MSEL EQU (0×1F<<0) ; PLL 倍频器值
PLLCFG_PSEL EQU (0×03<<5) ; PLL 分频器值
PLLSTAT_PLOCK EQU (1<<10) ; PLL 锁定状态指示(0:未锁定;1:锁定到提定频率)
;// <e> PLL 设置
;// <o1.0..4> MSEL: PLL倍频设置
;// <1-32><#-1>
;// <i> M Value
;// <o1.5..6> PSEL: PLL分频设置
;// <0=> 1 <1=> 2 <2=> 4 <3=> 8
;// <i> P Value
;// </e>
PLL_SETUP EQU 1 ; PLL 设置程序判断标志
PLLCFG_Val EQU 0×00000024 ; PLLCFG 的设置值(10.0100:倍频5,分频4)
; Memory Accelerator Module (MAM) definitions
MAM_BASE EQU 0xE01FC000 ; MAM 存储加速模块基地址
MAMCR_OFS EQU 0×00 ; MAMCR 对应基地址的增量
MAMTIM_OFS EQU 0×04 ; MAMTIM 对应基地址的增量
;// <e> MAM 存储加速模块设置
;// <o1.0..1> MAM 控制寄存器
;// <0=> 全部禁止
;// <1=> 部份使能
;// <2=> 全部使能
;// <i> 保留
;// <o2.0..2> MAM 定时寄存器
;// <0=> 保留 <1=> 1 <2=> 2 <3=> 3
;// <4=> 4 <5=> 5 <6=> 6 <7=> 7
;// <i> 保留
;// </e>
MAM_SETUP EQU 1 ; MAM 设置程序判断标志
MAMCR_Val EQU 0×00000002 ; MAMCR 设置值
MAMTIM_Val EQU 0×00000004 ; MAMTIM 设置值
; External Memory Controller (EMC) definitions
EMC_BASE EQU 0xFFE00000 ; EMC 外部存储控制器基地址
BCFG0_OFS EQU 0×00 ; BCFG0 对应基地址的增量
BCFG1_OFS EQU 0×04 ; BCFG1 对应基地址的增量
BCFG2_OFS EQU 0×08 ; BCFG2 对应基地址的增量
BCFG3_OFS EQU 0×0C ; BCFG3 对应基地址的增量
;// <e> 外部存储控制器(EMC)
EMC_SETUP EQU 0
;// <e> 存储器组0的配置寄存器(BCFG0)
;// <o1.0..3> IDCY: 空闲周期数 <0-15>
;// <o1.5..9> WST1: 读访问长度 <0-31>
;// <o1.11..15> WST2: 写访问长度 <0-31>
;// <o1.10> RBLE: 读字节区分
;// <o1.26> WP: 是否为写保护
;// <o1.27> BM: 是否使用Burst ROM
;// <o1.28..29> MW: 数据总线宽度 <0=> 8-bit <1=> 16-bit
;// <2=> 32-bit <3=> 保留
;// </e>
BCFG0_SETUP EQU 0
BCFG0_Val EQU 0×0000FBEF
;// <e> 存储器组1的配置寄存器(BCFG1)
;// <o1.0..3> IDCY: 空闲周期数 <0-15>
;// <o1.5..9> WST1: 读访问长度 <0-31>
;// <o1.11..15> WST2: 写访问长度 <0-31>
;// <o1.10> RBLE: 读字节区分
;// <o1.26> WP: 是否为写保护
;// <o1.27> BM: 是否使用Burst ROM
;// <o1.28..29> MW: 数据总线宽度 <0=> 8-bit <1=> 16-bit
;// <2=> 32-bit <3=> 保留
;// </e>
BCFG1_SETUP EQU 0
BCFG1_Val EQU 0×0000FBEF
;// <e> 存储器组2的配置寄存器(BCFG2)
;// <o1.0..3> IDCY: 空闲周期数 <0-15>
;// <o1.5..9> WST1: 读访问长度 <0-31>
;// <o1.11..15> WST2: 写访问长度 <0-31>
;// <o1.10> RBLE: 读字节区分
;// <o1.26> WP: 是否为写保护
;// <o1.27> BM: 是否使用Burst ROM
;// <o1.28..29> MW: 数据总线宽度 <0=> 8-bit <1=> 16-bit
;// <2=> 32-bit <3=> 保留
;// </e>
BCFG2_SETUP EQU 0
BCFG2_Val EQU 0×0000FBEF
;// <e> 存储器组3的配置寄存器(BCFG3)
;// <o1.0..3> IDCY: 空闲周期数 <0-15>
;// <o1.5..9> WST1: 读访问长度 <0-31>
;// <o1.11..15> WST2: 写访问长度 <0-31>
;// <o1.10> RBLE: 读字节区分
;// <o1.26> WP: 是否为写保护
;// <o1.27> BM: 是否使用Burst ROM
;// <o1.28..29> MW: 数据总线宽度 <0=> 8-bit <1=> 16-bit
;// <2=> 32-bit <3=> 保留
;// </e>
BCFG3_SETUP EQU 0
BCFG3_Val EQU 0×0000FBEF
;// </e> End of EMC
; 引脚功能定义(加入功能)
PINSEL0 EQU 0xE002C000 ; PINSEL0 定义物理地址
PINSEL1 EQU 0xE002C004 ; PINSEL1 定义物理地址
PINSEL2 EQU 0xE002C014 ; PINSEL2 定义物理地址
;// <e> 引脚功能定义(PINSEL)
PINSEL_SETUP EQU 0
;// <e> PINSEL0 设置
;// <i> PINSEL0
;// <o1.0..1> P0.0 功能设置
;// <0=> GPIO
;// <1=> TxD(UART0)
;// <2=> PWM1
;// <3=> 保留
;// <o1.2..3> P0.1 功能设置
;// <0=> GPIO
;// <1=> RxD(UART0)
;// <2=> PWM3
;// <3=> EINT0
;// <o1.4..5> P0.2 功能设置
;// <0=> GPIO
;// <1=> SCL(I2C)
;// <2=> 捕获0.0(TIMER0)
;// <3=> 保留
;// <o1.6..7> P0.3 功能设置
;// <0=> GPIO
;// <1=> SDA(I2C)
;// <2=> 匹配0.0(TIMER0)
;// <3=> EINT1
;// <o1.8..9> P0.4 功能设置
;// <0=> GPIO
;// <1=> SCK(SPI0)
;// <2=> 捕获0.1(TIMER0)
;// <3=> 保留
;// <o1.10..11> P0.5 功能设置
;// <0=> GPIO
;// <1=> MISO(SPI0)
;// <2=> 匹配0.1(TIMER0)
;// <3=> 保留
;// <o1.12..13> P0.6 功能设置
;// <0=> GPIO
;// <1=> MOSI(SPI0)
;// <2=> 捕获0.2(TIMER0)
;// <3=> 保留
;// <o1.14..15> P0.7 功能设置
;// <0=> GPIO
;// <1=> SSEL(SPI0)
;// <2=> PWN2
;// <3=> EINT2
;// <o1.16..17> P0.8 功能设置
;// <0=> GPIO
;// <1=> TxD(UART1)
;// <2=> PWN4
;// <3=> 保留
;// <o1.18..19> P0.9 功能设置
;// <0=> GPIO
;// <1=> RxD(UART1)
;// <2=> PWN6
;// <3=> EINT3
;// <o1.20..21> P0.10 功能设置
;// <0=> GPIO
;// <1=> RTS(UART1)
;// <2=> 捕获1.0(TIMER1)
;// <3=> 保留
;// <o1.22..23> P0.11 功能设置
;// <0=> GPIO
;// <1=> CTS(UART1)
;// <2=> 捕获1.1(TIMER1)
;// <3=> 保留
;// <o1.24..25> P0.12 功能设置
;// <0=> GPIO
;// <1=> DSR(UART1)
;// <2=> 匹配1.0(TIMER1)
;// <3=> 保留
;// <o1.26..27> P0.13 功能设置
;// <0=> GPIO
;// <1=> DTR(UART1)
;// <2=> 匹配1.1(TIMER1)
;// <3=> 保留
;// <o1.28..29> P0.14 功能设置
;// <0=> GPIO
;// <1=> CD(UART1)
;// <2=> EINT1
;// <3=> 保留
;// <o1.30..31> P0.15 功能设置
;// <0=> GPIO
;// <1=> RI(UART1)
;// <2=> EINT2
;// <3=> 保留
;// </e>
PINSEL0_SETUP EQU 0
PINSEL0_Val EQU 0×00000000 ; 写入的数值
;// <e> PINSEL1 设置
;// <i> PINSEL1
;// <o1.0..1> P0.16 功能设置
;// <0=> GPIO
;// <1=> EINT0
;// <2=> 匹配0.2(TIMER0)
;// <3=> 保留
;// <o1.2..3> P0.17 功能设置
;// <0=> GPIO
;// <1=> 捕获1.2(TIMER1)
;// <2=> SCK(SPI1)
;// <3=> 匹配1.2(TIMER1)
;// <o1.4..5> P0.18 功能设置
;// <0=> GPIO
;// <1=> 捕获1.3(TIMER1)
;// <2=> MISO(SPI1)
;// <3=> 匹配1.3(TIMER1)
;// <o1.6..7> P0.19 功能设置
;// <0=> GPIO
;// <1=> 匹配1.2(TIMER1)
;// <2=> MOSI(SPI1)
;// <3=> 匹配1.3(TIMER1)
;// <o1.8..9> P0.20 功能设置
;// <0=> GPIO
;// <1=> 匹配1.3(TIMER1)
;// <2=> SSLE(SPI1)
;// <3=> EINT3
;// <o1.10..11> P0.21 功能设置
;// <0=> GPIO
;// <1=> PWN5
;// <2=> 保留
;// <3=> 捕获1.3(TIMER1)
;// <o1.12..13> P0.22 功能设置
;// <0=> GPIO
;// <1=> 保留
;// <2=> 捕获0.0(TIMER0)
;// <3=> 匹配0.0(TIMER0)
;// <o1.14..15> P0.23 功能设置
;// <0=> GPIO
;// <o1.16..17> P0.24 功能设置
;// <0=> GPIO
;// <o1.18..19> P0.25 功能设置
;// <0=> GPIO
;// <o1.22..23> P0.27 功能设置
;// <0=> GPIO
;// <1=> AIN0(A/D)
;// <2=> 捕获0.1(TIMER0)
;// <3=> 匹配0.1(TIMER0)
;// <o1.24..25> P0.28 功能设置
;// <0=> GPIO
;// <1=> AIN1(A/D)
;// <2=> 捕获0.2(TIMER0)
;// <3=> 匹配0.2(TIMER0)
;// <o1.26..27> P0.29 功能设置
;// <0=> GPIO
;// <1=> AIN2(A/D)
;// <2=> 捕获0.3(TIMER0)
;// <3=> 匹配0.3(TIMER0)
;// <o1.28..29> P0.30 功能设置
;// <0=> GPIO
;// <1=> AIN3(A/D)
;// <2=> EINT3
;// <3=> 捕获0.0(TIMER0)
;// </e>
PINSEL1_SETUP EQU 0
PINSEL1_Val EQU 0×15400000 ; 写入的数值
;// </e>
;// <e> PINSEL2 设置
PINSEL2_SETUP EQU 0
;// <o> PINSEL2 参数 <0×0-0xFFFFFFFF>
;// </e>
; 外部存储器引脚功能定义
PINSEL2_Val EQU 0×0E6149E4 ; CS0..3, OE, WE, BLS0..3,
; D0..31, A2..23, JTAG Pins
; 功能说明
PRESERVE8 ; 汇编程序数据 8 字节对齐
; Area Definition and Entry Point
; Startup Code must be linked first at Address at which it expects to run.
AREA RESET, CODE, READONLY ; 声明RESET代码段为只读程序代码
ARM ; ARM 模式运行程序
; Exception Vectors
; Mapped to Address 0.
; Absolute addressing mode must be used.
; Dummy Handlers are implemented as infinite loops which can be modified.
; 定义中断向量表
Vectors LDR PC, Reset_Addr ; 复位
LDR PC, Undef_Addr ; 未定义指令
LDR PC, SWI_Addr ; 软件中断
LDR PC, PAbt_Addr ; 中止(预取)
LDR PC, DAbt_Addr ; 中止(数据)
NOP ; 保留
LDR PC, IRQ_Addr ; 普通
LDR PC, [PC, #-0x0FF0] ; Vector from VicVectAddr
LDR PC, FIQ_Addr ; 快速中断
Reset_Addr DCD Reset_Handler ; 以Reset_Addr为Reset_Handler分配一段字对齐的内存单元
Undef_Addr DCD Undef_Handler ; 注:应该是将CODE映射(复制)到RAM的开始地址
SWI_Addr DCD SWI_Handler
PAbt_Addr DCD PAbt_Handler
DAbt_Addr DCD DAbt_Handler
DCD 0 ; 保留地址
IRQ_Addr DCD IRQ_Handler
FIQ_Addr DCD FIQ_Handler
Undef_Handler B Undef_Handler ; B为跳转指令|| ??自己跳转到自己??
SWI_Handler B SWI_Handler
PAbt_Handler B PAbt_Handler
DAbt_Handler B DAbt_Handler
IRQ_Handler B IRQ_Handler
FIQ_Handler B FIQ_Handler
; Reset Handler函数开始
EXPORT Reset_Handler ; 定义一个全局函数名变量
Reset_Handler
; IO端口功能设置
IF PINSEL_SETUP <> 0
IF PINSEL0_SETUP <> 0
LDR R0, =PINSEL0
LDR R1, =PINSEL0_Val
STR R1, [R0]
ENDIF
IF PINSEL1_SETUP <> 0
LDR R0, =PINSEL1
LDR R1, =PINSEL1_Val
STR R1, [R0]
ENDIF
ENDIF
; 设置外部存储器引脚
IF PINSEL2_SETUP <> 0
LDR R0, =PINSEL2
LDR R1, =PINSEL2_Val
STR R1, [R0]
ENDIF
; 设置外部存储器控制
IF EMC_SETUP <> 0
LDR R0, =EMC_BASE
IF BCFG0_SETUP <> 0
LDR R1, =BCFG0_Val
STR R1, [R0, #BCFG0_OFS]
ENDIF
IF BCFG1_SETUP <> 0
LDR R1, =BCFG1_Val
STR R1, [R0, #BCFG1_OFS]
ENDIF
IF BCFG2_SETUP <> 0
LDR R1, =BCFG2_Val
STR R1, [R0, #BCFG2_OFS]
ENDIF
IF BCFG3_SETUP <> 0
LDR R1, =BCFG3_Val
STR R1, [R0, #BCFG3_OFS]
ENDIF
ENDIF ; EMC_SETUP
; 设置 VPBDIV 分频器
IF VPBDIV_SETUP <> 0
LDR R0, =VPBDIV
LDR R1, =VPBDIV_Val
STR R1, [R0]
ENDIF
; 设置 PLL(锁相环)
IF PLL_SETUP <> 0
LDR R0, =PLL_BASE
MOV R1, #0xAA
MOV R2, #0×55
; 设置PLL控制寄存器
MOV R3, #PLLCFG_Val
STR R3, [R0, #PLLCFG_OFS]
MOV R3, #PLLCON_PLLE
STR R3, [R0, #PLLCON_OFS]
STR R1, [R0, #PLLFEED_OFS]
STR R2, [R0, #PLLFEED_OFS]
; 等待PLL馈送成功
PLL_Loop LDR R3, [R0, #PLLSTAT_OFS]
ANDS R3, R3, #PLLSTAT_PLOCK
BEQ PLL_Loop
; 选择PLL时钟
MOV R3, #(PLLCON_PLLE:OR:PLLCON_PLLC)
STR R3, [R0, #PLLCON_OFS]
STR R1, [R0, #PLLFEED_OFS]
STR R2, [R0, #PLLFEED_OFS]
ENDIF ; PLL_SETUP
; 设置 MAM 存储器加速模块
IF MAM_SETUP <> 0
LDR R0, =MAM_BASE
MOV R1, #MAMTIM_Val
STR R1, [R0, #MAMTIM_OFS]
MOV R1, #MAMCR_Val
STR R1, [R0, #MAMCR_OFS]
ENDIF ; MAM_SETUP
; 内存映射(当中断向量是在内存)
MEMMAP EQU 0xE01FC040 ; Memory Mapping Control
IF :DEF:REMAP
LDR R0, =MEMMAP
IF :DEF:EXTMEM_MODE
MOV R1, #3
ELIF :DEF:RAM_MODE
MOV R1, #2
ELSE
MOV R1, #1
ENDIF
STR R1, [R0]
ENDIF
; 初始化中断堆栈系统
; …
; 设置每一个工作模式堆栈
LDR R0, =Stack_Top
; 进入未定义模式,并设置堆栈指针
MSR CPSR_c, #Mode_UND:OR:I_Bit:OR:F_Bit
MOV SP, R0
SUB R0, R0, #UND_Stack_Size
; 进入中止模式,并设置堆栈指针
MSR CPSR_c, #Mode_ABT:OR:I_Bit:OR:F_Bit
MOV SP, R0
SUB R0, R0, #ABT_Stack_Size
; 进入快速中断模式,并设置堆栈指针
MSR CPSR_c, #Mode_FIQ:OR:I_Bit:OR:F_Bit
MOV SP, R0
SUB R0, R0, #FIQ_Stack_Size
; 进入普通中断模式,并设置堆栈指针
MSR CPSR_c, #Mode_IRQ:OR:I_Bit:OR:F_Bit
MOV SP, R0
SUB R0, R0, #IRQ_Stack_Size
; 进入管理(特权)模式,并设置堆栈指针
MSR CPSR_c, #Mode_SVC:OR:I_Bit:OR:F_Bit
MOV SP, R0
SUB R0, R0, #SVC_Stack_Size
; 进入用户模式,并设置堆栈指针
MSR CPSR_c, #Mode_USR
MOV SP, R0
SUB SL, SP, #USR_Stack_Size
; 进入C代码
IMPORT __main ; 引用其它文件中”main”函数
LDR R0, =__main ; 加载”main”地址到R0
BX R0 ; ARM方式转移到”main”执行
; 用户设置堆栈程序(C外部接口:用于动态申请内存使用)
AREA |.text|, CODE, READONLY
IMPORT __use_two_region_memory
EXPORT __user_initial_stackheap
__user_initial_stackheap
LDR R0, = Heap_Mem
LDR R1, =(Stack_Mem + USR_Stack_Size)
LDR R2, = (Heap_Mem + Heap_Size)
LDR R3, = Stack_Mem
BX LR
END
文章评论(0条评论)
登录后参与讨论