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

📄 st5us_f.a66

📁 TQ公司的STK16x开发系统的源码
💻 A66
📖 第 1 页 / 共 4 页
字号:

; Special Function Register Addresses
SYSCON   DEFR   0FF12H
BUSCON0  DEFR   0FF0CH
SP       DEFR   0FE12H
STKOV    DEFR   0FE14H
STKUN    DEFR   0FE16H
P3       DEFR   0FFC4H
DP3      DEFR   0FFC6H
BUSCON1  DEFR   0FF14H
BUSCON2  DEFR   0FF16H
BUSCON3  DEFR   0FF18H
BUSCON4  DEFR   0FF1AH
ADDRSEL1 DEFR   0FE18H
ADDRSEL2 DEFR   0FE1AH
ADDRSEL3 DEFR   0FE1CH
ADDRSEL4 DEFR   0FE1EH
SYSCON2  DEFR   0F1D0H
SYSCON3  DEFR   0F1D4H
P2       DEFR   0FFC0H
DP2      DEFR   0FFC2H

%*DEFINE (ADDR (Val, Start, Range)) (
%SET (adr, %SUBSTR(%Start,1,(%LEN(%Start)- 3))%SUBSTR(%Start,%LEN(%Start),1))
%IF (%EQS (%Range,4K))     THEN (%SET (adr, (%adr AND 0FFF0H) + 0)) FI
%IF (%EQS (%Range,8K))     THEN (%SET (adr, (%adr AND 0FFE0H) + 1)) FI
%IF (%EQS (%Range,16K))    THEN (%SET (adr, (%adr AND 0FFC0H) + 2)) FI
%IF (%EQS (%Range,32K))    THEN (%SET (adr, (%adr AND 0FF80H) + 3)) FI
%IF (%EQS (%Range,64K))    THEN (%SET (adr, (%adr AND 0FF00H) + 4)) FI
%IF (%EQS (%Range,128K))   THEN (%SET (adr, (%adr AND 0FE00H) + 5)) FI
%IF (%EQS (%Range,256K))   THEN (%SET (adr, (%adr AND 0FC00H) + 6)) FI
%IF (%EQS (%Range,512K))   THEN (%SET (adr, (%adr AND 0F800H) + 7)) FI
%IF (%EQS (%Range,1024K))  THEN (%SET (adr, (%adr AND 0F000H) + 8)) FI
%IF (%EQS (%Range,1M))     THEN (%SET (adr, (%adr AND 0F000H) + 8)) FI
%IF (%EQS (%Range,2048K))  THEN (%SET (adr, (%adr AND 0E000H) + 9)) FI
%IF (%EQS (%Range,2M))     THEN (%SET (adr, (%adr AND 0E000H) + 9)) FI
%IF (%EQS (%Range,4096K))  THEN (%SET (adr, (%adr AND 0C000H) +10)) FI
%IF (%EQS (%Range,4M))     THEN (%SET (adr, (%adr AND 0C000H) +10)) FI
%IF (%EQS (%Range,8192K))  THEN (%SET (adr, (%adr AND 08000H) +11)) FI
%IF (%EQS (%Range,8M))     THEN (%SET (adr, (%adr AND 08000H) +11)) FI
%Val    EQU     %adr
)

?C_RESET        PROC TASK C_STARTUP INTNO RESET = 0
?C_STARTUP:     LABEL   Model

$IF (WATCHDOG = 0)
                DISWDT                  ; Disable watchdog timer
$ENDIF

$IF (INIT_XPERCON = 1)
; Improtant XPERCON must be set before SYSCON.XPEN is enabled
XPERCON  DEFR 0F024H
V_XPERCON       SET     V_CAN1 OR (V_CAN2 << 1) OR (V_XRAM2 << 10)
V_XPERCON       SET     V_XPERCON OR (V_XRAM6 << 11) OR (V_XFLASH << 14)
                EXTR    #1
                MOV     XPERCON,#V_XPERCON
$ENDIF

BCON0L          SET     (_MTTC0 << 5) OR (_RWDC0 << 4)
BCON0L          SET     BCON0L OR ((NOT _MCTC0) AND 0FH)
BCON0L          SET     BCON0L AND (NOT (_RDYEN0 << 3))
BCON0L          SET     BCON0L OR (_RDY_AS0 << 3)
BCON0H          SET     (_ALECTL0 << 1) OR (_RDYEN0 << 4)
BCON0H          SET     BCON0H OR (_CSREN0 << 6) OR (_CSWEN0 << 7)
$IF (BTYP_ENABLE == 1)
BCON0L          SET     BCON0L OR (_BTYP0 << 6)
BCON0H          SET     BCON0H OR (_BUSACT0 << 2)
$ENDIF

$IF (BTYP_ENABLE == 0)
                BFLDL   BUSCON0,#03FH,#BCON0L
                BFLDH   BUSCON0,#0D2H,#BCON0H
$ELSE
                BFLDL   BUSCON0,#0FFH,#BCON0L
                BFLDH   BUSCON0,#0D6H,#BCON0H
$ENDIF
SYS_BITS        SET     0FF6FH

SYS_H           SET     (_STKSZ << 5) OR (_ROMS1 << 4) OR (_SGTDIS << 3)
SYS_H           SET     SYS_H OR (_ROMEN << 2) OR (_BYTDIS << 1) OR _CLKEN
SYS_L           SET     _XPERSHARE OR (_VISIBLE << 1) OR (_XPEN << 2)
SYS_L           SET     SYS_L OR (_BDRSTEN << 3)
SYS_L           SET     SYS_L OR (_PWDCFG << 5) OR (_CSCFG << 6)
$IF (WRCFG_ENABLE == 1)
SYS_L           SET     SYS_L OR (_WRCFG << 7)
SYS_BITS        SET     SYS_BITS OR 00080H
$ENDIF
$IF (OWDDIS_ENABLE == 1)
SYS_L           SET     SYS_L OR (_OWDDIS << 4)
SYS_BITS        SET     SYS_BITS OR 00010H
$ENDIF
; Setup SYSCON Register

                BFLDH   SYSCON,#HIGH SYS_BITS,#SYS_H
                BFLDL   SYSCON,#LOW  SYS_BITS,#SYS_L
;
$IF (ADVANCED_SYSCON = 1)
SYS_2           SET     (PDCON << 4) OR (RTS << 6) OR (SCS << 7)
SYS_2           SET     SYS_2 OR (CLKCON << 8) OR (CLKREL << 10)

SYS_3           SET     ADCDIS OR (ASC0DIS << 1) OR (SSCDIS << 2)
SYS_3           SET     SYS_3 OR (GPTDIS << 3)
SYS_3           SET     SYS_3 OR (FMDIS << 5) OR (CC1DIS << 6) OR (CC2DIS << 7)
SYS_3           SET     SYS_3 OR (CC6DIS << 8) OR (PWMDIS << 9)
SYS_3           SET     SYS_3 OR (ASC1DIS << 10) OR (I2CDIS << 11)
SYS_3           SET     SYS_3 OR (CAN1DIS << 13) OR (CAN2DIS << 14)
SYS_3           SET     SYS_3 OR (PCDDIS << 15)

                EXTR    #2
                MOV     SYSCON2,#SYS_2
                MOV     SYSCON3,#SYS_3
$ENDIF
;

$IF (BUSCON1 = 1)
BCON1           SET     (_MTTC1 << 5) OR (_RWDC1 << 4)
BCON1           SET     BCON1 OR ((NOT _MCTC1) AND 0FH)
BCON1           SET     BCON1 AND (NOT (_RDYEN1 << 3))
BCON1           SET     BCON1 OR (_RDY_AS1 << 3)  OR (_BTYP1 << 6)
BCON1           SET     BCON1 OR (_ALECTL1 << 9) OR (_BUSACT1 << 10)
BCON1           SET     BCON1 OR (_RDYEN1 << 12) OR (_CSREN1 << 14)
BCON1           SET     BCON1 OR (_CSWEN1 << 15)

%ADDR (ADDR1,%ADDRESS1,%RANGE1)
                MOV     ADDRSEL1,#ADDR1 
		MOV     R0, #BCON1
                BMOV    R0.6, BUSCON0.6         ; MUX / DEMUX Anpassung
                MOV     BUSCON1,R0
$ENDIF

$IF (BUSCON2 = 1)
BCON2           SET     (_MTTC2 << 5) OR (_RWDC2 << 4)
BCON2           SET     BCON2 OR ((NOT _MCTC2) AND 0FH)
BCON2           SET     BCON2 AND (NOT (_RDYEN2 << 3))
BCON2           SET     BCON2 OR (_RDY_AS2 << 3)  OR (_BTYP2 << 6)
BCON2           SET     BCON2 OR (_ALECTL2 << 9) OR (_BUSACT2 << 10)
BCON2           SET     BCON2 OR (_RDYEN2 << 12) OR (_CSREN2 << 14)
BCON2           SET     BCON2 OR (_CSWEN2 << 15)

%ADDR (ADDR2,%ADDRESS2,%RANGE2)
                MOV     ADDRSEL2,#ADDR2 
                MOV     BUSCON2,#BCON2
                BMOV    BUSCON2.6, BUSCON0.6    ; MUX / DEMUX Anpassung
$ENDIF

$IF (BUSCON3 = 1)
BCON3           SET     (_MTTC3 << 5) OR (_RWDC3 << 4)
BCON3           SET     BCON3 OR ((NOT _MCTC3) AND 0FH)
BCON3           SET     BCON3 AND (NOT (_RDYEN3 << 3))
BCON3           SET     BCON3 OR (_RDY_AS3 << 3)  OR (_BTYP3 << 6)
BCON3           SET     BCON3 OR (_ALECTL3 << 9) OR (_BUSACT3 << 10)
BCON3           SET     BCON3 OR (_RDYEN3 << 12) OR (_CSREN3 << 14)
BCON3           SET     BCON3 OR (_CSWEN3 << 15)

%ADDR (ADDR3,%ADDRESS3,%RANGE3)
%ADDR (ADDR3MI,%ADDRESS3MI,%RANGE3)
                MOV     ADDRSEL3,#ADDR3 
                MOV     BUSCON3,#BCON3
                BMOV    BUSCON3.6, BUSCON0.6    ; MUX / DEMUX Anpassung
$ENDIF

$IF (BUSCON4 = 1)
BCON4           SET     (_MTTC4 << 5) OR (_RWDC4 << 4)
BCON4           SET     BCON4 OR ((NOT _MCTC4) AND 0FH)
BCON4           SET     BCON4 AND (NOT (_RDYEN4 << 3))
BCON4           SET     BCON4 OR (_RDY_AS4 << 3)  OR (_BTYP4 << 6)
BCON4           SET     BCON4 OR (_ALECTL4 << 9) OR (_BUSACT4 << 10)
BCON4           SET     BCON4 OR (_RDYEN4 << 12) OR (_CSREN4 << 14)
BCON4           SET     BCON4 OR (_CSWEN4 << 15)


%ADDR (ADDR4,%ADDRESS4,%RANGE4)
                MOV     ADDRSEL4,#ADDR4 
                MOV     BUSCON4,#BCON4
                BMOV    BUSCON4.6, BUSCON0.6    ; MUX / DEMUX Anpassung
$ENDIF


;*** *** *** *** *** Copy Flash Data into the SRAM on CS3 *** *** *** *** *** *** ***
;---------------------------------------------------------------------------
; Kopieren des Flash-Inhaltes:
;---------------------------------------------------------------------------
; Registerbelegung:
; R1  = Tempor鋜en Zwischenspeicher
; R2  = Anzahl zu lesender Datenbytes (Low-Word)
; R3  = Anzahl zu lesender Datenbytes (High-Word)
; R4  = Page-Offset Schreibadresse using DPP0
; R5  = Page-Offset Leseadresse    using DPP1

COPY_START:     

; Register-Initialisierung:

                MOV  R2,  #DPP0:SOF MIRRORRANGE ;Programmgr鲞e  Low-Word
                MOV  R3,   #DPP0:SEG MIRRORRANGE ;Programmgr鲞e High-Word
                MOV  R4,   #DPP0:POF %ADDRESS3
                MOV  DPP0, #PAG %ADDRESS3
                MOV  R5,   #DPP1:POF MIRRORSTART
                MOV  DPP1, #PAG MIRRORSTART


; Kopierschleife:

COPY_LOOP:      MOVW [R4+],[R5]             ;Daten-Wort kopieren
                AND  R4, #3FFFh             ;Nur DPP0 verwenden
                JMPR cc_NZ, COPY_CONT1      ;Keine Seitengrenze -> Weiter
                ADD  DPP0, #0001h           ;N鋍hste 16-KByte-Seite
                
COPY_CONT1:     ADD  R5, #0002h             ;Adresse inkrementieren
                AND  R5, #3FFFh             ;Nur Page-Offset ber點ksichtigen
                JMPR cc_NZ, COPY_CONT2      ;Keine Seitengrenze -> Weiter
                ADD  DPP1, #0001h           ;N鋍hste 16-KByte-Seite
COPY_CONT2:     OR   R5, #DPP1:0000h        ;DPP1 verwenden

                SRVWDT                      ;Watchdog bedienen
                SUB  R2, #0002             ;Z鋒ler dekrementieren
                SUBC R3, #0000              
                JMPR cc_NC, COPY_LOOP       ;Z鋒ler >= 0 -> Weiter



                MOV     ADDRSEL3,#ADDR3MI     ;CS3 黚er CS0 legen

                
;*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 


$IF (STK_SIZE = 7)
                MOV     STKUN,#0FFFEH           ; AVOID STKUN TRAP
                MOV     STKOV,#0H               ; AVOID STKOV TRAP
                MOV     SP,#DPP3:_TOS           ; INITIALIZE STACK POINTER
                MOV     STKUN,#DPP3:_TOS        ; INITIALIZE STACK UNFL REGISTER
                MOV     STKOV,#DPP3:(_BOS+6*2)  ; INITIALIZE STACK OVFL REGISTER
$ELSE
                MOV     STKOV,#(_BOS+6*2)       ; INITIALIZE STACK OVFL REGISTER
$ENDIF

$IF NOT TINY

                EXTRN   ?C_PAGEDPP0 : DATA16
                EXTRN   ?C_PAGEDPP1 : DATA16
                EXTRN   ?C_PAGEDPP2 : DATA16

$IF (DPPUSE = 1)
                MOV     DPP0,#?C_PAGEDPP0       ; INIT DPP0 VALUE
$ENDIF
                MOV     DPP1,#?C_PAGEDPP1       ; DEFAULT NEAR CONST PAGE
                MOV     DPP2,#?C_PAGEDPP2       ; DEFAULT NEAR DATA  PAGE

$ENDIF

                MOV     CP,#?C_MAINREGISTERS
                EINIT

;$IF NOT TINY
;               MOV     R0,#DPP2:?C_USERSTKTOP
;$ELSE
                MOV     R0,#?C_USERSTKTOP
;$ENDIF


;------------------------------------------------------------------------------
;
; The following code is necessary to set RAM variables to 0 at start-up
; (RESET) of the C application program.
;

$IF (CLR_MEMORY = 1)

                EXTRN   ?C_CLRMEMSECSTART : WORD
Clr_Memory:
$IF TINY
                MOV     R8,#?C_CLRMEMSECSTART
                JMPR    cc_Z,EndClear

RepeatClear:
$IF (WATCHDOG = 1)
                SRVWDT                          ; SERVICE WATCHDOG
$ENDIF
                MOV     R5,#0
                MOV     R2,[R8+]    ; Count
                JMPR    cc_Z,EndClear
                MOV     R3,R2
                MOV     R4,[R8+]
                JBC     R2.14,ClearNear

ClearBit:       MOV     R3,R4
                SHR     R3,#3
                BCLR    R3.0
                ADD     R3,#0FD00H              ; START OF BIT SPACE
                MOV     R5,#1
                SHL     R5,R4
                CPL     R5
                AND     R5,[R3]
                MOV     [R3],R5
                ADD     R4,#1

⌨️ 快捷键说明

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