1、查看蜂鸣器电路图连接
2、查看核心板引脚连接
3、GPD0引脚控制寄存器设置为TOUT_2模式
4、PWM定时器相关寄存器设置
5、绑定寄存器地址和访问寄存器设置
//绑定寄存器地址
#define GPD0CON 0xE020_00A0
#define TCFG0 0xE250_0000
#define TCFG1 0xE250_0004
#define TCON 0xE250_0008
#define TCNTB2 0xE250_0024
#define TCMPB2 0xE250_0028
#define TCNTO2 0xE250_002C
//访问寄存器
#define rGPD0CON (*(volatile unsigned int *)GPD0CON)
#define rTCFG0 (*(volatile unsigned int *)TCFG0)
#define rTCFG1 (*(volatile unsigned int *)TCFG1)
#define rTCON (*(volatile unsigned int *)TCON)
#define rTCNTB2 (*(volatile unsigned int *)TCNTB2)
#define rTCMPB2 (*(volatile unsigned int *)TCMPB2)
#define rTCNTO2 (*(volatile unsigned int *)TCNTO2)
6、初始化PWM timer2,使其输出PWM波形
6.1 设置GPD0_2引脚,将其配置为TOUT_2模式
// 设置GPD0_2引脚,将其配置为TOUT_2模式
rGPD0CON &= ~(0x0f<<8);
rGPD0CON |= (2<<8);
6.2 设置PWM寄存器
//PWM波形参数:频率是2KHz、duty为50%
// 设置TCFG0
rTCFG0 &= ~(0xff<<8);
rTCFG0 |= (66<<8); // prescaler1 = 65, 预分频后频率为1MHz
// 设置TCFG1
rTCFG1 &= ~(0x0f<<8);
rTCFG1 |= (1<<8); // MUX2设置为1/2,分频后时钟周期为500KHz
// 设置TCON
rTCON |= (1<<15); // 使能auto-reload,反复定时才能发出PWM波形
// 设置TCNTB2
rTCNTB2 = 250; //0.5ms/2us = 500us/2us = 250
// 设置TCMPB2
rTCMPB2 = 125; // duty = 50%
// 时钟设置好,我们的时钟频率是500KHz,对应的时钟周期是2us。也就是说每隔2us
// 计一次数。如果要定的时间是x,则TCNTB中应该写入x/2us
// 第一次需要手动将TCNTB2中的值装入TCNT中,以后就可以auto-reload了
//这一步很重要
rTCON |= (1<<13); //打开自动刷新
rTCON &= ~(1<<13); //关闭自动刷新
//开timer2定时器。要先把其他都设置好才能开定时器
rTCON |= (1<<12);
7、主函数直接调用,就可以输出PWM波形
int main(void)
{
timer2_pwm_init();
return 0;
}