;******************************************************************************
; 文件名:PWMDAC.S
; 功能:使用PWM6输出PWM信号,通过滤波电路实现DAC转换。
; 说明:将跳线器JP2短接,JP3_RXD1断开。使用示波器观察测试点PWM和PWMDAC。
;******************************************************************************
INCLUDE LPC2294.INC
EXPORT MAIN
PWM_BASE EQU 0xE0014000
; PWM周期及占空比设置值
CYCLE_DATA EQU 2000
DUTY_CYCLE_DATA EQU 1000
AREA PWMDACC,CODE,READONLY
ENTRY
MAIN MOV R7,#0xFF0 ; 系统上电延时
DELAY_L1 SUBS R7,R7,#1
BNE DELAY_L1
LDR R0,=PINSEL0
MOV R1,#0x00080000
STR R1,[R0] ; 设置PWM6连接到P0.9管脚
BL SYSCLK_INI ; 设置系统时钟
; 设置PWM输出
LDR R0,=PWM_BASE
MOV R1,#0x00
STR R1,[R0,#0x0C] ; PWMPR=0x00,不分频,计数频率为Fpclk
MOV R1,#0x02
STR R1,[R0,#0x14] ; PWMMCR=0x02,设置PWMMR0匹配时复位PWMTC
LDR R1,=CYCLE_DATA
STR R1,[R0,#0x18] ; PWMMR0=CYCLE_DATA,设置PWM周期
LDR R1,=DUTY_CYCLE_DATA
STR R1,[R0,#0x48] ; PWMMR6=DUTY_CYCLE_DATA,设置PWM占空比
MOV R1,#0x41
STR R1,[R0,#0x50] ; PWMLER=0x41,PWMMR0、PWMMR6锁存
MOV R1,#0x4000
STR R1,[R0,#0x4C] ; PWMPCR=0x4000,允许PWM6输出,单边PWM
MOV R1,#0x09
STR R1,[R0,#0x04] ; PWMTCR=0x09,启动定时器,PWM使能
HALT B HALT
;******************************************************************************
; 名称:SYSCLK_INI
; 功能:设置系统时钟。(M值为4,P值为2)
; 入口参数:无
; 出口参数:无
; 占用资源:R0、R1
;******************************************************************************
SYSCLK_INI
LDR R0,=VPBDIV
MOV R1,#0x00
STR R1,[R0] ; VPBDIV=0x00
LDR R0,=PLLCFG
MOV R1,#0x23
STR R1,[R0] ; PLLCFG=0x23,设置M值为4,P值为2
LDR R0,=PLLCON
MOV R1,#0x01
STR R1,[R0] ; PLLCON=0x01
LDR R0,=PLLFEED
MOV R1,#0xAA
STR R1,[R0] ; PLLFEED=0xAA
MOV R1,#0x55
STR R1,[R0] ; PLLFEED=0x55
WAIT_OK LDR R0,=PLLSTAT
LDR R1,[R0]
ANDS R1,R1,#0x0400
BEQ WAIT_OK ; 等待PLL锁定
LDR R0,=PLLCON
MOV R1,#0x03
STR R1,[R0]
LDR R0,=PLLFEED
MOV R1,#0xAA
STR R1,[R0]
MOV R1,#0x55
STR R1,[R0]
MOV PC,LR
END