日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

TMS320F28335时钟(1)

發布時間:2024/4/24 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TMS320F28335时钟(1) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

TMS320F28335時鐘(1)?
PLL作用就是對外部時鐘進行倍頻,降低產生高頻時鐘信號的成本。但是倍頻配置的時候,需要在特定的條件下更改,因此需要檢測PLL工作的各種狀態信號,因此PLL有兩個配置相關寄存器,PLL狀態寄存器PLLSTS和PLL控制寄存器PLLCR。通過對狀態寄存器PLLSTS的判斷,可以判斷PLL的工作狀態,在特定的工作狀態下,對PLL控制寄存器PLLCR進行配置,最后產生合適的時鐘信號CLKIN輸入給CPU,完成整個過程的倍頻。本文詳細介紹了PLL模塊,并對初始化過程和初始化代碼進行了分析。

1.OSC和PLL模塊?
OSC和PLL模塊方框圖如圖1所示。?

基于 PLL 的時鐘模塊提供兩種操作模式:?
? 晶振操作模式:允許使用一個外部晶振/諧振器來提供到器件的時基。?
? 外部時鐘源操作模式:允許旁通內部振蕩器被,時鐘由一個 X1 或者 XCLKIN 引腳上的外部時鐘源輸入生成。

三種輸入時鐘配置如圖2、圖3、圖4所示?
?
30MHz 外部石英晶振的典型技術規范如下:?
? 基本模式、 并聯諧振?
? CL( 負載電容) =12pF?
? CL1=CL2=24pF?
? C并聯=6pF?
? ESR 范圍 = 25 至 40?

2.基于 PLL 的時鐘模塊

TMS320F23885上有一個片載、基于PLL倍頻器的時鐘模塊,它提供所有的時鐘信號以及實現對低功耗模式的控制。

PLL作為DSP的時鐘重要組成部分,它除了提高系統內部SYSCLKOUT的頻率之外,還有一個重要的用途就是監視外部時鐘是不是很好的為DSP內部提供系統時鐘。?
如果PLL處于使能狀態,需要監視PPLSTS寄存器中的MCLKSTS位的狀態。如果MCLKSTS被置位,則軟件要采集恰當的措施保證系統不出現事故,該措施包括使系統停機、復位等。

與PLL配置相關的寄存器有兩個:PLL狀態寄存器PLLSTS和PLL控制寄存器PLLCR,兩個寄存器具體的講解參見第3節。

兩個寄存器中最關鍵的位域分別為 2位的PLLSTS[DIVSEL]和4位的PLLCR[DIV]。?
PLLSTS[DIVSEL]選擇CPU時鐘的分頻系數(/4,/2,/1),PLLCR[DIV] 選擇CPU時鐘的倍頻系數(*1,*2,……,*10)。

比如TMS320F23885最大工作時鐘為150MHz,通常外部晶振頻率為30MHz,先將30MHz進行10倍頻變成300MHz,再對300MHz進行2分頻得到150MHz的時鐘。(官方例程里產生150MHz的方式)

PLL的設置如表1所示。?
?
分頻系數的選擇如表2所示。?
?
PLL可能的配置模式如表3所示。?
?
注:?
(1)默認情況下,分頻系數為4?
(2)在改變PLLCR[DIV]倍頻系數前,必須滿足兩個條件:?
?PLLSTS[DIVSEL]必須為0,而PLLSTS[DIVSEL]改變時,PLL必須完成鎖定狀態,即PLLSTS[PLLOCKS]必須為1?
?DSP不能工作在limp mode下,即PLLSTS[MCLKSTS]必須為0

(3)一旦PLL穩定之后,會鎖定在新的頻率下工作,PLLSTS[PLLLOCKS] = 1,可以改變PLLSTS[DIVSEL]。?
(4)在寫入 PLLCR 寄存器之前, 安全裝置模塊(看門狗)應該被禁用。?
(5)在 PLL 模塊穩定后,重新啟用安全裝置模塊(看門狗),重啟的時間為 131072 個 OSCCLK 周期。?
(6)在 PLL (VCOCLK) 的輸出頻率不超過300MHz 時候,選擇輸入時鐘和 PLLCR[DIV] 位。?
(7)當PLL激活時,即PLL不是旁路(PLLCR[DIV]!=0),必須需要分頻器,即分頻系數不能為1(PLLSTS[DIVSEL]!=3),這是因為確保反饋給內核的時鐘具有正確的占空比。?
(8)只有外部復位信號RST和安全裝置(看門狗)產生復位信號時,PLLCR和PLLSTS才會復位到默認值,而調試器和Missing clock detect logic產生的復位信號不會使兩者復位到默認值。?
(9)PLLCR和PLLSTS是受ELLOW保護的。?
特別注意:倍頻時一定要分頻,不倍頻時才允許不分頻。

3.PLL配置相關的寄存器

PLL控制寄存器PLLCR如表4所示。?
?
PLL狀態寄存器PLLSTS如表5所示。?
?
PLLSTS各位的描述如表6所示?
?
注:跛行模式(limp mode)系統出現問題的時候,控制邏輯能夠根據對應的條件進行判斷,安排另外的一套控制電平,使得必須控制的負載按照既定的邏輯運行。

4.PLL的初始化?
PLL初始化流程圖如圖2所示。?
?
根據流程圖,大致可以描述PLL的初始化過程為:?
(1)確保存在OSCCLK,系統能正常工作,即判斷PLLSTS[MCLKSTS]==1??
(2)改變PLLCR[DIV]前,確保PLLSTS[DIVSEL]==0?
(3)改變PLLCR[DIV]前,禁用主振蕩器故障檢測邏輯模塊,即PLLCR[MCLKOFF]=1?
(4)根據需要,改變PLLCR[DIV]?
(5)判斷PLL是否穩定鎖定,即PLLSTS[PLLLOCKS]==1??
(6)使能主振蕩器故障檢測邏輯模塊,即PLLCR[MCLKOFF]=0?
(7)根據需要,改變PLLSTS[DIVSEL]

PLL初始化的代碼如下(來自官方例程,主要對其注釋分析和講解)。

/** 函數名稱:InitPll* 函數輸入:倍頻參數val,分頻參數divsel* val取值為0到10,表示倍頻數;divsel取值0到4,0和1表示4分頻,2表示2分頻,3表示不分頻* 函數輸出:無* 函數調用:InitPll(10,2);* 先將外部時鐘倍頻10倍,在分頻1/2,最后產生的時鐘CLKIN輸入CPU28x*/ void InitPll(unsigned short div, unsigned short divsel) {// 確保PLL不是工作在limp mode下,即有外部時鐘進入PLLif (SysCtrlRegs.PLLSTS.bit.MCLKSTS != 0){//檢測到無外部時鐘,軟件要采集恰當的措施保證系統不出現事故,該措施包括//使系統停機、復位等//用適合的函數替換下面一行// SystemShutdown(); function.asm(" ESTOP0");}// PLLCR從0x0000改變前,PLLSTS[DIVSEL]必須為0// 外部RST復位信號會使PLLSTS[DIVSEL]復位// 此時分頻為1/4if (SysCtrlRegs.PLLSTS.bit.DIVSEL != 0){EALLOW;SysCtrlRegs.PLLSTS.bit.DIVSEL = 0;EDIS;}// 前面條件都滿足后,可以改變PLLCR[DIV]if (SysCtrlRegs.PLLCR.bit.DIV != val){EALLOW;// 在設置PLLCR[DIV]前,要禁用主振蕩器檢測邏輯//Missing clock detect logicSysCtrlRegs.PLLSTS.bit.MCLKOFF = 1;SysCtrlRegs.PLLCR.bit.DIV = div;EDIS;//等待PLL穩定且處于鎖定狀態,即PLLSTS[LOCKS]置位//等待穩定的時間可能略長,需要禁用看門狗或者循環喂狗//屏蔽注釋,禁用看門夠DisableDog();while(SysCtrlRegs.PLLSTS.bit.PLLLOCKS != 1){//屏蔽注釋,喂狗// ServiceDog();}EALLOW;SysCtrlRegs.PLLSTS.bit.MCLKOFF = 0;EDIS;}// 如果需要分頻1/2if((divsel == 1)||(divsel == 2)){EALLOW;SysCtrlRegs.PLLSTS.bit.DIVSEL = divsel;EDIS;}//注意:下面代碼只有在PLL是旁路或者關閉模式時,才可被執行,其他模式禁止。//倍頻時一定要分頻,不倍頻時才允許不分頻//如果需要切換分頻到1/1// * 首先從默認1/4分頻切換到1/2分頻,讓電源穩定// 穩定所需要的時間依賴于系統運行速度,此處延時50us只是作為一個特例// * 穩定后,再切換到1/1if(divsel == 3){EALLOW;SysCtrlRegs.PLLSTS.bit.DIVSEL = 2;DELAY_US(50L);SysCtrlRegs.PLLSTS.bit.DIVSEL = 3;EDIS;} }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82

5.本章小結

本章介紹OSC和PLL模塊,闡述了二種外部時鐘輸入的操作模式,然后對外部時鐘進行倍頻分析,即PLL模塊,對PLL模塊的寄存器和操作進行了詳細的分析,最后給出了PLL初始化代碼并對代碼進行了注釋分析。對基本設置特別要強調的是PLL倍頻時一定要分頻,不倍頻時才允許不分頻。

TMS320F28335時鐘(2)?
TMS320F28335通過外部時鐘信號、OSC和PLL產生倍頻時鐘信號CLKIN后,CLKIN經過CPU后產生時鐘SYSCLKOUT(CLKIN和SYSCLKOUT頻率是一樣的),SYSCLKOUT給各個片內外設提供時鐘信號。為了實現低功耗和提供高低頻率時鐘信號,需要把SYSCLKOUT進一步分頻,本章主要講解了對SYSCLKOUT分頻產生低頻時鐘信號和高頻時鐘信號,完成外設時鐘初始化的過程。

1.時鐘系統

時鐘系統結構如圖1所示。

?
從圖1可以看出,時鐘CLKIN經過CPU后產生時鐘SYSCLKOUT(CLKIN和SYSCLKOUT頻率是一樣的),SYSCLKOUT給各個片內外設提供時鐘;除了SPI、SCI、McBSP模塊使用低頻時鐘,ADC使用高頻時鐘外,其他外設模塊都是采用SYSCLKOUT時鐘。為了實現低功耗,必須對每個片內外設時鐘進行開關控制;為了實現高低頻率時鐘,必須對SYSCLKOUT進行不同的分頻處理,因此與外設時鐘配置相關的寄存器主要有兩類:外設時鐘控制寄存器PCLKCR和高低頻外設時鐘分頻寄存器SPCP。

第一類寄存器是外設時鐘控制寄存器PCLKCR,它包括16位的PCLKCR0、PCLKCR1、PCLKCR3(不知道為什么跳過了PCLKCR2??),主要是控制使能和禁用外設時鐘;?
第二類寄存器是高低頻外設時鐘分頻寄存器,它包括高頻外設時鐘分頻寄存器16位的HISPCP(High-Speed Peripheral Clock Prescaler Register)和低頻外設時鐘分頻寄存器16位的LOSPCP(Low-Speed Peripheral Clock Prescaler Register)

2.與外設時鐘配置相關的寄存器

控制片內外設時鐘開關的外設時鐘控制寄存器PCLKCR0、PCLKCR1、PCLKCR3如表1、表2、表3所示。

?
?
?
從表1、表2、表3可以看出,默認情況下,除了3個CPU定時器和GPIO口輸入采樣時鐘使能外,其他所有外設的時鐘是禁用的。?
**注:?
- PCLKCR0、PCLKCR1、PCLKCR3均受ELLOW保護。?
- 不使用某外設模塊時,可以禁用該時鐘模塊的時鐘以省電。 **

產生高低頻外設時鐘的分頻寄存器HISPCP和LOSPCP分別如表4和表5所示。?
?
?
兩個寄存器具體位域描述分別如表6和表7所示。?
?
?
從表4到表7可以看出,16位的高頻外設時鐘分頻寄存器HISPCP和低頻外設時鐘分頻寄存器LOSPCP都只用了低3位;兩個寄存器都受ELLOW保護;分頻計算方法:當分頻系數為0,表示時鐘等于SYSCLKOUT/1,當分頻系數不為0時,CLK=SYSCLKOUT/(n×2)。

3.時鐘輸出

SYSCLKOUT可以按1、2、4分頻從TMS320F28335的XCLKOUT引腳輸出,SYSCLKOUT輸出示意圖如2所示。?
?
從圖2可以看出,上電或復位默認情況下,SYSCLK2分頻產生XTIMCLK,XTIMCLK再通過2分頻產生XCLKOUT時鐘,該時鐘信號通過引腳XCLKOUT輸出,即默認情況下XCLKOUT=SYSCLK/4=OSCCLK/16,調試時可以觀察該引腳的信號以判斷設備是否在正確的時鐘下工作。?
注:?
- XCLKOUT引腳上電或者復位默認情況下是激活狀態的。?
- XCLKOUT引腳沒有上拉或者下拉電阻。?
- 如果XCLKOUT引腳不使用時,可以通過XINTCNF2[CLKOFF]=1關閉。?
- 默認情況下,XTIMCLK=SYSCLKOUT/2,它是外擴模塊(外擴FLASH、SRAM等)的時鐘

4.外設時鐘初始化代碼

此初始化代碼主要來自TI官方例程,注釋是個人理解。

/* *函數名稱:InitPeripheralClocks *輸入參數:無 *輸出參數:無 *函數功能:初始化外設時鐘模塊,主要包括產生高低速時鐘、開關所需片內外設模塊時*鐘等 */ void InitPeripheralClocks(void) {EALLOW;// 高低頻外設時鐘分頻寄存器HISPCP/LOSPCP設置,正常情況下采用默認值,即高頻時鐘為SYSCLKOUT/2,低速時鐘為SYSCLKOUT/4SysCtrlRegs.HISPCP.all = 0x0001;SysCtrlRegs.LOSPCP.all = 0x0002;// 時鐘輸出引腳XCLKOUT設置,默認情況XCLKOUT = SYSCLKOUT/4 // XTIMCLK = SYSCLKOUT/2XintfRegs.XINTCNF2.bit.XTIMCLK = 1;//extern interface clock<->XinfCLK// XCLKOUT = XTIMCLK/2XintfRegs.XINTCNF2.bit.CLKMODE = 1;// Enable XCLKOUTXintfRegs.XINTCNF2.bit.CLKOFF = 0;// 給所選用外設使能外設時鐘 // 如果不使用某外設模塊,禁用它的時鐘以省電 // 下面代碼要根據自己使用的外設模塊進行相應的修改SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1; // ADC// *重要提醒*// ADC_cal()函數, 可以從TI保留的OTP中復制ADC校驗值,并將校驗值賦值給ADCREFSEL和ADCOFFTRIM寄存器,該過程在BOOT ROM中自動地完成//如果在調試過程中,BOOT ROM代碼旁路未使用,那么必須顯示調用下面 ADC_cal()函數(推薦顯示調用)//在調用 ADC_cal()前,必須使能ADC時鐘// 有關ADC更多的信息參見設備數據手冊ADC_cal();//本例中使能了所有片內外設模塊時鐘SysCtrlRegs.PCLKCR0.bit.I2CAENCLK = 1; // I2CSysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1; // SCI-ASysCtrlRegs.PCLKCR0.bit.SCIBENCLK = 1; // SCI-BSysCtrlRegs.PCLKCR0.bit.SCICENCLK = 1; // SCI-CSysCtrlRegs.PCLKCR0.bit.SPIAENCLK = 1; // SPI-ASysCtrlRegs.PCLKCR0.bit.MCBSPAENCLK = 1; // McBSP-ASysCtrlRegs.PCLKCR0.bit.MCBSPBENCLK = 1; // McBSP-BSysCtrlRegs.PCLKCR0.bit.ECANAENCLK=1; // eCAN-ASysCtrlRegs.PCLKCR0.bit.ECANBENCLK=1; // eCAN-BSysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0; // Disable TBCLK within the ePWMSysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 1; // ePWM1SysCtrlRegs.PCLKCR1.bit.EPWM2ENCLK = 1; // ePWM2SysCtrlRegs.PCLKCR1.bit.EPWM3ENCLK = 1; // ePWM3SysCtrlRegs.PCLKCR1.bit.EPWM4ENCLK = 1; // ePWM4SysCtrlRegs.PCLKCR1.bit.EPWM5ENCLK = 1; // ePWM5SysCtrlRegs.PCLKCR1.bit.EPWM6ENCLK = 1; // ePWM6SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; // Enable TBCLK within the ePWMSysCtrlRegs.PCLKCR1.bit.ECAP3ENCLK = 1; // eCAP3SysCtrlRegs.PCLKCR1.bit.ECAP4ENCLK = 1; // eCAP4SysCtrlRegs.PCLKCR1.bit.ECAP5ENCLK = 1; // eCAP5SysCtrlRegs.PCLKCR1.bit.ECAP6ENCLK = 1; // eCAP6SysCtrlRegs.PCLKCR1.bit.ECAP1ENCLK = 1; // eCAP1SysCtrlRegs.PCLKCR1.bit.ECAP2ENCLK = 1; // eCAP2SysCtrlRegs.PCLKCR1.bit.EQEP1ENCLK = 1; // eQEP1SysCtrlRegs.PCLKCR1.bit.EQEP2ENCLK = 1; // eQEP2SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1; // CPU Timer 0SysCtrlRegs.PCLKCR3.bit.CPUTIMER1ENCLK = 1; // CPU Timer 1SysCtrlRegs.PCLKCR3.bit.CPUTIMER2ENCLK = 1; // CPU Timer 2SysCtrlRegs.PCLKCR3.bit.DMAENCLK = 1; // DMA ClockSysCtrlRegs.PCLKCR3.bit.XINTFENCLK = 1; // XTIMCLKSysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1; // GPIO input clockEDIS; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75

5.本章小結

本章主要講解了對SYSCLKOUT分頻產生低頻時鐘信號和高頻時鐘信號,完成外設時鐘初始化的過程。

TMS320F28335時鐘(3)?
本章對整個TMS320F28335時鐘系統做個簡要的總結,是對前面凌亂講解的補充和梳理,希望借此總結可以更全面更徹底的掌握TMS320F28335時鐘系統。

1.時鐘源

外部時鐘信號或者外部晶振震蕩信號,具體參見《TMS320F28335時鐘1》。

2.時鐘產生過程

外部時鐘或者外部晶振給F28335提供時鐘源OSCCLK,使能F28335片上PLL電路,PLL電路對時鐘源信號進行倍頻,產生時鐘CLKIN(具體操作過程和代碼詳見《TMS320F28335時鐘1》),CLKIN通過CPU產生時鐘SYSCLKOUT,SYSCLKOUT經過分頻可以產生低速時鐘LOSPCLK和高速時鐘HISPCLK,最后OSCCLK、CLKIN、SYSCLKOUT、LOSPCLK和HISPCLK給各個模塊提供時鐘(具體操作過程和代碼詳見《TMS320F28335時鐘2》)。

3.需要時鐘信號的片上外設

看門狗電路WatchDog,CPU定時器(3個32位定時器),1個I2C,2個eCAN總線控制器,SCI(3個異步串行通信控制器),SPI(1個4線制同步串口),McBSP(2個多通道緩沖型同步串口),6個PWM單元,6個事件捕捉單元,2個QEP正交編碼脈沖,12位ADC(16通道)等。

4.片上外設按輸入時鐘分組

(1)OSCCLK組:看門狗電路?
(2)CLKIN組:CPU?
(3)SYSOUTCLK組:I2C、eCAN總線、PWM、eCAP、eQEP、CPU定時器?
(4)低速組(LOSPCLK):SCI,SPI,McBSP?
(5)高速組(HISPCLK):ADC

5.其他時鐘

TMS320F2833x提供了時鐘輸出引腳和外擴接口,因此還有產生了兩種時鐘,即XCLKOUT和XTIMCLK。默認情況下,XCLKOUT=XTIMCLK/2=SYSCLKOUT/4=OSCCLK/16。特別要注意的是所有的外部擴展訪問都是以內部XINTF的時鐘XTIMCLK為參考的,所有外部接口的訪問都是在XCLKOUT的上升沿開始(具體操作過程和代碼詳見《TMS320F28335時鐘2》)。

TI官方頭文件DSP2833x_SysCtrl.h程序如下:

// TI File $Revision: /main/5 $ // Checkin $Date: May 12, 2008 09:34:58 $ //########################################################################### // // FILE: DSP2833x_SysCtrl.h // // TITLE: DSP2833x Device 系統控制寄存器. // //########################################################################### // $TI Release: DSP2833x/DSP2823x C/C++ Header Files V1.31 $ // $Release Date: August 4, 2009 $ //############################################################################ifndef DSP2833x_SYS_CTRL_H #define DSP2833x_SYS_CTRL_H#ifdef __cplusplus extern "C" { #endif//--------------------------------------------------------------------------- // 系統控制個人注冊定義: //// PLL 狀態寄存器位定義 struct PLLSTS_BITS { // bits 描述Uint16 PLLLOCKS:1; // 0 PLL鎖狀態Uint16 rsvd1:1; // 1 保留Uint16 PLLOFF:1; // 2 PLL關閉Uint16 MCLKSTS:1; // 3 丟失時鐘信號狀態Uint16 MCLKCLR:1; // 4 丟失時鐘清除位Uint16 OSCOFF:1; // 5 振蕩器時鐘關閉位Uint16 MCLKOFF:1; // 6 丟失時鐘檢測關閉位Uint16 DIVSEL:2; // 7 時鐘分頻選擇Uint16 rsvd2:7; // 15:7 保留 }; // PLL狀態寄存器 union PLLSTS_REG {Uint16 all;struct PLLSTS_BITS bit; // PLL 狀態寄存器位定義 };// 高速外設時鐘預分頻寄存器位定義: struct HISPCP_BITS { // bits 描述Uint16 HSPCLK:3; // 2:0 SYSCLKOUT分頻配置Uint16 rsvd1:13; // 15:3 保留 }; // 高速外設時鐘預分頻寄存器 union HISPCP_REG {Uint16 all;struct HISPCP_BITS bit; // 高速外設時鐘預分頻寄存器位定義 };// 低速外設時鐘預分頻寄存器位定義: struct LOSPCP_BITS { // bits 描述Uint16 LSPCLK:3; // 2:0 SYSCLKOUT分頻配置Uint16 rsvd1:13; // 15:3 保留 }; // 低速外設時鐘預分頻寄存器 union LOSPCP_REG {Uint16 all;struct LOSPCP_BITS bit; // 低速外設時鐘預分頻寄存器位定義 };// 外設時鐘控制寄存器0定義: struct PCLKCR0_BITS { // bits 描述Uint16 rsvd1:2; // 1:0 保留Uint16 TBCLKSYNC:1; // 2 EWPM模塊時基時鐘同步使能Uint16 ADCENCLK:1; // 3 ADC時鐘使能Uint16 I2CAENCLK:1; // 4 I2C時鐘使能Uint16 SCICENCLK:1; // 5 SCI-C時鐘使能Uint16 rsvd2:2; // 7:6 保留Uint16 SPIAENCLK:1; // 8 SPI-A時鐘使能Uint16 rsvd3:1; // 9 保留Uint16 SCIAENCLK:1; // 10 SCI-A時鐘使能Uint16 SCIBENCLK:1; // 11 SCI-B時鐘使能Uint16 MCBSPAENCLK:1; // 12 McBSP-A時鐘使能Uint16 MCBSPBENCLK:1; // 13 McBSP-B時鐘使能Uint16 ECANAENCLK:1; // 14 eCAN-A時鐘使能Uint16 ECANBENCLK:1; // 15 eCAN-B時鐘使能 }; // 外設時鐘控制寄存器0 union PCLKCR0_REG {Uint16 all;struct PCLKCR0_BITS bit; // 外設時鐘控制寄存器0定義 };// 外設時鐘控制寄存器1定義: struct PCLKCR1_BITS { // bits 描述Uint16 EPWM1ENCLK:1; // 0 EPWM1時鐘使能Uint16 EPWM2ENCLK:1; // 1 EPWM2時鐘使能Uint16 EPWM3ENCLK:1; // 2 EPWM3時鐘使能Uint16 EPWM4ENCLK:1; // 3 EPWM4時鐘使能Uint16 EPWM5ENCLK:1; // 4 EPWM5時鐘使能Uint16 EPWM6ENCLK:1; // 5 EPWM6時鐘使能Uint16 rsvd1:2; // 7:6 保留Uint16 ECAP1ENCLK:1; // 8 ECAP1時鐘使能Uint16 ECAP2ENCLK:1; // 9 ECAP2時鐘使能Uint16 ECAP3ENCLK:1; // 10 ECAP3時鐘使能Uint16 ECAP4ENCLK:1; // 11 ECAP4時鐘使能Uint16 ECAP5ENCLK:1; // 12 ECAP5時鐘使能Uint16 ECAP6ENCLK:1; // 13 ECAP6時鐘使能Uint16 EQEP1ENCLK:1; // 14 EQEP1時鐘使能Uint16 EQEP2ENCLK:1; // 15 EQEP2時鐘使能 }; // 外設時鐘控制寄存器1 union PCLKCR1_REG {Uint16 all;struct PCLKCR1_BITS bit; // 外設時鐘控制寄存器1定義 };// 外設時鐘控制寄存器3定義: struct PCLKCR3_BITS { // bits 描述Uint16 rsvd1:8; // 7:0 保留Uint16 CPUTIMER0ENCLK:1; // 8 CPU-Timer 0時鐘使能Uint16 CPUTIMER1ENCLK:1; // 9 CPU-Timer 1時鐘使能Uint16 CPUTIMER2ENCLK:1; // 10 CPU-Timer 2時鐘使能Uint16 DMAENCLK:1; // 11 DMA時鐘使能Uint16 XINTFENCLK:1; // 12 XINTF時鐘使能Uint16 GPIOINENCLK:1; // 13 GPIO時鐘使能Uint16 rsvd2:2; // 15:14 保留 }; // 外設時鐘控制寄存器3 union PCLKCR3_REG {Uint16 all;struct PCLKCR3_BITS bit; // 外設時鐘控制寄存器3定義: };// PLL 鎖相環控制寄存器位定義: struct PLLCR_BITS { // bits 描述Uint16 DIV:4; // 3:0 PLL時鐘倍頻數Uint16 rsvd1:12; // 15:4 保留 }; // PLL 鎖相環控制寄存器 union PLLCR_REG {Uint16 all;struct PLLCR_BITS bit; // PLL 鎖相環控制寄存器位定義 };// 低功耗模式控制寄存器位定義: struct LPMCR0_BITS { // bits 描述Uint16 LPM:2; // 1:0 低功耗模式設置Uint16 QUALSTDBY:6; // 7:2 STANDBY喚醒Uint16 rsvd1:7; // 14:8 保留Uint16 WDINTE:1; // 15 看門狗中斷使能 }; // 低功耗模式控制寄存器 union LPMCR0_REG {Uint16 all;struct LPMCR0_BITS bit; // 低功耗模式控制寄存器位定義 };// 映射地址寄存器位定義: struct MAPCNF_BITS { // bits 描述Uint16 MAPEPWM:1; // 0 映射地址使能Uint16 rsvd1:15; // 15:1 保留 }; // 映射地址寄存器 union MAPCNF_REG {Uint16 all;struct MAPCNF_BITS bit; // 映射地址寄存器位定義 };//--------------------------------------------------------------------------- // 系統控制寄存器文件: // struct SYS_CTRL_REGS {Uint16 rsvd1; // 0 保留union PLLSTS_REG PLLSTS; // 1 PLL狀態寄存器Uint16 rsvd2[8]; // 2-9 保留union HISPCP_REG HISPCP; // 10: 高速外設時鐘預分頻寄存器union LOSPCP_REG LOSPCP; // 11: 低速外設時鐘預分頻寄存器union PCLKCR0_REG PCLKCR0; // 12: 外設時鐘控制寄存器0union PCLKCR1_REG PCLKCR1; // 13: 外設時鐘控制寄存器1union LPMCR0_REG LPMCR0; // 14: 低功耗模式控制寄存器Uint16 rsvd3; // 15: 保留union PCLKCR3_REG PCLKCR3; // 16: 外設時鐘控制寄存器3union PLLCR_REG PLLCR; // 17: PLL 鎖相環控制寄存器// No bit definitions are defined for SCSR because// a read-modify-write instruction can clear the WDOVERRIDE bitUint16 SCSR; // 18: 系統控制與狀態寄存器Uint16 WDCNTR; // 19: 看門狗計數器寄存器Uint16 rsvd4; // 20 保留Uint16 WDKEY; // 21: 看門狗復位寄存器Uint16 rsvd5[3]; // 22-24 保留// No bit definitions are defined for WDCR because// the proper value must be written to the WDCHK field// whenever writing to this register.Uint16 WDCR; // 25: 看門狗控制寄存器Uint16 rsvd6[4]; // 26-29 保留union MAPCNF_REG MAPCNF; // 30: 映射地址寄存器Uint16 rsvd7[1]; // 31 保留 };/* --------------------------------------------------- */ /* CSM 寄存器 */ /* */ /* ----------------------------------------------------*//* CSM 狀態與控制寄存器位定義 */ struct CSMSCR_BITS { // bit 描述Uint16 SECURE:1; // 0 僅讀位映射安全狀態Uint16 rsvd1:14; // 14-1 保留Uint16 FORCESEC:1; // 15 清除KEY寄存器并保護芯片};/* CSM 狀態與控制寄存器*/ union CSMSCR_REG {Uint16 all;struct CSMSCR_BITS bit; //CSM 狀態與控制寄存器位定義 };/* CSM 寄存器文件*/ struct CSM_REGS {Uint16 KEY0; // KEY reg bits 15-0Uint16 KEY1; // KEY reg bits 31-16Uint16 KEY2; // KEY reg bits 47-32Uint16 KEY3; // KEY reg bits 63-48Uint16 KEY4; // KEY reg bits 79-64Uint16 KEY5; // KEY reg bits 95-80Uint16 KEY6; // KEY reg bits 111-96Uint16 KEY7; // KEY reg bits 127-112Uint16 rsvd1; // 保留Uint16 rsvd2; // 保留Uint16 rsvd3; // 保?Uint16 rsvd4; // 保留Uint16 rsvd5; // 保留Uint16 rsvd6; // 保留Uint16 rsvd7; // 保留union CSMSCR_REG CSMSCR; // CSM 狀態與控制寄存器位定義 };/* 密碼位置 */ struct CSM_PWL {Uint16 PSWD0; // PSWD bits 15-0Uint16 PSWD1; // PSWD bits 31-16Uint16 PSWD2; // PSWD bits 47-32Uint16 PSWD3; // PSWD bits 63-48Uint16 PSWD4; // PSWD bits 79-64Uint16 PSWD5; // PSWD bits 95-80Uint16 PSWD6; // PSWD bits 111-96Uint16 PSWD7; // PSWD bits 127-112 };/* Flash 寄存器 */#define FLASH_SLEEP 0x0000; #define FLASH_STANDBY 0x0001; #define FLASH_ACTIVE 0x0003;/* Flash 選擇寄存器位定義*/ struct FOPT_BITS { // bit 描述Uint16 ENPIPE:1; // 0 使能流水線模式Uint16 rsvd:15; // 1-15 保留 };/* Flash 選擇寄存器*/ union FOPT_REG {Uint16 all;struct FOPT_BITS bit; //Flash 選擇寄存器位定義 };/* Flash 功耗模式寄存器位定義 */ struct FPWR_BITS { // bit 描述Uint16 PWR:2; // 0-1 功耗模式位Uint16 rsvd:14; // 2-15 保留 };/* Flash 功耗模式寄存器*/ union FPWR_REG {Uint16 all;struct FPWR_BITS bit; //Flash 功耗模式寄存器位定義 };/* Flash 狀態寄存器位定義 */ struct FSTATUS_BITS { // bit 描述Uint16 PWRS:2; // 0-1 功耗模式狀態位Uint16 STDBYWAITS:1; // 2 flash從睡眠模式到備用態計數狀態Uint16 ACTIVEWAITS:1; // 3 flash從備用模式到激活態計數狀態Uint16 rsvd1:4; // 4-7 保留Uint16 V3STAT:1; // 8 flash電壓狀態鎖存位Uint16 rsvd2:7; // 9-15 保留 };/* Flash 狀態寄存器*/ union FSTATUS_REG {Uint16 all;struct FSTATUS_BITS bit; //Flash 狀態寄存器位定義 };/* Flash 備用等待寄存器位定義 */ struct FSTDBYWAIT_BITS { // bit 描述Uint16 STDBYWAIT:9; // 0-8 flash有睡眠到備用態的計數位Uint16 rsvd:7; // 9-15 保留 };/* Flash 備用等待寄存器*/ union FSTDBYWAIT_REG {Uint16 all;struct FSTDBYWAIT_BITS bit; //Flash 備用等待寄存器位定義 };/* Flash 備用到激活態等待寄存器位定義 */ struct FACTIVEWAIT_BITS { // bit 描述Uint16 ACTIVEWAIT:9; // 0-8 flash備用到激活態等待計數Uint16 rsvd:7; // 9-15 保留 };/* Flash 備用到激活態等待寄存器 */ union FACTIVEWAIT_REG {Uint16 all;struct FACTIVEWAIT_BITS bit; //Flash 備用到激活態等待寄存器位定義 };/* flash頁訪問等待寄存器位定義 */ struct FBANKWAIT_BITS { // bit 描述Uint16 RANDWAIT:4; // 0-3 Flash 隨機訪問等待周期數Uint16 rsvd1:4; // 4-7 保留Uint16 PAGEWAIT:4; // 8-11 Flash 頁訪問等待周期數Uint16 rsvd2:4; // 12-15 保留 };/* flash頁訪問等待寄存器*/ union FBANKWAIT_REG {Uint16 all;struct FBANKWAIT_BITS bit; //flash頁訪問等待寄存器位定義 };/* OTP 等待狀態寄存器位定義 */ struct FOTPWAIT_BITS { // bit 描述Uint16 OTPWAIT:5; // 0-4 OTP讀等待狀態位Uint16 rsvd:11; // 5-15 保留 };/* OTP 等待狀態寄存器*/ union FOTPWAIT_REG {Uint16 all;struct FOTPWAIT_BITS bit; //OTP 等待狀態寄存器位定義 };//flash寄存器 struct FLASH_REGS {union FOPT_REG FOPT; // Flash 選擇寄存器Uint16 rsvd1; // 保留union FPWR_REG FPWR; // Flash 功耗模式寄存器union FSTATUS_REG FSTATUS; // Flash 狀態寄存器union FSTDBYWAIT_REG FSTDBYWAIT; // Flash 備用等待寄存器union FACTIVEWAIT_REG FACTIVEWAIT; // Flash 備用到激活態等待寄存器union FBANKWAIT_REG FBANKWAIT; // flash頁訪問等待寄存器union FOTPWAIT_REG FOTPWAIT; // OTP 等待狀態寄存器 };//--------------------------------------------------------------------------- // 系統控制外部引用和函數聲明: // extern volatile struct SYS_CTRL_REGS SysCtrlRegs; extern volatile struct CSM_REGS CsmRegs; extern volatile struct CSM_PWL CsmPwl; extern volatile struct FLASH_REGS FlashRegs;#ifdef __cplusplus } #endif /* extern "C" */#endif // end of DSP2833x_SYS_CTRL_H definition//=========================================================================== // End of file. //===========================================================================
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • 253
  • 254
  • 255
  • 256
  • 257
  • 258
  • 259
  • 260
  • 261
  • 262
  • 263
  • 264
  • 265
  • 266
  • 267
  • 268
  • 269
  • 270
  • 271
  • 272
  • 273
  • 274
  • 275
  • 276
  • 277
  • 278
  • 279
  • 280
  • 281
  • 282
  • 283
  • 284
  • 285
  • 286
  • 287
  • 288
  • 289
  • 290
  • 291
  • 292
  • 293
  • 294
  • 295
  • 296
  • 297
  • 298
  • 299
  • 300
  • 301
  • 302
  • 303
  • 304
  • 305
  • 306
  • 307
  • 308
  • 309
  • 310
  • 311
  • 312
  • 313
  • 314
  • 315
  • 316
  • 317
  • 318
  • 319
  • 320
  • 321
  • 322
  • 323
  • 324
  • 325
  • 326
  • 327
  • 328
  • 329
  • 330
  • 331
  • 332
  • 333
  • 334
  • 335
  • 336
  • 337
  • 338
  • 339
  • 340
  • 341
  • 342
  • 343
  • 344
  • 345
  • 346
  • 347
  • 348
  • 349
  • 350
  • 351
  • 352
  • 353
  • 354
  • 355
  • 356
  • 357
  • 358
  • 359
  • 360
  • 361
  • 362
  • 363
  • 364
  • 365
  • 366
  • 367
  • 368
  • 369
  • 370
  • 371
  • 372
  • 373
  • 374
  • 375
  • 376
  • 377

官網例程文件DSP2833x_SysCtrl.c程序如下:

// TI File $Revision: /main/8 $ // Checkin $Date: April 15, 2009 09:54:05 $ //########################################################################### // // FILE: DSP2833x_SysCtrl.c // // TITLE: DSP2833x Device S系統控制初始化和支持功能. // // DESCRIPTION: // // 系統資源初始化的示例. // //########################################################################### // $TI Release: DSP2833x/DSP2823x C/C++ Header Files V1.31 $ // $Release Date: August 4, 2009 $ //############################################################################include "DSP2833x_Device.h" // Headerfile Include File #include "DSP2833x_Examples.h" // Examples Include File//函數將從RAM運行需要分配給一個不同的部分。本節將被映射到一個使用鏈接器cmd文件加載并運行地址。 #pragma CODE_SECTION(InitFlash, "ramfuncs");//--------------------------------------------------------------------------- // InitSysCtrl: //--------------------------------------------------------------------------- // 該函數初始化系統控制寄存器到一個已知狀態. // - 禁用看門狗 // - 設置 PLLCR寄存器及適當的 SYSCLKOUT 頻率 // - 設置高/低外設時鐘預分頻寄存器 // - 使能相應的外設時鐘控制寄存器void InitSysCtrl(void) //初始化系統控制 {DisableDog(); //關閉看門狗InitPll(DSP28_PLLCR,DSP28_DIVSEL); //初始化PLL控制InitPeripheralClocks(); //初始化外設時鐘 }//--------------------------------------------------------------------------- // 例子: InitFlash: //--------------------------------------------------------------------------- // 改函數初始化flash控制寄存器// 警告 // This function MUST be executed out of RAM. Executing it // out of OTP/Flash will yield unpredictable resultsvoid InitFlash(void) //初始化flash {EALLOW;FlashRegs.FOPT.bit.ENPIPE = 1; //使能flash流水線模式// 警告//Minimum waitstates required for the flash operating//at a given CPU rate must be characterized by TI.//Refer to the datasheet for the latest information. #if CPU_FRQ_150MHZFlashRegs.FBANKWAIT.bit.PAGEWAIT = 5; //Flash 頁訪問等待周期數FlashRegs.FBANKWAIT.bit.RANDWAIT = 5; //Flash 隨機訪問等待周期數FlashRegs.FOTPWAIT.bit.OTPWAIT = 8; //OTP讀等待狀態位 #endif#if CPU_FRQ_100MHZFlashRegs.FBANKWAIT.bit.PAGEWAIT = 3; //Flash 頁訪問等待周期數FlashRegs.FBANKWAIT.bit.RANDWAIT = 3; //Flash 隨機訪問等待周期數FlashRegs.FOTPWAIT.bit.OTPWAIT = 5; //OTP讀等待狀態位 #endif// 警告//這兩個寄存器應該使用默認值FlashRegs.FSTDBYWAIT.bit.STDBYWAIT = 0x01FF; //flash有睡眠到備用態的計數位FlashRegs.FACTIVEWAIT.bit.ACTIVEWAIT = 0x01FF; //flash備用到激活態等待計數EDIS;//Force a pipeline flush to ensure that the write to//the last register configured occurs before returning.asm(" RPT #7 || NOP"); }//--------------------------------------------------------------------------- // 例子: ServiceDog: //--------------------------------------------------------------------------- // 這個函數重置看門狗定時器. // 在應用程序中使用這個函數啟用這個功能void ServiceDog(void) {EALLOW;SysCtrlRegs.WDKEY = 0x0055; //清零看門狗SysCtrlRegs.WDKEY = 0x00AA;EDIS; }//--------------------------------------------------------------------------- // Example: DisableDog: //--------------------------------------------------------------------------- // 這個函數禁止看門狗定時器.void DisableDog(void) {EALLOW;SysCtrlRegs.WDCR= 0x006F; //WDDIS=1禁止看門狗模塊EDIS; }//--------------------------------------------------------------------------- // Example: EnableDog: //--------------------------------------------------------------------------- // 這個函數使能看門狗定時器. void EnableDog(void) {EALLOW;SysCtrlRegs.WDCR= 0x00aF; //使能看門狗EDIS; }//--------------------------------------------------------------------------- // Example: InitPll: //--------------------------------------------------------------------------- /** 函數名稱:InitPll* 函數輸入:倍頻參數val,分頻參數divsel* val取值為0到10,表示倍頻數;divsel取值0到4,0和1表示4分頻,2表示2分頻,3表示不分頻* 函數輸出:無* 函數調用:InitPll(10,2);* 先將外部時鐘倍頻10倍,在分頻1/2,最后產生的時鐘CLKIN輸入CPU28x*/void InitPll(Uint16 val, Uint16 divsel) {// 確保PLL不是工作在limp mode下,即有外部時鐘進入PLLif (SysCtrlRegs.PLLSTS.bit.MCLKSTS != 0) {//檢測到無外部時鐘,軟件要采集恰當的措施保證系統不出現事故,該措施包括//使系統停機、復位等//用適合的函數替換下面一行// SystemShutdown(); function.asm(" ESTOP0");}// PLLCR從0x0000改變前,PLLSTS[DIVSEL]必須為0// 外部RST復位信號會使PLLSTS[DIVSEL]復位// 此時分頻為1/4if (SysCtrlRegs.PLLSTS.bit.DIVSEL != 0){EALLOW;SysCtrlRegs.PLLSTS.bit.DIVSEL = 0;EDIS;}// 前面條件都滿足后,可以改變PLLCR[DIV]if (SysCtrlRegs.PLLCR.bit.DIV != val){EALLOW;// 在設置PLLCR[DIV]前,要禁用主振蕩器檢測邏輯SysCtrlRegs.PLLSTS.bit.MCLKOFF = 1;SysCtrlRegs.PLLCR.bit.DIV = val; //設置倍頻EDIS;//等待鎖相環進入在鎖狀態。//在此期間CPU將切換到OSCCLK / 2。//直到鎖相環穩定。//一旦鎖相環穩定CPU切換到新的倍頻值。//這個鎖定時間由鎖相環計數器監視。//等待這個切換完成。//取消對看門狗的禁用DisableDog();while(SysCtrlRegs.PLLSTS.bit.PLLLOCKS != 1)//已穩定{// Uncomment to service the watchdog// ServiceDog();}EALLOW;SysCtrlRegs.PLLSTS.bit.MCLKOFF = 0;//開啟主振蕩器檢測邏輯EDIS;}//如果需要分頻1/2if((divsel == 1)||(divsel == 2)){EALLOW;SysCtrlRegs.PLLSTS.bit.DIVSEL = divsel; //設置分頻EDIS;}//注意:下面代碼只有在PLL是旁路或者關閉模式時,才可被執行,其他模式禁止。//倍頻時一定要分頻,不倍頻時才允許不分頻//如果需要切換分頻到1/1// * 首先從默認1/4分頻切換到1/2分頻,讓電源穩定// 穩定所需要的時間依賴于系統運行速度,此處延時50us只是作為一個特例// * 穩定后,再切換到1/1if(divsel == 3){EALLOW;SysCtrlRegs.PLLSTS.bit.DIVSEL = 2;DELAY_US(50L);SysCtrlRegs.PLLSTS.bit.DIVSEL = 3;EDIS;} }//-------------------------------------------------------------------------- // 實例: InitPeripheralClocks: //--------------------------------------------------------------------------- // 改函數初始化時鐘的外圍模塊. // 首先設置高/低外設時鐘預分頻寄存器 // 第二個是啟用外圍時鐘. // 降低功耗,將未使用的外設時鐘禁止 // // 注釋: 如果一個外設的時鐘不啟用則你不能讀寫這個外圍的寄存器void InitPeripheralClocks(void) {EALLOW;// HISPCP / LOSPCP預分頻寄存器設置,通常它會被設置為默認值SysCtrlRegs.HISPCP.all = 0x0001; // 75MHZSysCtrlRegs.LOSPCP.all = 0x0001; // 75Mhz// 時鐘輸出引腳XCLKOUT設置,默認情況XCLKOUT = SYSCLKOUT/4 // xintf外部接口時鐘// XTIMCLK = SYSCLKOUT/2XintfRegs.XINTCNF2.bit.XTIMCLK = 1;// XCLKOUT = XTIMCLK/2XintfRegs.XINTCNF2.bit.CLKMODE = 1;// Enable XCLKOUTXintfRegs.XINTCNF2.bit.CLKOFF = 0;// 給所選用外設使能外設時鐘// 如果不使用某外設模塊,禁用它的時鐘以省電// 下面代碼要根據自己使用的外設模塊進行相應的修改SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1; //ADC時鐘使能// *重要提醒*// ADC_cal()函數, 可以從TI保留的OTP中復制ADC校驗值,并將校驗值賦值給ADCREFSEL和ADCOFFTRIM寄存器,該過程在BOOT ROM中自動地完成//如果在調試過程中,BOOT ROM代碼旁路未使用,那么必須顯示調用下面 ADC_cal()函數(推薦顯示調用)//在調用 ADC_cal()前,必須使能ADC時鐘//有關ADC更多的信息參見設備數據手冊ADC_cal();SysCtrlRegs.PCLKCR0.bit.I2CAENCLK = 0; // I2CSysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1; // SCI-A 使能SysCtrlRegs.PCLKCR0.bit.SCIBENCLK = 0; // SCI-BSysCtrlRegs.PCLKCR0.bit.SCICENCLK = 0; // SCI-CSysCtrlRegs.PCLKCR0.bit.SPIAENCLK = 1; // SPI-A 使能SysCtrlRegs.PCLKCR0.bit.MCBSPAENCLK = 0; // McBSP-ASysCtrlRegs.PCLKCR0.bit.MCBSPBENCLK = 0; // McBSP-BSysCtrlRegs.PCLKCR0.bit.ECANAENCLK = 1; // eCAN-A 使能SysCtrlRegs.PCLKCR0.bit.ECANBENCLK = 0; // eCAN-BSysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 1; // ePWM1 使能SysCtrlRegs.PCLKCR1.bit.EPWM2ENCLK = 1; // ePWM2 使能SysCtrlRegs.PCLKCR1.bit.EPWM3ENCLK = 1; // ePWM3 使能SysCtrlRegs.PCLKCR1.bit.EPWM4ENCLK = 1; // ePWM4 使能SysCtrlRegs.PCLKCR1.bit.EPWM5ENCLK = 1; // ePWM5 使能SysCtrlRegs.PCLKCR1.bit.EPWM6ENCLK = 1; // ePWM6 使能SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; // TBCLK時基時鐘 ePWM 使能SysCtrlRegs.PCLKCR1.bit.ECAP3ENCLK = 0; // eCAP3SysCtrlRegs.PCLKCR1.bit.ECAP4ENCLK = 0; // eCAP4SysCtrlRegs.PCLKCR1.bit.ECAP5ENCLK = 0; // eCAP5SysCtrlRegs.PCLKCR1.bit.ECAP6ENCLK = 0; // eCAP6SysCtrlRegs.PCLKCR1.bit.ECAP1ENCLK = 0; // eCAP1SysCtrlRegs.PCLKCR1.bit.ECAP2ENCLK = 0; // eCAP2SysCtrlRegs.PCLKCR1.bit.EQEP1ENCLK = 0; // eQEP1SysCtrlRegs.PCLKCR1.bit.EQEP2ENCLK = 0; // eQEP2SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1; // CPU Timer 0 使能SysCtrlRegs.PCLKCR3.bit.CPUTIMER1ENCLK = 1; // CPU Timer 1 使能SysCtrlRegs.PCLKCR3.bit.CPUTIMER2ENCLK = 1; // CPU Timer 2 使能SysCtrlRegs.PCLKCR3.bit.DMAENCLK = 0; // DMA ClockSysCtrlRegs.PCLKCR3.bit.XINTFENCLK = 1; // XTIMCLK 外擴接口時鐘使能SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1; // GPIO 輸入時鐘使能EDIS; }//=========================================================================== // End of file. //===========================================================================
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • 253
  • 254
  • 255
  • 256
  • 257
  • 258
  • 259
  • 260
  • 261
  • 262
  • 263
  • 264
  • 265
  • 266
  • 267
  • 268
  • 269
  • 270
  • 271
  • 272
  • 273
  • 274
  • 275
  • 276
  • 277
  • 278
  • 279
  • 280
  • 281
  • 282
  • 283
  • 284
  • 285
  • 286
  • 287
  • 288
  • 289
  • 290
  • 291
  • 292
  • 293
  • 294
  • 295
  • 296
  • 297
  • 298
  • 299
  • 300

參考資料?
TMS320F28335時鐘(1)?
TMS320F28335時鐘(2)?
TMS320F28335時鐘(3)?
28335硬件教程-時鐘系統

個人分類:?DSP_28335

總結

以上是生活随笔為你收集整理的TMS320F28335时钟(1)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。