DSPIC隨筆1-----------------------------------關於DSPIC單片機的指令週期

當我們用一款單片機時,首先要考慮的就是它的指令週期,因爲只有明確指令週期是多少,才能運用延時,定時器,中斷,PWM模塊。

1、首先我們看一下單片機外部晶振一般爲多少?

從上圖可以知道,輸入頻率範圍一般爲4MHZ-10MHZ,即從OSC1和OSC2管腳外接晶振即可,現在我用的是DSPIC30F5015芯片。用的外接晶振是4MHZ的,在其他管腳沒有外接晶振。

然後我們可以從框圖中可以看出DSPIC中具有PLL模塊即倍頻模塊。它可以提高內部工作頻率。當時我用它的時候是四倍頻,只要在程序中加入

/*配置位*/
  _FOSC(CSW_FSCM_OFF & XT_PLL4);  //4倍頻晶振,Failsafe 時鐘關閉

即可,這樣外部晶振頻率輸入後內部鎖相環將它擴頻4倍後達到16MHZ。

在圖中註釋1可以看到指令週期爲系統時鐘的1/4即

系統Fcy=16M/4=4M

或者Tcy=4/FOSC=4/16=1/4us。

2、如果外設中用到定時怎麼用??

通過上面的例子可以知道。他使用的是外部晶振頻率是10M的,我用的是4M的,4倍頻後是40MHZ,而Fcy還要除以4,所以,Fcy=10M,Tcy=0.1us。

在程序中具體實現:

首先要定義一下

例如

#define Fcy 7370000                  //7.37MHz外部晶振帶4倍頻,指令週期爲7.37MIPs,他用的外部晶振是7.37MHZ的

然後如果要使用的時候,你定義的是Fcy就不能用Tcy了(如果用Tcy前面就要定義#define Tcy 1/7370000 )

要求PR2(寄存器)的時候就要按照如下寫。

//6.1.4  程序清單

/* 該程序採用定時器 1(Timer 1)閃亮LED,同時按鍵可以使LED開關。 */
#include <p30f6014.h>                //dsPIC30F6014標準頭文件
/*配置位*/
  _FOSC(CSW_FSCM_OFF & XT_PLL4);  //4倍頻晶振,Failsafe 時鐘關閉
  _FWDT(WDT_OFF);                    //關閉看門狗定時器
  _FBORPOR(PBOR_OFF & MCLR_EN);   //掉電覆位禁止,MCLR復位使能。
  _FGS(CODE_PROT_OFF);              //代碼保護禁止
#define Fcy 7370000                  //7.37MHz外部晶振帶4倍頻,指令週期爲7.37MIPs

int main(void)
{  
/*設置LED控制寄存器和定時器*/
//初始化LED端口和按鍵開關端口
LATD = 0xFFFF;                   //關閉所有LED
TRISD = 0xFFF0;               //設定LED引腳爲輸出
TRISA = 0xFFFF;               //設定按鍵開關引腳爲輸入
//初始化定時器1爲1/2秒
T1CON = 0;                     //關閉定時器1
TMR1 = 0;                         //啓動定時器1的計數寄存器爲0
PR1 = (Fcy/256)/2;              //設定1/2秒延時時間
T1CON = 0x8030;              //配置定時器1 (定時器開, 在空閒模式定時器繼續工作,
                                //控時間累加禁止, 預分頻比是1:256, 內部時鐘)
   while (1)
   {
       /*按1Hz的頻率閃亮LED*/
      if(IFS0bits.T1IF == 1)         //檢測定時器1的中斷標誌是否設定
       {
         IFS0bits.T1IF = 0;                         //清除定時器1中斷標誌
         LATDbits.LATD0 = !LATDbits.LATD0;       // LED1閃亮
      }
       /*按鍵控制LED開關*/
      if(PORTAbits.RA12 == 0)       //檢測SW1按鍵是否按下
       {
         LATDbits.LATD2 = 0;         //LED3開
           LATDbits.LATD3 = 1;         // LED4關
      }
      if(PORTAbits.RA13 == 0)       //檢測SW2按鍵是否按下
      {
         LATDbits.LATD3 = 0;           // LED4開
         LATDbits.LATD2 = 1;           // LED3關
      }
    }
}

後面我會將陸續介紹一下PIC單片機的其他功能。希望和大家共同探討學習。

 

發佈了9 篇原創文章 · 獲贊 9 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章