新聞中心

        S3C2440PWM 定時器

        作者: 時間:2016-11-21 來源:網(wǎng)絡(luò) 收藏
        S3C2440A 有5個16位定時器。其中定時器0、1、2和3具有脈寬調(diào)制(PWM)功能。定時器4是一個無輸出引腳

        的內(nèi)部定時器。定時器0還包含用于大電流驅(qū)動的死區(qū)發(fā)生器。
        定時器0和1共用一個8位預(yù)分頻器定時器2、3和4共用另外的8位預(yù)分頻器。每個定時器都有一個可以生成5種

        本文引用地址:http://www.104case.com/article/201611/319195.htm

        不同分頻信號(1/2,1/4,1/8,1/16和TCLK)的時鐘分頻器。每個定時器模塊從相應(yīng)8位預(yù)分頻器得到其自己的時鐘信

        號。8位預(yù)分頻器是可編程的,并且按存儲在TCFG0和TCFG1寄存器中的加載值來分頻PCLK。
        定時計數(shù)緩沖寄存器(TCNTBn)包含了一個當(dāng)使能了定時器時的被加載到遞減計數(shù)器中的初始值。定時比較緩

        沖寄存器(TCMPBn)包含了一個被加載到比較寄存器中的與遞減計數(shù)器相比較的初始值。這種 TCNTBn 和CMPBn

        的雙緩沖特征保證了改變頻率和占空比時定時器產(chǎn)生穩(wěn)定的輸出。
        每個定時器有它自己的由定時器時鐘驅(qū)動的 16 位遞減計數(shù)器。當(dāng)遞減計數(shù)器到達(dá)零時,產(chǎn)生定時器中斷請求通知

        CPU定時器操作已經(jīng)完成。當(dāng)定時器計數(shù)器到達(dá)零時,相應(yīng)的TCNTBn的值將自動被加載到遞減計數(shù)器以繼續(xù)下一次

        操作。然而,如果定時器停止了,例如,在定時器運(yùn)行模式期間清除 TCONn 的定時器使能位,TCNTBn的值將不會

        被重新加載到計數(shù)器中。
        TCMPBn的值是用于脈寬調(diào)制(PWM)。當(dāng)遞減計數(shù)器的值與定時器控制邏輯中的比較寄存器的值相匹配時定時

        器控制邏輯改變輸出電平。因此,比較寄存器決定PWM輸出的開啟時間(或關(guān)閉時間)。

        以上為數(shù)據(jù)手冊的描述

        定時器專用寄存器有6種共17個寄存器
        TCFG0 配置寄存器0
        TCFG1配置寄存器1
        TCON控制寄存器
        TCNTBn 計數(shù)初值寄存器(5個)
        TCMPBn比較寄存器(4個)
        TCNTOn觀察寄存器(5個)

        一個定時器0初始化代碼

        [cpp]view plaincopy
        1. voidTimer0_Init(void)
        2. {
        3. rTCFG0&=~(0xFF);//對TCFG0[0:15]清零
        4. rTCFG0|=99;//定時器的預(yù)分頻值為99
        5. rTCFG1&=~(0x0f);//對TCFG1[0:3]清零
        6. rTCFG1|=0x02;//選擇定時器0,分頻值為1/8
        7. rTCNTB0=62500;//1s中斷一次
        8. rTCON|=(1<<1);//手動更新TCNTB0的值
        9. rTCON=(1<<0)|(1<<3);//清除手動更新。自動重載,啟動定時器0
        10. }

        說明:
        定時器輸入時鐘頻率 = PCLK / {預(yù)分頻值+1} / {分頻值}
        {預(yù)分頻值} = 0~255
        {分頻值} = 2, 4, 8, 16

        開發(fā)板設(shè)置的PCLK為50MHZ

        定時器輸入的時鐘頻率=(50MHZ)/(99+1)/8=62500HZ

        //開發(fā)板的測試蜂鳴器的試驗程序(我寫出了詳細(xì)的注釋)

        1. #include"2440addr.h"
        2. #include"2440lib.h"http://這個只使用了這個文件的延遲函數(shù),和串口有關(guān)的函數(shù)
        3. voidBeep_Freq_Set(U32freq)
        4. {
        5. rGPBCON&=~3;
        6. rGPBCON|=2;//設(shè)置GPB0為OUT0
        7. rGPBUP=0x0;//使能上拉
        8. rTCFG0&=~0xff;
        9. rTCFG0|=15;//預(yù)分頻值為15
        10. rTCFG1&=~0x0f;
        11. rTCFG1|=0x02;//分頻值為8
        12. rTCNTB0=(PCLK>>7)/freq;//設(shè)定定時器0計數(shù)緩沖器的值
        13. rTCMPB0=rTCNTB0>>1;//定時器0比較緩沖器的值,PWM輸出占空比50%
        14. rTCON&=~0x1f;
        15. rTCON|=0xb;//自動重載,關(guān)閉變相,手動更新,開啟定時器0
        16. rTCON&=~2;//清除手動更新位
        17. }
        18. voidBeep_Stop(void)
        19. {
        20. rGPBCON&=~3;//setGPB0asoutput
        21. rGPBCON|=1;
        22. rGPBDAT&=~1;//輸出低電平
        23. }
        24. voidBeep_Init(U32freq,U32ms)
        25. {
        26. Beep_Stop();
        27. Delay(ms);
        28. Beep_Freq_Set(freq);
        29. }
        30. voidMain()
        31. {
        32. U16freq=800;
        33. SelectFclk(2);//設(shè)置系統(tǒng)時鐘400M
        34. ChangeClockDivider(2,1);//設(shè)置分頻1:4:8
        35. CalcBusClk();//計算總線頻率
        36. rGPHCON&=~((3<<4)|(3<<6));
        37. rGPHCON|=(2<<4)|(2<<6);//GPH2--TXD[0];GPH3--RXD[0]
        38. rGPHUP=0x00;//使能上拉功能
        39. Uart_Init(0,115200);
        40. Uart_Select(0);
        41. Uart_Printf("nBUZZERTEST(PWMControl)n");
        42. Uart_Printf("Press+/-toincrease/reducethefrequencyofBUZZER!n");
        43. Uart_Printf("PressESCkeytoExitthisprogram!nn");
        44. Beep_Init(freq,50);
        45. while(1)
        46. {
        47. U8key=Uart_Getch();
        48. if(key==+)
        49. {
        50. if(freq<2000)//lci20000
        51. freq+=10;
        52. Beep_Freq_Set(freq);
        53. }
        54. if(key==-)
        55. {
        56. if(freq>11)
        57. freq-=10;
        58. Beep_Freq_Set(freq);
        59. }
        60. Uart_Printf("tFreq=%dn",freq);
        61. if(key==ESC_KEY)
        62. {
        63. Beep_Stop();
        64. return;
        65. }
        66. }
        67. }



        關(guān)鍵詞: S3C2440PWM定時

        評論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 怀安县| 清涧县| 甘泉县| 沿河| 浦江县| 宁城县| 舟山市| 荃湾区| 杭州市| 乐安县| 吐鲁番市| 永泰县| 通化县| 吉首市| 广灵县| 巴南区| 留坝县| 突泉县| 茌平县| 天峨县| 桑日县| 巴中市| 敦煌市| 东明县| 庆安县| 尼勒克县| 高要市| 隆回县| 普宁市| 胶南市| 宣化县| 仲巴县| 菏泽市| 大冶市| 喀喇沁旗| 伊吾县| 辉南县| 禹州市| 延庆县| 莆田市| 鹤山市|