案例:从 TIMER1 的第 2 通道输出一路 PWM 信号,要求频率为 1KHz,占空比为 1:1。
解:首先,输出引脚选择。采用备用位置 1,通道 1 对应 P0.4 端口。即要把 P0.4 端口
设置为外设 I/O 功能和输出模式,即 P0SEL |= 0x10;P0DIR |= 0X10;。
设置备用位置 1 有两种方法:
第一种方法:由于 USART0 和 USART1 与 TMER1 共用 P0 端口作为外设,因此只要把
TMER1 设置为备用位置 1,USART0 和 USART1 设置为备用设置 2。两条代码如下:
PERCFG &= ~0x40; PERCFG |= 0x03;
第二种方法:设置端口 0 外设优先级控寄存器 P2DIR。当 PERCFG 分配给一些外设到
相同引脚的时候,通过配置 P2DIR .PRIP0[1:0]位,确定外设的优先级。在这里配置定时器
1 通道 0-1 比 USART0 和 USART1 高优先级,一条代码如下:
P2DIR = (P2DIR & ~0xC0) | 0X80;
其次,配置周期相关寄存器。若采用模模式的输出比较模式 5,则 T1CTL |= 0X0A;
T1CCTL1 = 0X2C;。
已知频率为 1KHz,则周期为 1ms。若晶振设置为 32MHz,定时器分频器值为 1/32,则
有每隔 1us 计数器增加 1,只要计数器增加到 1000 即为 1ms。
所以,T1CC0*t = 1ms,t = 1us,可得到 T1CC0=1000,即 T1CC0H=1000/256,
T1CC0L=1000%256。
再次,配置占空比相关寄存器。由于已知占空为 1:1、周期为 T1CC0=1000,所以
T1CC1=500,即 T1CC1H=500/256,T1CC0L=500%256。
然后,编写、调试程序,程序如下:
1. #include <ioCC2530.h>
2. void main(void)
3. { P0SEL |= 0x10; //设置 P0.4 为设功能
4. P0DIR |= 0X10; //定义 P0.4 端口为输出
5. CLKCONCMD &= ~0X7F; //晶振设置为 32MHz
6. while(CLKCONSTA & 0X40); //等待晶振稳定
7. PERCFG &= ~0x40; //选择定时器 1 为备用位置
8. PERCFG |= 0x03; //选择 USART0 和 USART1 为备用位置 2
9. // P2DIR = (P2DIR & ~0xC0) | 0X80; //设置定时器 1 外设优先级
10. T1CTL |= 0X0A; //32 分频,模模式
11. T1CC0L = 1000%256; //周期设置 1000Hz
12. T1CC0H = 1000/256;
13. T1CCTL2 = 0X2C; //定时器 1 通道 1 为输出比较模式 5