蜂鸣器和PWM定时器编程实践2

《朱老师物联网大讲堂》学习笔记

<转发地址>http://blog.csdn.net/qq_18973645/article/details/51130346

以下代码为朱老师课堂上所写

  1. #define     GPD0CON     (0xE02000A0)  
  2. #define     TCFG0       (0xE2500000)  
  3. #define     TCFG1       (0xE2500004)  
  4. #define     CON         (0xE2500008)  
  5. #define     TCNTB2      (0xE2500024)  
  6. #define     TCMPB2      (0xE2500028)  
  7.   
  8. #define     rGPD0CON    (*(volatile unsigned int *)GPD0CON)  
  9. #define     rTCFG0      (*(volatile unsigned int *)TCFG0)  
  10. #define     rTCFG1      (*(volatile unsigned int *)TCFG1)  
  11. #define     rCON        (*(volatile unsigned int *)CON)  
  12. #define     rTCNTB2     (*(volatile unsigned int *)TCNTB2)  
  13. #define     rTCMPB2     (*(volatile unsigned int *)TCMPB2)  
  14.   
  15.   
  16. // 初始化PWM timer2,使其输出PWM波形:频率是2KHz、duty为50%  
  17. void timer2_pwm_init(void)  
  18. {  
  19.     // 设置GPD0_2引脚,将其配置为XpwmTOUT_2  
  20.     rGPD0CON &= ~(0xf<<8);  
  21.     rGPD0CON |= (2<<8);  
  22.       
  23.     // 设置PWM定时器的一干寄存器,使其工作  
  24.     rTCFG0 &= ~(0xff<<8);  
  25.     rTCFG0 |= (65<<8);            // prescaler1 = 65, 预分频后频率为1MHz  
  26.       
  27.     rTCFG1 &= ~(0x0f<<8);  
  28.     rTCFG1 |= (1<<8);         // MUX2设置为1/2,分频后时钟周期为500KHz  
  29.     // 时钟设置好,我们的时钟频率是500KHz,对应的时钟周期是2us。也就是说每隔2us  
  30.     // 计一次数。如果要定的时间是x,则TCNTB中应该写入x/2us  
  31.       
  32.     rCON |= (1<<15);      // 使能auto-reload,反复定时才能发出PWM波形  
  33.     //rTCNTB2 = 250;            // 0.5ms/2us = 500us/2us = 250  
  34.     //rTCMPB2 = 125;            // duty = 50%  
  35.       
  36.     rTCNTB2 = 50;             
  37.     rTCMPB2 = 25;     
  38.       
  39.     // 第一次需要手工将TCNTB中的值刷新到TCNT中去,以后就可以auto-reload了  
  40.     rCON |= (1<<13);      // 打开自动刷新功能  
  41.     rCON &= ~(1<<13);     // 关闭自动刷新功能  
  42.       
  43.     rCON |= (1<<12);      // 开timer2定时器。要先把其他都设置好才能开定时器  
  44. }  
#define 	GPD0CON		(0xE02000A0)
#define 	TCFG0		(0xE2500000)
#define 	TCFG1		(0xE2500004)
#define 	CON			(0xE2500008)
#define 	TCNTB2		(0xE2500024)
#define 	TCMPB2		(0xE2500028)

#define 	rGPD0CON	(*(volatile unsigned int *)GPD0CON)
#define 	rTCFG0		(*(volatile unsigned int *)TCFG0)
#define 	rTCFG1		(*(volatile unsigned int *)TCFG1)
#define 	rCON		(*(volatile unsigned int *)CON)
#define 	rTCNTB2		(*(volatile unsigned int *)TCNTB2)
#define 	rTCMPB2		(*(volatile unsigned int *)TCMPB2)


// 初始化PWM timer2,使其输出PWM波形:频率是2KHz、duty为50%
void timer2_pwm_init(void)
{
	// 设置GPD0_2引脚,将其配置为XpwmTOUT_2
	rGPD0CON &= ~(0xf<<8);
	rGPD0CON |= (2<<8);
	
	// 设置PWM定时器的一干寄存器,使其工作
	rTCFG0 &= ~(0xff<<8);
	rTCFG0 |= (65<<8);			// prescaler1 = 65, 预分频后频率为1MHz
	
	rTCFG1 &= ~(0x0f<<8);
	rTCFG1 |= (1<<8);			// MUX2设置为1/2,分频后时钟周期为500KHz
	// 时钟设置好,我们的时钟频率是500KHz,对应的时钟周期是2us。也就是说每隔2us
	// 计一次数。如果要定的时间是x,则TCNTB中应该写入x/2us
	
	rCON |= (1<<15);		// 使能auto-reload,反复定时才能发出PWM波形
	//rTCNTB2 = 250;			// 0.5ms/2us = 500us/2us = 250
	//rTCMPB2 = 125;			// duty = 50%
	
	rTCNTB2 = 50;			
	rTCMPB2 = 25;	
	
	// 第一次需要手工将TCNTB中的值刷新到TCNT中去,以后就可以auto-reload了
	rCON |= (1<<13);		// 打开自动刷新功能
	rCON &= ~(1<<13);		// 关闭自动刷新功能
	
	rCON |= (1<<12);		// 开timer2定时器。要先把其他都设置好才能开定时器
}


















  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值