boot.asm
来自「PSOC 电动自行车代码 器件采用CYPRESS新电动自行车器件CY8C245」· 汇编 代码 · 共 459 行 · 第 1/2 页
ASM
459 行
ENDIF
ENDIF ; 3.3 Volt Operation
IF ( POWER_SETTING & POWER_SET_2V7_12MHZ) ; *** 2.7 Volts / 12MHZ operation ***
or reg[CPU_SCR1], CPU_SCR1_SLIMO
M8SSC_SetTableTrims 2, SSCTBL2_TRIM_IMO_2V_12MHZ, SSCTBL2_TRIM_BGR_2V, AGND_BYPASS_JUST
ENDIF ; *** 2.7 Volts / 12MHZ operation ***
IF ( POWER_SETTING & POWER_SET_2V7_6MHZ) ; *** 2.7 Volts / 6MHZ operation ***
or reg[CPU_SCR1], CPU_SCR1_SLIMO
M8SSC_SetTableTrims 2, SSCTBL2_TRIM_IMO_2V_6MHZ, SSCTBL2_TRIM_BGR_2V, AGND_BYPASS_JUST
ENDIF ; *** 2.7 Volts / 6MHZ operation ***
mov [bSSC_KEY1], 0 ; Lock out Flash and Supervisiory operations
mov [bSSC_KEYSP], 0
;---------------------------------------
; 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
;-------------------------
; 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
;-------------------------------
; Set Power-On Reset (POR) Level
;-------------------------------
M8C_SetBank1
IF (POWER_SETTING & POWER_SET_2V7) ; 2.7V Operation?
; Yes, lowest trip already set
ELSE ; No, must adjust POR...
IF (POWER_SETTING & POWER_SET_3V3) ; 3.3V Operation?
or reg[VLT_CR], VLT_CR_POR_MID ; Yes, change to midpoint trip
ELSE
IF (POWER_SETTING & POWER_SET_5V0) ; 5.0V Operation?
IF (POWER_SETTING & POWER_SET_SLOW_IMO) ; and Slow Mode?
or reg[VLT_CR], VLT_CR_POR_MID ; Yes, set to midpoint trip
ELSE ; No, fast mode
IF ( CPU_CLOCK_JUST ^ OSC_CR0_CPU_24MHz ) ; As fast as 24MHz?
or reg[VLT_CR], VLT_CR_POR_MID ; No, change to midpoint trip
ELSE ; 24HMz ;
or reg[VLT_CR], VLT_CR_POR_HIGH ; Yes, switch to highest setting
ENDIF ; 24MHz
ENDIF ; Slow Mode
ENDIF ; 5.0V Operation
ENDIF ; 3.3V Operation
ENDIF ; 2.7V Operation
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 (TOOLCHAIN & HITECH)
ljmp startup ; Jump to C compiler startup code
ELSE
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
ENDIF ; TOOLCHAIN
;---------------------------------
; Library Access to Global Parms
;---------------------------------
;
bGetPowerSetting:
_bGetPowerSetting:
; Returns value of POWER_SETTING in the A register.
; No inputs. No Side Effects.
;
IF (POWER_SETTING & POWER_SET_2V7)
mov A, POWER_SETTING | POWER_SET_SLOW_IMO
ELSE
mov A, POWER_SETTING ; Supply voltage and internal main osc
ENDIF
ret
IF (TOOLCHAIN & HITECH)
ELSE
;---------------------------------
; 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:
ENDIF ; TOOLCHAIN
; end of file boot.asm
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?