📄 pwmout.s
字号:
;******************************************************************************
; File:PWMOUT.S
; 功能:控制PWM输出,并实现PWM DAC转换操作。
; 说明:将跳线器JP10短接。使用示波器观察测试点PWM和PWMDAC。
;******************************************************************************
INCLUDE LPC2106.INC
KEY1 EQU 0x00004000 ; P0.14引脚连接KEY1
PWMDAC EQU 0x40002F00 ; 定义DAC变量
AREA PWMOUTC,CODE,READONLY
ENTRY
CODE32
MAIN LDR SP,=0x40003000 ; 设置堆栈指针SP
LDR R0,=PINSEL0 ; 设置PWM6接口有效
MOV R1,#0x00080000
STR R1,[R0]
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
;******************************************************************************
; 名称:WAITKEY
; 功能:等待一个有效按键。本程序有去抖功能。
; 入口参数:无
; 出口参数:无
; 占用资源:R0、R1、R7
;******************************************************************************
WAITKEY
; 等待KEY1键按下
WAITKEY_DOWN LDR R0,=IOPIN ; 装载寄存器地址,IOPIN
LDR R1,[R0] ; 读取I/O口的值
ANDS R1,R1,#KEY1 ; 屏蔽有效位,判断KEY1键是否按下
BNE WAITKEY_DOWN ; 若没有按下,则等待
; 去抖动
MOV R7,#0x00000FF0
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 + -