Bootstrap

PIC单片机应用开发实践教程(七):PIC16F153xx——时钟使用

源码基于  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;
    }

好了,本章节就到这里,谢谢大家的关注。

;