用虚拟串口仿真LPC2138(UART0)

源代码在线查看: startup.s

软件大小: 225 K
上传用户: tfwangxy
关键词: UART0 2138 LPC 虚拟串口
下载地址: 免注册下载 普通下载 VIP

相关代码

				
				;/*******************************************************************************************************
				;* 文件名:Startup.s
				;* 功  能:开发板启动代码。包含异常向量表,当异常(包括复位)发生时,程序将从异常向量表取指进行跳转。还包
				;*         含对各模式系统堆栈的初始化代码,接着调用开发板初始化代码,最后跳转到C语言main()函数入口处。
				;*         另外,开/关IRQ中断和FIQ中断采用SWI的方式实现,处理程序也在本文件中。
				;* 作  者:POWER
				;* 日  期:2006年5月25号
				;* 斯凯科技主页:www.armsky.net
				;* 斯凯科技论坛:www.armsky.net/bbs
				;********************************************************************************************************/
				
				;/*定义堆栈的大小*/
				SVC_STACK_LEGTH         EQU         0
				FIQ_STACK_LEGTH         EQU         0
				IRQ_STACK_LEGTH         EQU         256
				ABT_STACK_LEGTH         EQU         0
				UND_STACK_LEGTH         EQU         0
				
				
				NoInt       EQU 0x80                ;// Bit7,I位
				
				NoFIQ		EQU	0x40                ;// Bit6,F位
				
				USR32Mode   EQU 0x10                ;// M[4:0]=10000,用户模式
				SVC32Mode   EQU 0x13                ;// M[4:0]=10011,管理模式
				SYS32Mode   EQU 0x1f                ;// M[4:0]=11111,系统模式
				IRQ32Mode   EQU 0x12                ;// M[4:0]=10010,IRQ中断
				FIQ32Mode   EQU 0x11                ;// M[4:0]=10001,快速中断
				
				
				
				    IMPORT __use_no_semihosting_swi
				   
				
				;/* 引入的外部标号在这声明 */
				    IMPORT  FIQ_Exception           ;// 快速中断异常处理程序 
				    IMPORT  __main                  ;// C语言主程序入口      
				    IMPORT  TargetResetInit         ;// 开发板基本初始化     
				
				;/* 给外部使用的标号在这声明 */
				    EXPORT  bottom_of_heap
				    EXPORT  StackUsr
				    
				    EXPORT  Reset
				    EXPORT __user_initial_stackheap
				    
				
				    CODE32
				
				    AREA    vectors,CODE,READONLY
				        ENTRY
				
				;/* 中断向量表 */
				Reset
				        LDR     PC, ResetAddr                   ;// 0x00000000,复位
				        LDR     PC, UndefinedAddr               ;// 0x00000004,未定义地址
				        LDR     PC, SWI_Addr                    ;// 0x00000008,软件中断
				        LDR     PC, PrefetchAddr                ;// 0x0000000c,预取指中止
				        LDR     PC, DataAbortAddr               ;// 0x00000010,数据中止
				        DCD     0xb9205f80                      ;// 0x00000014,保留  
				        LDR     PC, [PC, #-0xff0]               ;// 0x00000018,IRQ中断
				        LDR     PC, FIQ_Addr                    ;// 0x0000001c,FIQ中断
				
				ResetAddr           DCD     ResetInit           ;// 复位初始化处理程序地址
				UndefinedAddr       DCD     Undefined           ;// 未定义指令处理程序地址
				SWI_Addr            DCD     SoftwareInterrupt   ;// 软件中断处理程序地址
				PrefetchAddr        DCD     PrefetchAbort       ;// 预取指中止处理程序地址
				DataAbortAddr       DCD     DataAbort           ;// 数据中止处理程序地址
				Nouse               DCD     0                   ;// 未使用
				IRQ_Addr            DCD     0                   ;// IRQ中断,已在"LDR PC,[PC,#-0xff0]"中处理
				FIQ_Addr            DCD     FIQ_Handler         ;// FIQ中断处理程序地址
				
				;/* 未定义指令 */
				Undefined
				        B       Undefined                       ;// 死循环
				
				;/* 软中断,中断号0~3已经占用 */
				SoftwareInterrupt			
				                             
				        CMP     R0, #4                          ;// 判断传过来的参数是否大于4
				        LDRLO   PC, [PC, R0, LSL #2]            ;// 小于4(参数正确),进行查表
				        MOVS    PC, LR                          ;// 大于或等于4(参数出错),则返回
				
				SwiFunction                                    
				        DCD     IRQDisable                      ;// 0号调用,禁止IRQ中断 
				        DCD     IRQEnable                       ;// 1号调用,使能IRQ中断
				        DCD		FIQDisable		                ;// 2号调用,禁止FIQ中断       
				        DCD		FIQEnable		                ;// 3号调用,使能FIQ中断
				
				IRQDisable
				        ;/* 禁止IRQ中断 */
				        MRS     R0, SPSR                        ;// 读取SPSR的值
				        ORR     R0, R0, #NoInt                  ;// 置位I位,设置关IRQ中断
				        MSR     SPSR_c, R0                      ;// 回写SPSR
				        MOVS    PC, LR                          ;// 返回
				
				IRQEnable
				        ;/* 使能IRQ中断 */
				        MRS     R0, SPSR                        ;// 读取SPSR的值                  
				        BIC     R0, R0, #NoInt                  ;// 清零I位,设置开IRQ中断
				        MSR     SPSR_c, R0                      ;// 回写SPSR
				        MOVS    PC, LR                          ;// 返回 
				        
				FIQDisable
				        ;/* 禁止FIQ中断 */  
				        MRS     R0, SPSR                        ;// 读取SPSR的值 
				        ORR     R0, R0, #NoFIQ                  ;// 置位F位,设置关FIQ中断
				        MSR     SPSR_c, R0                      ;// 回写SPSR
				        MOVS    PC, LR                          ;// 返回 
				
				FIQEnable
				        ;/* 使能FIQ中断 */                       
				        MRS   R0, SPSR                          ;// 读取SPSR的值
				        BIC   R0, R0, #NoFIQ                    ;// 清零F位,设置开FIQ中断               
				        MSR   SPSR_c, R0                        ;// 回写SPSR 
				        MOVS    PC, LR                          ;// 返回 
				
				
				;/* 取指令中止 */
				PrefetchAbort
				        B       PrefetchAbort                   ;// 死循环
				
				;/* 取数据中止 */
				DataAbort
				        B       DataAbort                       ;// 死循环
				
				;/* 快速中断 */
				FIQ_Handler
				        STMFD   SP!, {R0-R3, LR}                ;// 寄存器R0~R3,LR入栈
				        BL      FIQ_Exception                   ;// 调用FIQ处理程序(在target.c中)
				        LDMFD   SP!, {R0-R3, LR}                ;// 寄存器R0~R3,LR出栈
				        SUBS    PC,  LR,  #4                    ;// 计算返回地址
				        
				        
				        
				        
				
				;/*********************************************************************************************************
				;* 函数名称:InitStack
				;* 功能描述:初始化堆栈
				;* 入口参数:无
				;* 出口参数:无
				;* 注    意:当进行初始化堆栈时,处理器状态为ARM状态(T=0			

相关资源