您的位置:首页 > 其它

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

2013-10-10 11:39 309 查看
当我们用一款单片机时,首先要考虑的就是它的指令周期,因为只有明确指令周期是多少,才能运用延时,定时器,中断,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单片机的其他功能。希望和大家共同探讨学习。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: