源码基于 PIC16F15355开发板,想了解详情,请点 PIC16F15355开发板
PIC16F15355 内部晶振框图如下,从框图中我们知道MCU时钟来源有3个:外部时钟,内部时钟,Timer1
内部时钟源(INTERNAL CLOCK SOURCES)HFINTOSC:内部高速时钟,最大32MHz。
MFINTOSC:内部中速时钟,500 kHz频率
LFINTOSC:内部低速时钟,只有31 kHz频率
下面我们以内部时钟为例,时钟最高可以跑到32MHz,可以通过OSCFRQ 1MHz,2MHz,4MHz,8MHz,12MHz,16MHz,32MHz,那程序如何来切换呢?
时钟源的选择
通过OSCCON1寄存器,选择系统所需的时钟源
NOSC 选择时钟源,000---111 有8种模式;NDIV 设置时钟分频比,如果分频值为1,那PIC16F15355 最大频率就可以跑到32MHz,最后通过OSCFRQ来选择内部时钟频率
OSCCON1 = 0x60; // NOSC HFINTOSC; NDIV 1;
OSCCON3 = 0x00; // CSWHOLD may proceed; SOSCPWR Low power;
OSCEN = 0x00; // MFOEN disabled; LFOEN disabled; ADOEN disabled; SOSCEN disabled; EXTOEN disabled; HFOEN disabled;
OSCFRQ = 0x06; // HFFRQ 32_MHz;
OSCSTAT = 0x00; // MFOR not ready;
OSCTUNE = 0x00; // HFTUN 0;
那如何实现时钟切换呢?其实,也是通过设置OSCFRQ的值设置,但有一个注意点就是,切换时钟后,要等待时钟切换完成。
//等待时钟切换成功,要不然还是以原时钟运行
while(OSCSTATbits.HFOR != 0x01); //HFINTOSC Oscillator Ready bit
OSCCON1bits.NDIV = 0x00; //Clock divider 1:1
OSCCON1bits.NOSC = 0x60; //复位时钟1MHz
OSCFRQbits.HFFRQ = clock_freq;
switch(clock_freq)
{
case OSC_1M_HF:
case OSC_2M_HF:
case OSC_4M_HF:
case OSC_8M_HF:
case OSC_16M_HF:
case OSC_32M_HF:
//等待时钟切换成功,要不然还是以原时钟运行
while(OSCSTATbits.HFOR != 0x01); //HFINTOSC Oscillator Ready bit
break;
default:
break;
}
好了,本章节就到这里,谢谢大家的关注。