本节主要涉及到S3C2440的定时器
概述:S3C2440有5个定时器,其中定时器0、1、2、3具有脉冲宽度调制(PWM),定时器4无输出引脚,定时器0具备死区输出功能。定时器0、1共用一个8位的预分频定时(0~255,是通过PCLK来分频的),定时器2、3、4共用另一个定时器,每个定时器都有5种分频器(1/2、1/4、1/8、1/16、TCLK)。
寄存器的配置:
TCNTBn(定时计数缓冲寄存器0~5)功能:定时器递减之后的初始值,我这样理解的,这个寄存器就是一个中断的周期时间
TCMPBn(定时比较缓冲寄存器0~5) 功能:这个寄存器是占空比的宽度值,通过它可以改变脉宽比
TCNTOn(定时器计数监视寄存器0~5) 功能:这个寄存器可以监视当前定时器的计数值,可以这样理解,TCNTBn被加载递减为0时之间,可以通过TCNTn查看。自动重载和双缓冲的过程中就可以通过TCNTn这个寄存器查看。
TCFG0 (定时器配置寄存器0) 功能:决定两个八位预分频器的值
TCFG1 (定时器配置寄存器1) 功能:决定5种定时器和DMA(功能实现不了解,以后学习。。。)的分频器值
TCON (定时器控制寄存器) 功能:定时器的自动重载开启和关闭,定时器的手动更新,定时器的启动和停止,定时器的变相开启和关闭(定时器0不具备,因 为定时器0没有 输出管脚)
寄存器如下图
本程序通过改变脉宽比来设置蜂鸣器的频率
电路图如下
源码如下:
void My_Pwm_Test(void)
{
char c;
int value = 800;
Uart_Printf("\nMy PWM Test Begin\n");
/*GPIO Pin initial*/
rGPBCON |= (1 << 1); //GPB0 CONFIGURE PWM OUTPUT
rGPBUP |= 0X01; //CONFIGURE PULL-UP REGISTER
/*timer initial*/
rTCFG0 &= ~0XFF; //ALL PRESCALER SET IS 256
rTCFG1 |= 0X0001; //1\4 DEVIDE PRESCALER
// rTCNTB0 = (PCLK>>7)/freq;
rTCNTB0 = ((PCLK >> 7)/value);
rTCMPB0 = rTCNTB0>>1; // 50%
rTCON &= ~0x1f;
rTCON |= 0xb; //disable deadzone, auto-reload, inv-off, update TCNTB0&TCMPB0, start timer 0
rTCON &= ~2;
while (1)
{
c = Uart_Getch();
if (c == '+')
{
value += 50;
if (value > 3000)
value = 3000;
Uart_Printf("\n value +: %d\n", value);
rTCNTB0 = (PCLK>>7)/value;
rTCMPB0 = rTCNTB0>>1; // 50%
}
else if (c == '-')
{
value -= 50;
if (value < 50)
value = 0;
Uart_Printf("\n value -: %d\n", value);
rTCNTB0 = (PCLK>>7)/value;
rTCMPB0 = rTCNTB0>>1; // 50%
}
else if (c == 's')
{
break;
}
}
}
输出的打印结果如下: