S3C2440PWM 定時器
的內部定時器。定時器0還包含用于大電流驅動的死區(qū)發(fā)生器。
定時器0和1共用一個8位預分頻器,定時器2、3和4共用另外的8位預分頻器。每個定時器都有一個可以生成5種
不同分頻信號(1/2,1/4,1/8,1/16和TCLK)的時鐘分頻器。每個定時器模塊從相應8位預分頻器得到其自己的時鐘信
號。8位預分頻器是可編程的,并且按存儲在TCFG0和TCFG1寄存器中的加載值來分頻PCLK。
定時計數(shù)緩沖寄存器(TCNTBn)包含了一個當使能了定時器時的被加載到遞減計數(shù)器中的初始值。定時比較緩
沖寄存器(TCMPBn)包含了一個被加載到比較寄存器中的與遞減計數(shù)器相比較的初始值。這種 TCNTBn 和CMPBn
的雙緩沖特征保證了改變頻率和占空比時定時器產(chǎn)生穩(wěn)定的輸出。
每個定時器有它自己的由定時器時鐘驅動的 16 位遞減計數(shù)器。當遞減計數(shù)器到達零時,產(chǎn)生定時器中斷請求通知
CPU定時器操作已經(jīng)完成。當定時器計數(shù)器到達零時,相應的TCNTBn的值將自動被加載到遞減計數(shù)器以繼續(xù)下一次
操作。然而,如果定時器停止了,例如,在定時器運行模式期間清除 TCONn 的定時器使能位,TCNTBn的值將不會
被重新加載到計數(shù)器中。
TCMPBn的值是用于脈寬調制(PWM)。當遞減計數(shù)器的值與定時器控制邏輯中的比較寄存器的值相匹配時定時
器控制邏輯改變輸出電平。因此,比較寄存器決定PWM輸出的開啟時間(或關閉時間)。
以上為數(shù)據(jù)手冊的描述
定時器專用寄存器有6種共17個寄存器
TCFG0 配置寄存器0
TCFG1配置寄存器1
TCON控制寄存器
TCNTBn 計數(shù)初值寄存器(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
開發(fā)板設置的PCLK為50MHZ
定時器輸入的時鐘頻率=(50MHZ)/(99+1)/8=62500HZ
//開發(fā)板的測試蜂鳴器的試驗程序(我寫出了詳細的注釋)
- #include"2440addr.h"
- #include"2440lib.h"http://這個只使用了這個文件的延遲函數(shù),和串口有關的函數(shù)
- 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計數(shù)緩沖器的值
- 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);//設置系統(tǒng)時鐘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!nn");
- 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=%dn",freq);
- if(key==ESC_KEY)
- {
- Beep_Stop();
- return;
- }
- }
- }
評論