📄 main.asm
字号:
adc_buf .usect ".data0",300
adc_buf_ptr .usect ".data0",1
.include "f2407.h"
.def _c_int0, ADC_ISR
.text
_c_int0:
SETC INTM
CLRC SXM
CLRC OVM
CLRC CNF
LDP #DP_PF1
SPLK #83FEH,SCSR1 ;30MHz
SPLK #0E8H, WDCR
LDP #0H
SPLK #0FFFFH, IFR
SPLK #00001H, IMR
CALL ADINIT
CLRC INTM
CALL AD
WAIT:
NOP
B WAIT
;初始化ADC
ADINIT:
LDP #DP_EVA
SPLK #0000H, T2CNT
SPLK #170CH, T2CON ;连续增记数模式,128分频,立即重装载
SPLK #075H, T2PR
SPLK #00400H, GPTCONA ;周期中断标志位启动ADC
SPLK #0FFFFH, EVAIFRB
SPLK #00000H, EVAIMRB
LDP #DP_PF2
SPLK #0000H, ADCTRL1 ;ADC的转换逻辑时钟为30M
SPLK #0500H, ADCTRL2 ;中断模式(立即中断)
SPLK #0000H, MAXCONV
SPLK #0000H, CHSELSEQ1
LAR AR0, #adc_buf ;pointer to results buffer
SAR AR0, adc_buf_ptr ;initialize adc_buf_ptr
RET
;启动模数转换
AD:
LDP #DP_EVA
LACL T2CON
OR #40H
SACL T2CON
RET
;中断程序
ADC_ISR:
CLRC SXM
LDP #DP_PF2 ;set data page
LACL ADCTRL2 ;read and write ADCTRL2
OR #4200H ;reset SEQ1
SACL ADCTRL2 ;to clear the INT_FLAG_SEQ1
; SPLK #4000H, ADCTRL2
; SPLK #0700H, ADCTRL2
LACC RESULT0,10 ;read ADC RESULT0
;store the data value to the buffer
LDP #adc_buf_ptr
LAR AR2, adc_buf_ptr ;AR2 points to the buffer
MAR *, AR2 ;set ARP
SACH *+ ;store result
SAR AR2, adc_buf_ptr ;store updated pointer
;brute-force the circular buffer
LAR AR0, #(adc_buf+299) ;AR0 points to last buffer entry
CMPR 2 ;TC set if AR(ARP) > AR0
BCND adc_isr1, TC ;branch if TC not set
B ZLC ;re-init the pointer;
;context restore
adc_isr1:
LDP #adc_buf_ptr
LAR AR0, #adc_buf ;pointer to results buffer
SAR AR0, adc_buf_ptr ;initialize adc_buf_ptr
LDP #DP_EVA
SPLK #0000H, T2CNT ;clear timer2 counter
SPLK #174CH, T2CON ;init T2CON register
ZLC:
CLRC INTM ;re-enable global interrupts
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -