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单片机的其他功能。希望和大家共同探讨学习。
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单片机的其他功能。希望和大家共同探讨学习。
相关文章推荐
- 单片机 时间周期、机器周期、指令周期详解
- 单片机:时钟周期、机器周期、指令周期、总线周期
- 关于指令执行周期的细节思考
- 单片机关于时钟和不同字节不同指令时序(ALE)
- 单片机:时钟周期,机器周期,指令周期
- 单片机:时钟周期,机器周期,指令周期
- 单片机时钟周期、机器周期、指令周期的区别
- 关于时钟周期,机器周期,指令周期等各种周期的总结
- 关于 机器周期、时钟周期、总线周期、指令周期
- 单片机时钟周期、机器周期、指令周期的区别
- 时钟周期(振荡周期)、机器周期、指令周期之间的关系、430单片机
- 嵌入式linux应用开发完全手册 关于pc为什么指向下两条指令的位置问题
- 关于数据库查询优化之sql随笔(初识)
- 关于mysql的点随笔
- 关于汇编的div指令
- MCS-51系列单片机指令表
- 【转】时钟周期,机器周期,指令周期的区别
- 关于生命周期,关于集合,早年笔记分享
- 光伏发电系列:关于光伏发电站的建设成本和资金回收周期
- 关于单片机蓝桥杯