⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sysinit.asm

📁 一个DSP的完整程序
💻 ASM
字号:
;*******************************************************************************
; Module Name:      初始化dsp5402 ,CPL =1(SP模式) ovly =1( 片内SRAM不定位到PROG)
; 中断向量在FF80H,clk =6*clkin , I/0,SRAM,PROGRAM no WAIT  ,ARP=0,DP =80,关中断
;
;**********************************************************************
;
;
;   入口
        
        
        .def        _c_int00
        .ref        _main,_Test_Memory
        .global     __BootRun,__Boot_lenth,__STACK_SIZE,__Vector_Start
        .def        _Second_Boot_Run_Init
;
; 
        .mmregs
;bootload程序存贮地址        
__Boot_Store  .set  0x3800 
;********************************* LOCALS *************************************
; DEFINITIONS:

; PMST_INIT: See 4.1.2 of the CPU and Peripherals manual.
;    IPTR (bit 15-7) -  001110111          中断向量高9位
;    MP/~MC (bit 6)  -           1         内部ROM不映射到程序区中
;    OVLY   (bit 5)  -            1        内部SRAM 映射到程序区中
;    AVIS   (bit 4)  -             0       内部地址不可见
;    DROM   (bit 3)  -              0      内部ROM不映射到数据空间
;    CLKOFF (bit 2)  -               0     时钟输出充许
;    SMUL   (bit 1)  -                1    Saturate before multiply on MAC
;    SST    (bit 0)  -                 0   Do not saturate before store
;                      -----------------
;                      11111 1111 1100 0010 = 0x77E2
PMST_INIT        .set        0x3bE2   ;中断向量为3B80H

; BSCR_INIT: See 10.3.2 of the CPU and Peripherals manual.
;    BNKCMP (bit 15-12) - 0000             No bank switching
;    PS-DS  (bit 11)    -     1            insert cycles between
;                                          PS-DS accesses
;    reserved (bit 12-2)-      xxxxxxxxx
;    BH     (bit 1)     -                0  enable bus holder
;    EXIO   (bit 0)     -                0  turn on external-bus-off
;                         -----------------        
;                         0000100000000001
BSCR_INIT        .set        0x800    ;不能turn off external-bus-off

; SWWSR_INIT:
;    XPA   (bit 15)     - 1                Don't care since one mem chip
;    I/O   (bits 14-12) -  001             We don't use the IO port, but set to max wait states for noe
;    Data1 (bits 11-9)  -     000          One Wait state for ASIC interface (0x8000-0xFFFF) 
;    Data2 (bits 8-6)   -        000       No Wait states for DATA memory range (0x0000 - 0x7FFF)
;    Prog1 (bits 5-3)   -           000    One Wait state for Instruction memory range (0x8000-0xFFFF)
;    Prog2 (bits 2-0)   -              000 No Wait states for Instruction memory range (0x0000-0x7FFF)
;                        -----------------
;                         1001000000000000 - 0x9000
SWWSR_INIT        .set        0x9000
;SWCR_INIT
;    reseved(bit15 -1)                     no used
;    swsm(bit0)                            software wait -state multiplier bit  
SWCR_INIT         .set        0x1 
	
; CLKMD:     See 8.4.2 of the CPU and Peripherals manual.
;            See Raman for chematic (CLKMD1,2,3 = 1,0,1 and desired clock frequency = 66 MHz)
;    PLLMUL (bit 15-12) - 0010             PLL multiplier = 2 (mult by 3)
;    PLLDIV (bit 11)    -     0            PLL divider = 0 (div by 1)
;    PLLCOUNT (bit 10-3)-      11111111    PLL counter set to max
;    PLLONOFF (bit 2)   -              1   PLL on
;    PLLNDIV (bit 1)    -               1  Select PLL mode
;    PLLSTATUS (bit 1)  -                x PLL Status (read only)
;                         ------------------
;                          0010011111111111 = 0x27ff
PLL_INIT_50MHZ        .set        04007h         
PLL_INIT_60MHZ        .set        05007h   
PLL_INIT_70MHZ        .set        06007h
PLL_INIT_80MHZ        .set        07007h
PLL_INIT_90MHZ        .set        08007h
PLL_INIT_100MHZ       .set        09007h  
      
__stack:	.usect	".stack",0        
;-------------------------------------------------------------------------

        .sect ".HpiText"
        
_c_int00:

;----------------------------------
; Disable and clear interrupts
;----------------------------------
	STM	    #__stack,SP		; set to beginning of stack memory
	ADDM	#(__STACK_SIZE-1),*(SP) ; add size to get to top
	ANDM	#0fffeh,*(SP)		; make sure it is an even address
	
	ssbx  INTM			   ; intm =1 disable all interrupts
    stm   #0x002,	IMR    ; 开INT1
    stm   #0xFFFF,		IFR    ; Writing a 0 to an IFR bit,
                           ; clears the interrupt flag
        
;----------------------------------
; 初始化DSP状态
;----------------------------------
    LD    #(__Vector_Start),A
    AND   #0XFF80,A
    LD    #PMST_INIT,B
    AND   #0X7F,B
    ADD   A,0,B
    STLM  B,PMST
    ;stm   #PMST_INIT,  PMST
    
;----------------------------------

;----------------------------------
; 初始化等等周期数
;----------------------------------
    stm   #SWWSR_INIT ,  SWWSR
    stm   #SWCR_INIT  ,  2BH    ;SWCR
;----------------------------------
;----------------------------------
; 初始化段间等等周期数
;----------------------------------
    stm   #BSCR_INIT,  BSCR
;----------------------------------
;初始化ARP 
   ;cxp LD	#0,ARP    ;指向 AR0
;初始化数据页指针
    LD	#80H,DP   ;指向0X4000
;初始化直接地址引用时,使用的基址由SP还是DP确定
   	SSBX	CPL

; 初始化运行时钟 
;----------------------------------    
	STM #0b, CLKMD ;switch to DIV mode
TstStatu: 
    LDM CLKMD, A
    AND #01b, A ;poll STATUS bit
    BC TstStatu, ANEQ
    STM #PLL_INIT_60MHZ, CLKMD ;switch to PLL 
;测试数据存贮器
    CALL _Test_Memory
; 将0x3c00到0x4000 址址的1k程序移到0XFC00开头的运行地址中
    RSBX  SXM
    NOP
    NOP
    LD  #__BootRun,   A
    STM  #__Boot_Store,AR1
    STM  #__Boot_lenth-1,BRC
    RPTB Copy_Boot-1 
    WRITA *AR1+
    ADD   #1,A
Copy_Boot: 
   
    B   _Second_Boot_Run_Init  ;二次下载程序开始运行
    


*************************************
*初始化二次下载程序时的运行环境
*************************************/

; PMST_INIT: See 4.1.2 of the CPU and Peripherals manual.
;    IPTR (bit 15-7) -  001110110          中断向量高9位
;    MP/~MC (bit 6)  -           1         内部ROM不映射到程序区中
;    OVLY   (bit 5)  -            0        内部SRAM不映射到程序区中
;    AVIS   (bit 4)  -             0       内部地址不可见
;    DROM   (bit 3)  -              0      内部ROM不映射到数据空间
;    CLKOFF (bit 2)  -               0     时钟输出充许
;    SMUL   (bit 1)  -                1    Saturate before multiply on MAC
;    SST    (bit 0)  -                 0   Do not saturate before store
;                      -----------------
;                      11111 1111 1100 0010 = 0x77E2
PMST_BOOT        .set       0x3b42   ;OVLY = 0,MP/MC=1 

     .text
_Second_Boot_Run_Init:

;----------------------------------
; Disable and clear interrupts
;----------------------------------
	STM	#__stack,SP		; set to beginning of stack memory
	ADDM	#(__STACK_SIZE-1),*(SP) ; add size to get to top
	ANDM	#0fffeh,*(SP)		; make sure it is an even address
	
	ssbx  INTM			   ;intm =1 disable all interrupts
    stm   #0x002,	IMR    ; 开INT1
    stm   #0xFFFF,		IFR    ; Writing a 0 to an IFR bit,
                           ; clears the interrupt flag
        
;----------------------------------
; 初始化DSP状态
;----------------------------------
    LD    #(__Vector_Start),A
    AND   #0XFF80,A
    LD    #PMST_BOOT,B
    AND   #0X7F,B
    ADD   A,0,B
    STLM  B,PMST
    ;stm   #PMST_INIT,  PMST
    
;----------------------------------

;----------------------------------
; 初始化等等周期数
;----------------------------------
    stm   #SWWSR_INIT ,  SWWSR
    stm   #SWCR_INIT  ,  2BH    ;SWCR
;----------------------------------
;----------------------------------
; 初始化段间等等周期数
;----------------------------------
    stm   #BSCR_INIT,  BSCR
;----------------------------------
;初始化ARP 
   ;cxp LD	#0,ARP    ;指向 AR0
;初始化数据页指针
    LD	#80H,DP   ;指向0X4000
;初始化直接地址引用时,使用的基址由SP还是DP确定
   	SSBX	CPL

; 初始化运行时钟 
;----------------------------------    
	STM #0b, CLKMD ;switch to DIV mode
TstStatu1: 
    LDM CLKMD, A
    AND #01b, A ;poll STATUS bit
    BC TstStatu1, ANEQ
    STM #PLL_INIT_50MHZ, CLKMD ;switch to PLL 
    NOP
    NOP
    B   _main
    RET              
   .sect ".exter"
_exti   
    LDM CLKMD, A
    AND #1b,a
    RET
.end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -