📄 st5us_f.a66
字号:
; 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 + -