S3C2440A 有5个16位定时器。其中定时器0、1、2和3具有脉宽调制(PWM)功能。定时器4是一个无输出引脚
的内部定时器。定时器0还包含用于大电流驱动的死区发生器。
定时器0和1共用一个8位预分频器,定时器2、3和4共用另外的8位预分频器。每个定时器都有一个可以生成5种
不同分频信号(1/2,1/4,1/8,1/16和TCLK)的时钟分频器。每个定时器模块从相应8位预分频器得到其自己的时钟信
号。8位预分频器是可编程的,并且按存储在TCFG0和TCFG1寄存器中的加载值来分频PCLK。
定时计数缓冲寄存器(TCNTBn)包含了一个当使能了定时器时的被加载到递减计数器中的初始值。定时比较缓
冲寄存器(TCMPBn)包含了一个被加载到比较寄存器中的与递减计数器相比较的初始值。这种 TCNTBn 和CMPBn
的双缓冲特征保证了改变频率和占空比时定时器产生稳定的输出。
每个定时器有它自己的由定时器时钟驱动的 16 位递减计数器。当递减计数器到达零时,产生定时器中断请求通知
CPU定时器操作已经完成。当定时器计数器到达零时,相应的TCNTBn的值将自动被加载到递减计数器以继续下一次
操作。然而,如果定时器停止了,例如,在定时器运行模式期间清除 TCONn 的定时器使能位,TCNTBn的值将不会
被重新加载到计数器中。
TCMPBn的值是用于脉宽调制(PWM)。当递减计数器的值与定时器控制逻辑中的比较寄存器的值相匹配时定时
器控制逻辑改变输出电平。因此,比较寄存器决定PWM输出的开启时间(或关闭时间)。

以上为数据手册的描述

定时器专用寄存器有6种共17个寄存器
TCFG0 配置寄存器0
TCFG1 配置寄存器1
TCON 控制寄存器
TCNTBn 计数初值寄存器(5个)
TCMPBn 比较寄存器(4个)
TCNTOn 观察寄存器(5个)
一个定时器0初始化代码
- void Timer0_Init(void)
- {
- rTCFG0 &=~(0xFF);
- rTCFG0 |=99;
- rTCFG1 &=~(0x0f);
- rTCFG1 |=0x02;
- rTCNTB0 =62500;
- rTCON |=(1<<1);
- rTCON =(1<<0)|(1<<3);
- }
说明:
定时器输入时钟频率 = PCLK / {预分频值+1} / {分频值}
{预分频值} = 0~255
{分频值} = 2, 4, 8, 16
开发板设置的PCLK为50MHZ
定时器输入的时钟频率=(50MHZ)/(99+1)/8=62500HZ
//开发板的测试蜂鸣器的试验程序(我写出了详细的注释)
- #include "2440addr.h"
- #include "2440lib.h" //这个只使用了这个文件的延迟函数,和串口有关的函数
-
- void Beep_Freq_Set( U32 freq )
- {
-
- rGPBCON &=~3;
- rGPBCON |=2;
-
- rGPBUP=0x0;
-
- rTCFG0 &=~0xff;
- rTCFG0 |=15;
-
- rTCFG1 &=~0x0f;
- rTCFG1 |=0x02;
-
- rTCNTB0 = (PCLK>>7)/freq;
- rTCMPB0 = rTCNTB0>>1;
-
- rTCON &= ~0x1f;
- rTCON |= 0xb;
- rTCON &= ~2;
- }
-
- void Beep_Stop( void )
- {
- rGPBCON &= ~3;
- rGPBCON |= 1;
- rGPBDAT &= ~1;
- }
-
- void Beep_Init(U32 freq, U32 ms)
- {
- Beep_Stop() ;
- Delay( ms ) ;
- Beep_Freq_Set( freq ) ;
- }
-
- void Main()
- {
- U16 freq=800;
-
- SelectFclk(2);
- ChangeClockDivider(2, 1);
- CalcBusClk();
-
- rGPHCON &=~((3<<4)|(3<<6));
- rGPHCON |=(2<<4)|(2<<6);
- rGPHUP=0x00;
-
- Uart_Init(0,115200);
- Uart_Select(0);
-
- Uart_Printf( "\nBUZZER TEST ( PWM Control )\n" );
- Uart_Printf( "Press +/- to increase/reduce the frequency of BUZZER !\n" ) ;
- Uart_Printf( "Press 'ESC' key to Exit this program !\n\n" );
-
- Beep_Init( freq ,50) ;
-
- while( 1 )
- {
- U8 key = Uart_Getch();
-
- if( key == '+' )
- {
- if( freq < 2000 )
- freq += 10 ;
-
- Beep_Freq_Set( freq ) ;
- }
-
- if( key == '-' )
- {
- if( freq > 11 )
- freq -= 10 ;
-
- Beep_Freq_Set( freq ) ;
- }
-
- Uart_Printf( "\tFreq = %d\n", freq ) ;
- if( key == ESC_KEY )
- {
- Beep_Stop() ;
- return ;
- }
-
- }
- }
