PIC16的双速启动模式
当振荡器模块被配置为HS模式时,系统使用外部晶振提供的频率作为系统时钟。但是晶振起振与代码执行之间是存在延时的,在这段延时期间,单片机是无法执行任何程序的。HS模式下,上电之后晶振起振,提供时钟信号,但是这个信号不能马上被系统使用,因为这时候的时钟信号可能还不大稳定,所以需要等待一段稳定时间,振荡器才能用作系统时钟源。振荡器起振定时器(OST)的作用就在这里,HS模式OST会被使能接收到晶振的振荡信号后它会开始计数,当计数到1024次振荡时,稳定时间已过,外部晶振开始作用于系统时钟源。
对于一些需要快速启动的系统,这段延时可能会是一个比较让人头疼的问题,例如需要经常休眠然后需要快速启动的系统,这段延时启动会降低系统的反应敏捷度,空等延时也是浪费了无意义的电量损耗。双速时钟启动模式,则可以解决这个问题。
双速时钟启动简单来说,就是在启动延时这段时间里,启动内部振荡器来提供时钟信号,程序上电就能跑,然后当1024次震荡周期过了之后,切换回外部晶振提供的时钟信号。两者合作,度过这段虚无的时光。
1.双速启动顺序
1. 从上电复位或休眠中唤醒。
2. 使用内部振荡器以OSCCON寄存器的IRCF《3:0》位设置的频率(默认只500 kHz)开始执行指令。
3. OST使能,计数1024个时钟周期。
4. OST超时,等待内部振荡器下降沿出现。
5. OSCSTAT寄存器的OSTS位置1(根据此标志位判断是外部时钟源运行,还是内部振荡器运行)。
6. 系统时钟保持为低电平,直到新时钟下一个下降沿出现(HS模式)。
7. 系统时钟切换到外部时钟源。
2.通过以下设置来配置双速启动模式:
1.配置字CONFIG1的bit 12(IESO)=1,使能内/外部时钟切换模式
2.SCS(在OSCCON寄存器中)= 00,由配置字中的FOSC《1:0》决定时钟来源。
3. 配置字中的FOSC《2:0》位被配置HS模式,即FOSC《2:0》 = 010。
3.实验代码
#include
#include
#define _XTAL_FREQ 500000
// CONFIG1
#pragma config FOSC = HS // Oscillator Selection Bits (HS Oscillator, High-speed crystal/resonator connected between OSC1 and OSC2 pins)
#pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled)
#pragma config MCLRE = ON // MCLR Pin Function Select (MCLR/VPP pin function is MCLR)
#pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config BOREN = ON // Brown-out Reset Enable (Brown-out Reset enabled)
#pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = ON // Internal/External Switch Over (Internal External Switch Over mode is enabled)
#pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled)
void main()
{
OSCCON = 0x38; //0011 1000 时钟初始化
PORTA |= 0x04;
TRISA &= 0xfb;
while(1)
{
RA2=1;
__delay_ms(100);
RA2=0;
__delay_ms(100);
}
}
不过,事实上虽然有代码了,但是没办法进入双速时钟模式,因为板子根本就没有外部晶振。将工程编译烧录之后,确实可以看到D6在闪烁,因为muc以配置的500KHz时钟在运行。dalao不存在的,只有挡刀的小兵。
-
时钟
+关注
关注
10文章
1712浏览量
131253 -
PIC16F1619
+关注
关注
0文章
2浏览量
2823
发布评论请先 登录
相关推荐
评论