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初始化代码
- voidTimer0_Init(void)
- {
- rTCFG0&=~(0xFF);//对TCFG0[0:15]清零
- rTCFG0|=99;//守时器的预分频值为99
- rTCFG1&=~(0x0f);//对TCFG1[0:3]清零
- rTCFG1|=0x02;//挑选守时器0,分频值为1/8
- rTCNTB0=62500;//1s中止一次
- rTCON|=(1<<1);//手动更新TCNTB0的值
- rTCON=(1<<0)|(1<<3);//铲除手动更新。主动重载,发动守时器0
- }
阐明:
守时器输入时钟频率 = PCLK / {预分频值+1} / {分频值}
{预分频值} = 0~255
{分频值} = 2, 4, 8, 16
开发板设置的PCLK为50MHZ
守时器输入的时钟频率=(50MHZ)/(99+1)/8=62500HZ
//开发板的测验蜂鸣器的实验程序(我写出了具体的注释)
- #include”2440addr.h”
- #include”2440lib.h”//这个只使用了这个文件的推迟函数,和串口有关的函数
- voidBeep_Freq_Set(U32freq)
- {
- rGPBCON&=~3;
- rGPBCON|=2;//设置GPB0为OUT0
- rGPBUP=0x0;//使能上拉
- rTCFG0&=~0xff;
- rTCFG0|=15;//预分频值为15
- rTCFG1&=~0x0f;
- rTCFG1|=0x02;//分频值为8
- rTCNTB0=(PCLK>>7)/freq;//设定守时器0计数缓冲器的值
- rTCMPB0=rTCNTB0>>1;//守时器0比较缓冲器的值,PWM输出占空比50%
- rTCON&=~0x1f;
- rTCON|=0xb;//主动重载,封闭变相,手动更新,敞开守时器0
- rTCON&=~2;//铲除手动更新位
- }
- voidBeep_Stop(void)
- {
- rGPBCON&=~3;//setGPB0asoutput
- rGPBCON|=1;
- rGPBDAT&=~1;//输出低电平
- }
- voidBeep_Init(U32freq,U32ms)
- {
- Beep_Stop();
- Delay(ms);
- Beep_Freq_Set(freq);
- }
- voidMain()
- {
- U16freq=800;
- SelectFclk(2);//设置体系时钟400M
- ChangeClockDivider(2,1);//设置分频1:4:8
- CalcBusClk();//核算总线频率
- rGPHCON&=~((3<<4)|(3<<6));
- rGPHCON|=(2<<4)|(2<<6);//GPH2--TXD[0];GPH3--RXD[0]
- rGPHUP=0x00;//使能上拉功用
- Uart_Init(0,115200);
- Uart_Select(0);
- Uart_Printf(“\nBUZZERTEST(PWMControl)\n”);
- Uart_Printf(“Press+/-toincrease/reducethefrequencyofBUZZER!\n”);
- Uart_Printf(“PressESCkeytoExitthisprogram!\n\n”);
- Beep_Init(freq,50);
- while(1)
- {
- U8key=Uart_Getch();
- if(key==+)
- {
- if(freq<2000)//lci20000
- 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;
- }
- }
- }