|
;******************************************************* ; 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
|