📄 pwm.asm
字号:
;*******************************************************
; File Name:PWM.asm
;*******************************************************
.title "PWM"
.include LF2407.inc
.include CPU.inc
.include GPIO.inc
;*******************************************************
TxdPtr: .usect "data", 8
RxdPtr: .usect "data", 8
.data
counterValue .byte 1
;*******************************************************
.def _c_int0
.def GIsr2
.ref Pvect
;*******************************************************
; 主程序开始
.text
_c_int0:
call fSysInit
ldp #DP_PF2
splk #MCRAV, MCRA
splk #MCRBV, MCRB
splk #7f01h, PADATDIR
splk #0808h, PBDATDIR
; splk #80h, EVAIMRA
; splk #0ffffh, EVAIFRA
; splk #0, GPTCONA
; splk #177h, T1PR
; splk #0, T1CNT
; splk #0164ch, T1CON
; clrc INTM
;wait:
; nop
; b wait
; call fSciInit
; call evaPwmInit
Main:
ldp #0000h
LoopMain:
ldp #00e1h
call StepMotor
b LoopMain
;*******************************************************
evaPwmInit:
;
ldp #DP_PF2 ; 指向 7080h~7100h
lacl MCRA
or #PWMMCR ; PA.1~PA.4配置为PWM输出
sacl MCRA
ldp #DP_EVA ;
splk #0ffffh, EVAIFRA ; 清除EVA全部中断标志
splk #0666h, ACTRA ; PWM2、4低有效,PWM1、3高有效
splk #00h, DBTCONA ; 不使能死区控制
splk #10h, CMPR1 ; 设置比较初值PWM1高电平占50/60,低电平上10/60
splk #20h, CMPR2 ; 设置PWM3、4的比较寄存器
splk #60h, T1PR ; 设置定时器1周期寄存器,即PWM周期为60个CPU时钟周期
splk #0a600h, COMCONA ; 使能比较操作
splk #0, T1CNT
splk #41h, GPTCONA ; TCOMPOE=1, T1PIN=01
splk #080h, EVAIMRA ; 通用定时器1使能
splk #174eh, T1CON ; TMODE=10连续增计数模式,TPS=111预分频为128
; TENABLE=1定时器计数使能,TCLKS=00内部时钟
; TECMPR=1定时器1比较使能,SELT1PR=0
clrc INTM ; 开总中断
ret
;*******************************************************
StepMotor:
call fDelay
lacc PADATDIR
and #STEPMASK
or #step1
sacl PADATDIR
call fDelay
lacc PADATDIR
and #STEPMASK
or #step2
sacl PADATDIR
call fDelay
lacc PADATDIR
and #STEPMASK
or #step3
sacl PADATDIR
call fDelay
lacc PADATDIR
and #STEPMASK
or #step4
sacl PADATDIR
b StepMotor
ret
;*******************************************************
fSendChar:
; 发送一个字符
mar AR2
lacc #'b'
sacl * ; 发送数据到SCITXBUF寄存器
LoopSendChar:
ldp #DP_PF1
bit SCICTL2, BIT7
bcnd LoopSendChar, NTC
ret
;*******************************************************
; 系统初始化程序
fSysInit:
setc INTM ; 初始化期间禁止中断
clrc SXM ; 清符号扩展模式
clrc OVM ; 溢出模式复位
clrc CNF ; 配置B0块到数据存储区
ldp #DP_PF1 ; 设置DP=E0H,则数据存储器地址为7000H~707FH
splk #81feh, SCSR1 ; CLKOUT=CLKIN*4
; splk #0041h, SCSR1 ; CLKOUT=CLKIN*4
splk #00e8h, WDCR ; 不使能WDT
ldp #0
splk #0002h, IMR ; 不使能中断
splk #0ffffh, IFR ; 清除全部中断标志
ret
;*******************************************************
; SCI接口初始化程序
fSciInit:
ldp #0e1h
lacl MCRB
or #18h
sacl MCRB ; 配置串行口引脚为特殊功能:TXD、RXD
ldp #DP_PF1
splk #00fh, SCICCR ; 地址位唤醒模式,N,8,1
splk #007h, SCICTL1 ; 接收、发送、内部时钟使能,SLEEP=1
splk #002h, SCICTL2 ; 接收中断使能
splk #(BRR/256), SCIHBAUD
splk #(BRR & 0ffh), SCILBAUD ; 设置波特率寄存器
splk #023h, SCICTL1 ; 串口初始化完成
lar ar1, #SCIRXBUF ; 接收缓冲寄存器地址
lar ar2, #SCITXBUF ; 发送缓冲寄存器地址
lar ar3, #RxdPtr ; 接收的数据指针
lar ar4, #TxdPtr ; 发送的数据指针
ldp #0
splk #0001h, IMR ; 允许INT1中断
splk #0ffffh, IFR ; 清所有中断标志
clrc INTM ; 开总中断
ret
;*******************************************************
GIsr1:
; 优先级INT1中断入口
ldp #0e0h
lacc PIVR, 1 ; 读取外设中断向量寄存器,并左移一位
add #Pvect ; 加上外设中断入口地址
bacc ; 跳到相应的中断服务子程序
ExitGIsr1:
; 恢复现场
clrc INTM ; 开中总断,因为一进中断就自动关闭总中断
ret
;*******************************************************
RxInt:
; SCI接收中断服务程序
ldp #DP_PF1
mar *, AR1
bit SCICTL1, BIT2
b ExitGIsr1
;*******************************************************
GIsr2:
; 优先级INT2中断入口
ldp #DP_PF1
lacc PIVR, 1
add #Pvect
bacc
ExitGIsr2:
; 恢复现场
clrc INTM ; 开中总断,因为一进中断就自动关闭总中断
ret
;*******************************************************
T1PInt:
; 通用定时器1中断入口
ldp #DP_EVA
splk #0, T1CNT
b ExitGIsr2
;*******************************************************
; 延时程序
fDelay:
mar *, ar4
lar ar4, #02ffeh
lar ar0, #00h
LoopDelay:
sbrk #1
nop
cmpr 00
bcnd LoopDelay, ntc
ret
;*******************************************************
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -