📄 main.asm
字号:
***************************************************************************************
***
*** Realtime.asm
*** Code for real time tutorial
*** Platform: F240 EVM, F243 EVM, or F2407A DSK
***
***************************************************************************************
; Main program: Initialize F240, F243, or F2407A
; Initialize timer 1 to start underflow interrupt
; Enable interrupt and Call Real Time monitor
; Infinite loop. In this loop, main_counter is incremented
; Timer 1 interrupt: Save context
; Increment a counter (ISR_counter)
; Clear interrupt flag
; Restore context
; Return to main
***************************************************************************************
; Include header file:
.include "X24x.h"
; Step 1: Global declaration:
.global _c_int0, T1_ISR, PHANTOM, NMI_ISR
.global MON_RT_CNFG
; Variables declaration:
.bss test,1
.bss Isr_counter,1
.bss Isr_step,1
.bss Main_counter,1
.bss GPR0,1
******************************************************************
******
****** MAIN
******
******************************************************************
.text
_c_int0:
_main:
; Disable interrupts, Clear SXM, OVM and CNF bits
POINT_PG0
SETC INTM ; Disable interrupts
SPLK #0h, IMR ; Mask all Ints
SPLK #0FFh, IFR ; Clear all Int Flags
CLRC SXM ; Clear Sign Extension Mode
CLRC OVM ; Reset Overflow Mode
CLRC CNF ; Config Block B0 to Data mem.
; Initialize device: Set PLL, watchdog, wait state generator
; and reset EV registers
; If you use the F240 EVM, CALL INIT_240
; If you use the F243 EVM, CALL INIT_243
; If you use the F2407A DSK, CALL INIT_2407
; CALL INIT_240 ; Init 240 Evm
; CALL INIT_243 ; Init 243 Evm
CALL INIT_2407 ; Init 2407 Dsk
; Initialize and start Timer 1:
SPLK #2000, T1PER ; Set T1 period
SPLK #0, T1CNT ; Initialize T1 counter
SPLK #0A840h, T1CON ; Enable Timer 1
; Cont Up/Down Mode
; Step 2: Load auxilary register AR7, stack pointer:
LAR AR7, #310h ; Point to B1 for Stack
; Variables initialization
POINT_B0 ; Control variable page
SPLK #1, Isr_step ; Step for isr_counter
SPLK #0h, Isr_counter
SPLK #0h, Main_counter
; Clear Event Manager IFR registers:
LDP #DP_EV
SPLK #0FFFFh,IFRA
SPLK #0FFFFh,IFRB
SPLK #0FFFFh,IFRC
; Unmask T1 Underflow Interrupt:
SPLK #0200h,IMRA
SPLK #0000h,IMRB
SPLK #0000h,IMRC
; Step 3: Initialize real-time monitor
CALL MON_RT_CNFG ; Call real time monitor routine
; Step 4: Unmask interrupt
LDP #0h
SPLK #01000010b, IMR ; Unmask interrupt level 2 for PWM interrupt
; and interrupt level 7 for Real time interrupt
; Clear interrupt flags and enable interrupts:
SPLK #0FFFFh, IFR ; Clear interrupt flags
CLRC INTM ; Enable interrupts
; Infinite loop:
LOOP
POINT_B0
LACC Main_counter
ADD #1
SACL Main_counter ; Main_counter = Main_counter+1
B LOOP
**********************************************************
* PHANTOM ISR *
**********************************************************
PHANTOM:
RET ; return to main
**********************************************************
* NMI ISR *
**********************************************************
NMI_ISR:
CLRC INTM ; re-enable maskable interrupts
RET ; return to main
***********************************************************
* T1 ISR *
* *
* Called each Timer 1 underflow interrupt *
***********************************************************
T1_ISR:
; Step 5: Context saving.
POINT_PG0
MAR *, AR7 ; AR7 is stack pointer
MAR *+ ; skip one position
SST #1, *+ ; save ST1
SST #0, *+ ; save ST0
SACH *+ ; save acc high
SACL * ; save acc low
; Isr_counter increment:
POINT_B0 ; Control variable page
LACC Isr_counter
ADD Isr_step
SACL Isr_counter ; Isr_counter = Isr_counter + Isr_step
; Clear interrupt flag
POINT_EV
SPLK #0FFFFh, IFRA ; Clear all Group A interrupt flags
; Step 6: Context restore
POINT_PG0
MAR *, AR7 ; make stack pointer active
LACL *- ; Restore Acc low
ADDH *- ; Restore Acc high
LST #0, *- ; load ST0
LST #1, *- ; load ST1
; Enable interrupt and return:
CLRC INTM ; Enable interrupt
RET ; Return to main
******************* END PWM ISR *******************************
****************************************************************
;Module: 240 Initialization
;
; Initialize the PLL, Watchdog, Wait state generator
; Clear EV registers
***************************************************************
INIT_240:
POINT_B0
SPLK #04h, GPR0 ; Set 0 wait states for XMIF
OUT GPR0, WSGR
POINT_PF1
SPLK #00000010b, PLL_CNTL1 ; Disable PLL first.=CPUCLK/2,
SPLK #10110001b, PLL_CNTL2 ; CLKIN(XTAL)=10MHz, PLL*2.0=20MHz
SPLK #10000011b, PLL_CNTL1 ; CLKMD=PLL Enable,SYSCLK/4=CPUCLK/2,
SPLK #40C0h, SYSCR ; CLKOUT=CPUCLK
; Clear all reset variables
POINT_PF1
LACC SYSSR
AND #69FFh
SACL SYSSR
; Disable the watchdog timer
POINT_PF1
SPLK #006Fh, WD_CNTL
SPLK #05555h, WD_KEY
SPLK #0AAAAh, WD_KEY
SPLK #006Fh, WD_CNTL
; Clear All EV Registers
ZAC
LDP #DP_EV
SACL GPTCON
SACL T1CNT
SACL T1CMP
SACL T1PER
SACL T1CON
SACL T2CNT
SACL T2CMP
SACL T2PER
SACL T2CON
SACL T3CNT
SACL T3CMP
SACL T3PER
SACL T3CON
SACL COMCON
SACL ACTR
SACL SACTR
SACL DBTCON
SACL CMPR1
SACL CMPR2
SACL CMPR3
SACL SCMPR1
SACL SCMPR2
SACL SCMPR3
SACL CAPCON
SACL CAPFIFO
SACL FIFO1
SACL FIFO2
SACL FIFO3
SACL FIFO4
RET ; Return to main
************* END 240 Initialization ********************
****************************************************************
;Module: 243 Initialization
;
; Initialize the PLL, Watchdog and Wait state generator
; Clear EV registers
***************************************************************
.include "X24x.h"
INIT_243:
POINT_B0 ; Variables data page
SPLK #01000000b, GPR0 ; Set 1 wait state for I/O
OUT GPR0, WSGR
POINT_PF1 ; Peripherals first data page
SPLK #4000h,SCSR
; Disable the watchdog timer
POINT_PF1 ; Peripherals first data page
SPLK #006Fh, WD_CNTL
SPLK #05555h, WD_KEY
SPLK #0AAAAh, WD_KEY
SPLK #006Fh, WD_CNTL
; Clear All EV Registers
ZAC
POINT_EV ; EV data page
SACL GPTCON
SACL T1CNT
SACL T1CMP
SACL T1PER
SACL T1CON
SACL T2CNT
SACL T2CMP
SACL T2PER
SACL T2CON
SACL COMCON
SACL ACTR
SACL DBTCON
SACL CMPR1
SACL CMPR2
SACL CMPR3
SACL CAPCON
SACL CAPFIFO
SACL FIFO1
SACL FIFO2
SACL FIFO3
RET ; Return to main
************* END 243 Initialization ********************
****************************************************************
;Module: 2407 Initialization
;
; Initialize the PLL, Watchdog and Wait state generator
; Clear EV registers
***************************************************************
INIT_2407:
POINT_B0 ; Variables data page
SPLK #01000000b, GPR0 ; Set 1 wait state for I/O
OUT GPR0, WSGR
POINT_PF1 ; Peripherals first data page
SPLK #4000h, SCSR
; Disable the watchdog timer
POINT_PF1 ; Peripherals first data page
SPLK #006Fh, WD_CNTL
SPLK #05555h, WD_KEY
SPLK #0AAAAh, WD_KEY
SPLK #006Fh, WD_CNTL
; Enable EVA peripheral clocks
SPLK #4, 7018h
; Clear All EV Registers
ZAC
POINT_EV ; EV data page
SACL GPTCON
SACL T1CNT
SACL T1CMP
SACL T1PER
SACL T1CON
SACL T2CNT
SACL T2CMP
SACL T2PER
SACL T2CON
SACL COMCON
SACL ACTR
SACL DBTCON
SACL CMPR1
SACL CMPR2
SACL CMPR3
SACL CAPCON
SACL CAPFIFO
SACL FIFO1
SACL FIFO2
SACL FIFO3
RET ; Return to main
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -