现在的位置: 首页 > 综合 > 正文

DSPIC随笔1———————————–关于DSPIC单片机的指令周期

2014年01月22日 ⁄ 综合 ⁄ 共 2003字 ⁄ 字号 评论关闭

当我们用一款单片机时,首先要考虑的就是它的指令周期,因为只有明确指令周期是多少,才能运用延时,定时器,中断,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单片机的其他功能。希望和大家共同探讨学习。

 

抱歉!评论已关闭.