📄 boot.tpl
字号:
;---------------------------------------
; Initialize Crystal Oscillator and PLL
;---------------------------------------
IF ( SELECT_32K & WAIT_FOR_32K )
; If the user has requested the External Crystal Oscillator (ECO) then turn it
; on and wait for it to stabilize and the system to switch over to it. The PLL
; is left off. Set the SleepTimer period is set to 1 sec to time the wait for
; the ECO to stabilize.
;
M8C_SetBank1
mov reg[OSC_CR0], (SELECT_32K_JUST | OSC_CR0_SLEEP_1Hz | OSC_CR0_CPU_12MHz)
M8C_SetBank0
M8C_ClearWDTAndSleep ; Reset the sleep timer to get a full second
or reg[INT_MSK0], INT_MSK0_SLEEP ; Enable latching of SleepTimer interrupt
mov reg[INT_VC], 0 ; Clear all pending interrupts
.WaitFor1s:
tst reg[INT_CLR0], INT_MSK0_SLEEP ; Test the SleepTimer Interrupt Status
jz .WaitFor1s ; Interrupt will latch but will not dispatch
; since interrupts are not globally enabled
ELSE ; !( SELECT_32K & WAIT_FOR_32K )
; Either no ECO, or waiting for stable clock is to be done in main
M8C_SetBank1
mov reg[OSC_CR0], (SELECT_32K_JUST | PLL_MODE_JUST | SLEEP_TIMER_JUST | OSC_CR0_CPU_12MHz)
M8C_SetBank0
M8C_ClearWDTAndSleep ; Reset the watch dog
ENDIF ;( SELECT_32K & WAIT_FOR_32K )
IF ( PLL_MODE )
; Crystal is now fully operational (assuming WAIT_FOR_32K was enabled).
; Now start up PLL if selected, and wait 16 msec for it to stabilize.
;
M8C_SetBank1
mov reg[OSC_CR0], (SELECT_32K_JUST | PLL_MODE_JUST | OSC_CR0_SLEEP_64Hz | OSC_CR0_CPU_3MHz)
M8C_SetBank0
M8C_ClearWDTAndSleep ; Reset the sleep timer to get full period
mov reg[INT_VC], 0 ; Clear all pending interrupts
.WaitFor16ms:
tst reg[INT_CLR0],INT_MSK0_SLEEP ; Test the SleepTimer Interrupt Status
jz .WaitFor16ms
M8C_SetBank1 ; continue boot at CPU Speed of SYSCLK/2
mov reg[OSC_CR0], (SELECT_32K_JUST | PLL_MODE_JUST | OSC_CR0_SLEEP_64Hz | OSC_CR0_CPU_12MHz)
M8C_SetBank0
IF ( WAIT_FOR_32K )
ELSE ; !( WAIT_FOR_32K )
; Option settings (PLL-Yes, ECO-No) are incompatible - force a syntax error
ERROR_PSoC Disabling WAIT_FOR_32K requires that the PLL_Lock must be enabled in user code.
ENDIF ;(WAIT_FOR_32K)
ENDIF ;(PLL_MODE)
;------------------------
; Close CT leakage path.
;------------------------
mov reg[ACB00CR0], 05h
mov reg[ACB01CR0], 05h
mov reg[ACB02CR0], 05h
mov reg[ACB03CR0], 05h
;-------------------------
; Load Base Configuration
;-------------------------
; Load global parameter settings and load the user modules in the
; base configuration. Exceptions: (1) Leave CPU Speed fast as possible
; to minimize start up time; (2) We may still need to play with the
; Sleep Timer.
;
lcall LoadConfigInit
;-----------------------------------
; Initialize C Run-Time Environment
;-----------------------------------
IF ( C_LANGUAGE_SUPPORT )
mov A,0 ; clear the 'bss' segment to zero
mov [__r0],<__bss_start
BssLoop:
cmp [__r0],<__bss_end
jz BssDone
mvi [__r0],A
jmp BssLoop
BssDone:
mov A,>__idata_start ; copy idata to data segment
mov X,<__idata_start
mov [__r0],<__data_start
IDataLoop:
cmp [__r0],<__data_end
jz C_RTE_Done
push A
romx
mvi [__r0],A
pop A
inc X
adc A,0
jmp IDataLoop
C_RTE_Done:
ENDIF ; C_LANGUAGE_SUPPORT
;-------------------------------
; Voltage Stabilization for SMP
;-------------------------------
IF ( SUPPLY_VOLTAGE ) ; 1 Means 5 Volts
IF ( SWITCH_MODE_PUMP ^ 1 ) ; SMP is operational
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; When using the SMP at 5V, we must wait for Vdd to slew from 3.1V to
; 5V before enabling the Precision Power-On Reset (PPOR).
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
or reg[INT_MSK0],INT_MSK0_SLEEP
M8C_SetBank1
and reg[OSC_CR0], ~OSC_CR0_SLEEP
or reg[OSC_CR0], OSC_CR0_SLEEP_512Hz
M8C_SetBank0
M8C_ClearWDTAndSleep ; Restart the sleep timer
mov reg[INT_VC], 0 ; Clear all pending interrupts
.WaitFor2ms:
tst reg[INT_CLR0], INT_MSK0_SLEEP ; Test the SleepTimer Interrupt Status
jz .WaitFor2ms ; Branch fails when 2 msec has passed
ENDIF ; ( SWITCH_MODE_PUMP ^ 1 )
ENDIF ; ( SUPPLY_VOLTAGE )
;-------------------------------
; Set Power-On Reset (POR) Level
;-------------------------------
M8C_SetBank1
IF ( SUPPLY_VOLTAGE ) ; 1 Means 5 Volts
IF ( CPU_CLOCK_JUST ^ OSC_CR0_CPU_24MHz ) ; Also 24MHz?
; no, set 4.5V POR in user code, if desired
ELSE ; 24HMz ;
or reg[VLT_CR], VLT_CR_POR_HIGH ; yes, highest POR trip point required
ENDIF ; OSC_CRO_CPU_24MHz
ENDIF ; 5V
M8C_SetBank0
;----------------------------
; Wrap up and invoke "main"
;----------------------------
; Disable the Sleep interrupt that was used for timing above. In fact,
; no interrupts should be enabled now, so may as well clear the register.
;
mov reg[INT_MSK0],0
; Everything has started OK. Now select requested CPU & sleep frequency.
;
M8C_SetBank1
mov reg[OSC_CR0],(SELECT_32K_JUST | PLL_MODE_JUST | SLEEP_TIMER_JUST | CPU_CLOCK_JUST)
M8C_SetBank0
; Global Interrupt are NOT enabled, this should be done in main().
; LVD is set but will not occur unless Global Interrupts are enabled.
; Global Interrupts should be enabled as soon as possible in main().
;
mov reg[INT_VC],0 ; Clear any pending interrupts which may
; have been set during the boot process.
IF ENABLE_LJMP_TO_MAIN
ljmp _main ; goto main (no return)
ELSE
lcall _main ; call main
.Exit:
jmp .Exit ; Wait here after return till power-off or reset
ENDIF
;---------------------------------
; Library Access to Global Parms
;---------------------------------
;
bGetPowerSetting:
_bGetPowerSetting:
; Synthesize the "power setting" value used by chips with SlowIMO mode.
; Returns value of POWER_SETTING in the A register.
; No inputs. No Side Effects.
;
IF ( SUPPLY_VOLTAGE ) ; 1 means 5.0V
mov A, POWER_SET_5V0_24MHZ ; Supply & Internal Main Oscillator speed
ELSE
mov A, POWER_SET_3V3_24MHZ ; Supply & Internal Main Oscillator speed
ENDIF
ret
;---------------------------------
; Order Critical RAM & ROM AREAs
;---------------------------------
; 'TOP' is all that has been defined so far...
; ROM AREAs for C CONST, static & global items
;
AREA lit (ROM, REL, CON) ; 'const' definitions
AREA idata (ROM, REL, CON) ; Constants for initializing RAM
__idata_start:
AREA func_lit (ROM, REL, CON) ; Function Pointers
__func_lit_start:
AREA psoc_config (ROM, REL, CON) ; Configuration Load & Unload
AREA UserModules (ROM, REL, CON) ; User Module APIs
; CODE segment for general use
;
AREA text (ROM, REL, CON)
__text_start:
; RAM area usage
;
AREA data (RAM, REL, CON) ; initialized RAM
__data_start:
AREA virtual_registers (RAM, REL, CON) ; Temp vars of C compiler
AREA InterruptRAM (RAM, REL, CON) ; Interrupts, on Page 0
AREA bss (RAM, REL, CON) ; general use
__bss_start:
; end of file boot.asm
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -