📄 pwmout.s
字号:
;******************************************************************************
; 文件名:PWMOUT.S
; 功能:控制PWM6输出PWM信号,通过滤波电实现DAC转换。由KEY1控制PWM的占空比,每按一次按键
; 将会改变一次PWM的占空比。
; 说明:将跳线器JP11短接,JP6_RXD1断开。使用示波器观察测试点PWM。
;******************************************************************************
INCLUDE LPC2294.INC
EXPORT MAIN
PWM_BASE EQU 0xE0014000
KEY1 EQU (1<<16) ; P0.16引脚连接KEY1
PWMDAC EQU 0x40002F00 ; 定义DAC变量
AREA PWMOUTC,CODE,READONLY
CODE32
MAIN LDR SP,=0x40003000 ; 设置堆栈指针SP
LDR R0,=PINSEL0 ; 设置PWM6接口有效
MOV R1,#0x00080000
STR R1,[R0]
BL SYSCLK_INI
LDR R0,=PWM_BASE
MOV R1,#0xFF
STR R1,[R0] ; PWMIR复位为0
MOV R1,#0x00
STR R1,[R0,#0x08] ; PWMTC复位,PWMTC为32位增量定时器
STR R1,[R0,#0x0C] ; PWMPR置为0,即计数器不进行分频
MOV R1,#0x02
STR R1,[R0,#0x14] ; PWMMCR,设置MR0匹配时复位PWMTC
MOV R1,#0x4000
STR R1,[R0,#0x4C] ; PWMPCR,使能PWM6输出,并设置PWMSEL6 = 0
MOV R1,#0x41
STR R1,[R0,#0x50] ; PWMLER,设置PWM比较值自动更新
; 设置脉宽
MOV R1,#0xFF0 ; 到达此值后,输出高电平
STR R1,[R0,#0x18]
; 设置占空比
MOV R1,#0x800 ; 当到达此值后,输出低电平
STR R1,[R0,#0x48]
; 设置PWM模式,启动PWM功能。计数频率为PCLK,不分频
MOV R1,#0x09
STR R1,[R0,#0x04] ; PWMTCR,启动PWM
LDR R0,=PWMDAC
MOV R1,#0x800
STR R1,[R0]
LOOP BL WAITKEY
; 占空比加100
LDR R0,=PWMDAC
LDR R1,[R0]
ADD R1,R1,#100
; 若变空比大于脉宽值,则复位为0
CMP R1,#0xFF0
MOVHI R1,#0x000
STR R1,[R0] ; 保存占空比数据
; 设置占空比
LDR R0,=PWM_BASE
STR R1,[R0,#0x48]
MOV R1,#0x40
STR R1,[R0,#0x50] ; PWMLER,设置PWM比较值自动更新
B LOOP
;******************************************************************************
; 名称: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
;******************************************************************************
; 名称:WAITKEY
; 功能:等待一个有效按键。本程序有去抖功能。
; 入口参数:无
; 出口参数:无
; 占用资源:R0、R1、R7
;******************************************************************************
WAITKEY
; 等待KEY1键按下
WAITKEY_DOWN LDR R0,=IO0PIN ; 装载寄存器地址,IO0PIN
LDR R1,[R0] ; 读取I/O口的值
ANDS R1,R1,#KEY1 ; 屏蔽有效位,判断KEY1键是否按下
BNE WAITKEY_DOWN ; 若没有按下,则等待
; 去抖动
MOV R7,#0x00003F00
WAITKEY_L1 SUBS R7,R7,#1
BNE WAITKEY_L1
LDR R1,[R0] ; 读取I/O口的值,判断KEY1键是否仍按下
ANDS R1,R1,#KEY1
BNE WAITKEY_DOWN
; 等待按键放开
WAITKEY_UP LDR R1,[R0]
ANDS R1,R1,#KEY1
BEQ WAITKEY_UP
MOV PC,LR ; 返回
ALIGN ; 数据字对齐
LTORG ; 声明文字池
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -