<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > Cortex-M3 (NXP LPC1788)之SysTick系統(tǒng)節(jié)拍定時(shí)器

          Cortex-M3 (NXP LPC1788)之SysTick系統(tǒng)節(jié)拍定時(shí)器

          作者: 時(shí)間:2016-11-19 來(lái)源:網(wǎng)絡(luò) 收藏
          在GPIO控制篇中的延時(shí)閃爍LED只用了簡(jiǎn)單的for循環(huán),為了精確的計(jì)時(shí)本篇介紹使用SysTick定時(shí)器每1ms產(chǎn)生中斷,從而實(shí)現(xiàn)精確定時(shí)的目的。要使用系統(tǒng)節(jié)拍定時(shí)器主要進(jìn)行兩個(gè)部分的配置。1:系統(tǒng)時(shí)鐘控制。2系統(tǒng)節(jié)拍定時(shí)器的控制。

          一,系統(tǒng)時(shí)鐘控制

          LPC1788有3個(gè)獨(dú)立的振蕩器。他們是主振蕩器,內(nèi)部RC振蕩器,RTC振蕩器。復(fù)位后,LPC1788將用內(nèi)部的RC振蕩器運(yùn)行,直到被軟件切換。這樣就能在沒(méi)有任何外部晶振的情況下運(yùn)行。LPC1788的時(shí)鐘控制如圖1所示

          本文引用地址:http://www.ex-cimer.com/article/201611/318446.htm

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

          二,系統(tǒng)節(jié)拍定時(shí)器的控制

          LPC1788的系統(tǒng)節(jié)拍定時(shí)器是一個(gè)24位的定時(shí)器,當(dāng)數(shù)值達(dá)到0時(shí)產(chǎn)生中斷。系統(tǒng)節(jié)拍定時(shí)器的時(shí)鐘信號(hào)可以由CPU時(shí)鐘提供(即圖1中的cclk)。想要在規(guī)定的時(shí)間間隔循環(huán)的產(chǎn)生中斷,必須將指定的正確時(shí)間間隔值裝入STRELOAD寄存器進(jìn)行初始化。假如我們選擇cclk作為系統(tǒng)節(jié)拍的時(shí)鐘信號(hào),并且根據(jù)開(kāi)發(fā)板將系統(tǒng)時(shí)鐘設(shè)置成12MHZ,為了循環(huán)1ms產(chǎn)生一次中斷,我們寫入STRELOAD的值為cclk/1000 - 1 。

          程序的代碼如下,使LED燈每500ms閃爍。SystemInit函數(shù)在啟動(dòng)文件中被調(diào)用。

          1. #definerFIO1DIR(*(volatileunsigned*)0x20098020)
          2. #definerFIO1MASK(*(volatileunsigned*)0x20098030)
          3. #definerFIO1PIN(*(volatileunsigned*)0x20098034)
          4. #definerFIO1SET(*(volatileunsigned*)0x20098038)
          5. #definerFIO1CLR(*(volatileunsigned*)0x2009803c)
          6. #definerCLKSRCSEL(*(unsigned*)(0x400FC10C))//時(shí)鐘源選擇寄存器
          7. #definerPLL0CON(*(unsigned*)(0x400FC080))//PLL0控制寄存器
          8. #definerPLL0CFG(*(unsigned*)(0x400FC084))//PLL0配置寄存器
          9. #definerPLL0STAT(*(unsigned*)(0x400FC088))//PLL0狀態(tài)寄存器
          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時(shí)鐘選擇寄存器
          16. #definerUSBCLKSEL(*(unsigned*)(0x400FC108))//USB時(shí)鐘選擇寄存器
          17. #definerPCLKSEL(*(unsigned*)(0x400FC1A8))//外設(shè)時(shí)鐘寄存器
          18. #definerPCON(*(unsigned*)(0x400FC0C0))
          19. #definerPXCONP(*(unsigned*)(0x400FC0C4))
          20. #definerSCS(*(unsigned*)(0x400FC1A0))//系統(tǒng)控制和狀態(tài)寄存器
          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. 系統(tǒng)時(shí)鐘初始化
          30. */
          31. voidSystemInit()
          32. {
          33. rSCS&=~(0x1<<4);//頻率12M
          34. rSCS|=(0x1<<5);//使能主振蕩器
          35. while(0==(rSCS&(0x1<<6)));//等待主振蕩器穩(wěn)定
          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. 系統(tǒng)節(jié)拍定時(shí)器初始化
          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. 系統(tǒng)節(jié)拍定時(shí)器中斷處理函數(shù)
          60. */
          61. voidSysTick_Handler(void)
          62. {
          63. SysTickCnt++;
          64. }
          65. intmain()
          66. {
          67. unsignedcharvalue=1;
          68. SysTick_Config(CCLK/1000-1);//每1ms產(chǎn)生一次SysTick系統(tǒng)異常
          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. }

          關(guān)于SysTick的異常的優(yōu)先級(jí)可以在SHPR3中進(jìn)行設(shè)置,優(yōu)先級(jí)等級(jí)可以從0~31。初始化默認(rèn)為0,只低于固定的負(fù)數(shù)優(yōu)先級(jí)的復(fù)位,硬件故障和NMI。


          評(píng)論


          相關(guān)推薦

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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();