本帖最后由 hotpower 于 2011-7-24 17:04 编辑
好久没学习了,今天抽空补上个PWM的小程序,因为时间比较紧迫,所以没有使用Lee老师新的头文件,还是使用HOT大叔的红杏头文件,仅是实现功能,未进行优化及详细功能测试,望见谅!
本工程主要包含两个任务:①普通类任务task_LOOK_PWM_t:等待标志Flag_SPI低四位任意位置位 然后完成来自于uart0的任务;
②中断类任务uart0_t:uart 同步输出功能及接收功能
初始化设置: 时钟配置为 XTL12M_EN: 外部 4~24MHz 晶振使能
CPU时钟频率为12MHz
UART时钟选择外部12MHZ,并使能UART0时钟
PB.0选择多功能管脚选择RXD0 PB.1选择多功能管脚选择TXD0
PA.12选择多功能管脚选择PWM0
主要完成功能: UART0 接收到字符‘U’或‘u’实现PWM占空比增加10%;
UART0 接收到字符‘D’或‘d’实现PWM占空比减少10%.
部分源文件:
LOOK_PWM.cpp
flag_t Flag_PWM(0);
// 任务类 task_LOOK_PWM_t 的例程
void task_LOOK_PWM_t::routine()
{
// TODO: 在此编写 task_LOOK_PWM_t 例程的内容
uint8_t PWM0_Duty_Cycle = 50; //PWM初始化占空比为50
//Enable PWM engine clock and reset PWM
SYSCLKs.APBCLK.Bits.PWM01_EN = 1; //PWM01时钟使能
SYSs.IPRSTC2.Bits.PWM03_RST = 1; // PWM03复位
SYSs.IPRSTC2.Bits.PWM03_RST = 0; //PWM03开始工作
SYSCLKs.CLKSEL1.Bits.TMR0_S = 0b000; //外部12M晶振
PWM0s.PCR.Bits.CH0INV = 0; //反向关闭
PWM0s.PCR.Bits.CH0MOD = 1; //自动重载
PWM0s.PPR.Bits.CP01 = 1; //预分频 1
PWM0s.CSR.Bits.CSR0 = 0b100; //分频系数 1
uint16_t u16Duty = 12000000/((1+1)*1*400);//PWM 频率 400HZ
PWM0s.CNR0.Regs = u16Duty-1; //PWM 频率 = PWMxy_CLK/(prescale+1)*(clock divider)/(CNR+1);
PWM0s.CMR0.Regs = u16Duty*PWM0_Duty_Cycle/100-1; //占空比 = (CMR+1)/(CNR+1).
PWM0s.POE.Bits.PWM0 = 1; //PWM0输出使能
//PA.12作为PWM0 使用LOOK进行配置
PWM0s.PCR.Bits.CH0EN = 1; // 使能PWM功能
while (true) {
// TODO: 在此编写 task_LOOK_PWM_t 例程的内容
uart0.puts("WM0当前设置占空比为:0x");
uart0.put_numeral(PWM0_Duty_Cycle);
uart0.puts("%\n");
int flag = Flag_PWM.wait(0b011, flag_t::ANY_CONSUME);
switch (flag)
{
case 0x01:
//占空比增加10%
if (PWM0_Duty_Cycle!=100)
{
PWM0_Duty_Cycle +=10;
PWM0s.CMR0.Regs = u16Duty*PWM0_Duty_Cycle/100-1; //更新占空比
}
break;
case 0x02:
//占空比减少10%
if (PWM0_Duty_Cycle!=0)
{
PWM0_Duty_Cycle -=10;
if (PWM0_Duty_Cycle!=0)
PWM0s.CMR0.Regs = u16Duty*PWM0_Duty_Cycle/100-1; //更新占空比
else PWM0s.CMR0.Regs = 0;
}
break;
}
}
}
#ifdef LOOK_SCHEDULING_PRIORITY
instantiate::task<task_LOOK_PWM_t, LOOK_STACK_SIZE> task_LOOK_PWM(0);
#else
instantiate::task<task_LOOK_PWM_t, LOOK_STACK_SIZE> task_LOOK_PWM;
#endif
LOOK_PWM.h
#ifndef __LOOK_PWM_H
#define __LOOK_PWM_H
#include "look_config.h"
#include <look.h>
#include <instantiate>
// 任务类 task_LOOK_PWM_t 的定义
class task_LOOK_PWM_t : public task_t {
public:
task_LOOK_PWM_t() __OPT_ATTR__; // 构造函数
protected:
void routine(); // 任务例程
};
// 任务类 LOOK_PWM 的构造函数
__OPT_INLINE__ task_LOOK_PWM_t::task_LOOK_PWM_t()
{
// TODO: 在此初始化 task_LOOK_PWM_t 的类成员
}
extern flag_t Flag_PWM;
extern instantiate::task<task_LOOK_PWM_t, LOOK_STACK_SIZE> task_LOOK_PWM;
#endif // __LOOK_PWM_H
工程结构:
工程文件:
LOOK_PWM.rar
(669.7 KB)
|