新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > Cortex-M3 (NXP LPC1788)之SysTick系統節拍定時器

        Cortex-M3 (NXP LPC1788)之SysTick系統節拍定時器

        作者: 時間:2016-11-19 來源:網絡 收藏
        在GPIO控制篇中的延時閃爍LED只用了簡單的for循環,為了精確的計時本篇介紹使用SysTick定時器每1ms產生中斷,從而實現精確定時的目的。要使用系統節拍定時器主要進行兩個部分的配置。1:系統時鐘控制。2系統節拍定時器的控制。

        一,系統時鐘控制

        LPC1788有3個獨立的振蕩器。他們是主振蕩器,內部RC振蕩器,RTC振蕩器。復位后,LPC1788將用內部的RC振蕩器運行,直到被軟件切換。這樣就能在沒有任何外部晶振的情況下運行。LPC1788的時鐘控制如圖1所示

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

        在開發板上使用12M的晶振作為主振蕩器,它通過鎖相環PLL0來提高頻率提供CPU。由于芯片總是從內部的RC振蕩器開始工作,因此主振蕩器只會應軟件的請求而啟動。實現方法是設定SCS寄存器中的OSCEN位使能。主振蕩器提供一個狀態標志SCS寄存器的OSCSTAT位,這樣軟件就可以確定何時主振蕩器在運行穩定。此時,軟件可以控制切換到主振蕩器,使其作為時鐘源。在啟動以前,必須通過SCS的OSCRANGE位,選擇一個頻率范圍。在確定了主振蕩器之后,需要進行鎖相環的配置。1,配置CLKSRCSEL選擇正確的時鐘源。2,將正確的PLL設置值寫入PLLCFG寄存器并且在PLLCON中使能PLL。3,向PLLFEED寄存器中寫入饋送序列0xAA,0x55。4,設置所需的時鐘分配器如CCLKSEL,PCLSEL,EMCCLKSEL,以及USBCLKSEL寄存器。5,查詢PLLSTAT寄存器等待PLL鎖定。

        二,系統節拍定時器的控制

        LPC1788的系統節拍定時器是一個24位的定時器,當數值達到0時產生中斷。系統節拍定時器的時鐘信號可以由CPU時鐘提供(即圖1中的cclk)。想要在規定的時間間隔循環的產生中斷,必須將指定的正確時間間隔值裝入STRELOAD寄存器進行初始化。假如我們選擇cclk作為系統節拍的時鐘信號,并且根據開發板將系統時鐘設置成12MHZ,為了循環1ms產生一次中斷,我們寫入STRELOAD的值為cclk/1000 - 1 。

        程序的代碼如下,使LED燈每500ms閃爍。SystemInit函數在啟動文件中被調用。

        1. #definerFIO1DIR(*(volatileunsigned*)0x20098020)
        2. #definerFIO1MASK(*(volatileunsigned*)0x20098030)
        3. #definerFIO1PIN(*(volatileunsigned*)0x20098034)
        4. #definerFIO1SET(*(volatileunsigned*)0x20098038)
        5. #definerFIO1CLR(*(volatileunsigned*)0x2009803c)
        6. #definerCLKSRCSEL(*(unsigned*)(0x400FC10C))//時鐘源選擇寄存器
        7. #definerPLL0CON(*(unsigned*)(0x400FC080))//PLL0控制寄存器
        8. #definerPLL0CFG(*(unsigned*)(0x400FC084))//PLL0配置寄存器
        9. #definerPLL0STAT(*(unsigned*)(0x400FC088))//PLL0狀態寄存器
        10. #definerPLL0FEED(*(unsigned*)(0x400FC08C))//PLL0饋送寄存器
        11. #definerPLL1CON(*(unsigned*)(0x400FC0A0))
        12. #definerPLL1CFG(*(unsigned*)(0x400FC0A4))
        13. #definerPLL1STAT(*(unsigned*)(0x400FC0A8))
        14. #definerPLL1FEED(*(unsigned*)(0x400FC0AC))
        15. #definerCCLKSEL(*(unsigned*)(0x400FC104))//CPU時鐘選擇寄存器
        16. #definerUSBCLKSEL(*(unsigned*)(0x400FC108))//USB時鐘選擇寄存器
        17. #definerPCLKSEL(*(unsigned*)(0x400FC1A8))//外設時鐘寄存器
        18. #definerPCON(*(unsigned*)(0x400FC0C0))
        19. #definerPXCONP(*(unsigned*)(0x400FC0C4))
        20. #definerSCS(*(unsigned*)(0x400FC1A0))//系統控制和狀態寄存器
        21. #definerCLKOUTCFG(*(unsigned*)(0x400FC1C8))
        22. #definerSTCTRL(*(unsigned*)(0xE000E010))
        23. #definerSTRELOAD(*(unsigned*)(0xE000E014))
        24. #definerSTCURR(*(unsigned*)(0xE000E018))
        25. #definerSTALIB(*(unsigned*)(0xE000E01C))
        26. #defineCCLK120000000
        27. volatileunsignedlongSysTickCnt;
        28. /*
        29. 系統時鐘初始化
        30. */
        31. voidSystemInit()
        32. {
        33. rSCS&=~(0x1<<4);//頻率12M
        34. rSCS|=(0x1<<5);//使能主振蕩器
        35. while(0==(rSCS&(0x1<<6)));//等待主振蕩器穩定
        36. rCLKSRCSEL=0x1;
        37. rPLL0CFG=0x9;//配置CCLK=120M
        38. rPLL0CON=0x01;
        39. rPLL0FEED=0xAA;
        40. rPLL0FEED=0x55;
        41. while(0==(rPLL0STAT&(0x1<<10)));
        42. rCCLKSEL=(0x1|(0x1<<8));
        43. rPCLKSEL=0x2;//配置PCLK=60M
        44. rCLKOUTCFG=0x0|(0xb<<4)|(0x1<<8);
        45. }
        46. /*
        47. 系統節拍定時器初始化
        48. */
        49. unsignedcharSysTick_Config(unsignedintticks)
        50. {
        51. if(ticks>0xFFFFFFUL)
        52. return0;
        53. rSTRELOAD=ticks;
        54. rSTCURR=0x0;
        55. rSTCTRL=(0x1)|(0x1<<1)|(0x1<<2);
        56. return1;
        57. }
        58. /*
        59. 系統節拍定時器中斷處理函數
        60. */
        61. voidSysTick_Handler(void)
        62. {
        63. SysTickCnt++;
        64. }
        65. intmain()
        66. {
        67. unsignedcharvalue=1;
        68. SysTick_Config(CCLK/1000-1);//每1ms產生一次SysTick系統異常
        69. rFIO1DIR|=(1<<18);//GPIO1.18->OUTPUT
        70. while(1)
        71. {
        72. if(SysTickCnt>=500)
        73. {
        74. SysTickCnt=0;
        75. value=!value;
        76. }
        77. if(0==value)
        78. {
        79. rFIO1PIN&=~(1<<18);
        80. }
        81. elseif(1==value)
        82. {
        83. rFIO1PIN|=(1<<18);
        84. }
        85. }
        86. }

        關于SysTick的異常的優先級可以在SHPR3中進行設置,優先級等級可以從0~31。初始化默認為0,只低于固定的負數優先級的復位,硬件故障和NMI。


        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 曲周县| 赤峰市| 永新县| 札达县| 浪卡子县| 乌苏市| 远安县| 桦甸市| 广宁县| 尚志市| 石泉县| 凤城市| 乐平市| 韶山市| 水富县| 桑日县| 卓资县| 明星| 微博| 宽甸| 建水县| 西充县| 宁远县| 尖扎县| 望城县| 兰溪市| 彭水| 什邡市| 阳信县| 乌拉特中旗| 巴彦淖尔市| 玉溪市| 星子县| 筠连县| 伊金霍洛旗| 鹤山市| 凉山| 大庆市| 翁源县| 罗定市| 礼泉县|