源码基于 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:1OSCCON1bits.NOSC = 0x60; //复位时钟1MHzOSCFRQbits.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;}
好了,本章节就到这里,谢谢大家的关注。









