
投稿日 2013/09/28
Microchip社のデモボードDM240311に搭載されているPIC 24F16KA102を使用して、クロック設定をいろいろ試みてみました。

Microchip社 DM240311 超低消費電力CPU PIC24F16KA102搭載
PICのクロックシステムは結構複雑ですので、その設定も少々面倒です。
クロック源が5種類。それらを直接またはPLLによる逓倍、分周器による分周などで計11種類ものクロックが生成できます。
なぜそのように複雑かというと、
クロック源が複数あると、停止したときに切り替えられる
アプリケーションに最適な周波数のクロックを選べる。とくに低消費電力アプリケーションの場合は、必要によって極力低速で動かす必要がある。
低い周波数の外部発振子や発振器をPLLで高い周波数にしたほうが安定。特にUSBをサポートするCPUでは高安定の高い周波数のクロックが必要
リアルタイムクロック・カレンダは32,768Hzのクロック源がCPUクロックとは別に有るほうがよい
などの理由が考えられます。
今回使用した24F16KA102では、以下のような構成になっています。(24Fであれば概ね似たような構成になっています)

PIC 24F16KA102のオシレータ・ダイヤグラム(Microchip社 データシートより抜粋)
プライマリ外部発振子2種類(XT, HS)
プライマリ外部発振器(EC)
8MHz内部RC発振器(FRC)
500KHz内部RC発振器(LPFRC)
31KHz内部発振器(LPRC)
セカンダリ外部発振子(SOSC)
FRCまたはLPFRC用のプログラマブル分周器 1-256分周(FRCDIV)
XT, HS, ECまたはFRCDIV用の4逓倍PLL(XTPLL, HSPLL, ECPLL, FRCPLL)
リファレンスオシレータ分周器付きのクロック信号出力(REFO)
CPUクロック用プログラマブル分周器(DOZE)
フェールセーフクロック制御
これらの組み合わせにより以下の11種類のクロックが選択できます。
XT: 10MHzまでの外部発振子直接
HS: 10 - 32MHzまでの外部発振子直接
EC: 32MHzまでの外部発振器直接
XTPLL: XTをPLLで4逓倍
HSPLL: HSをPLLで4逓倍
ECPLL: ECをPLLで4逓倍
FRC、LPFRC: 8MHz(FRC)または500KHz(LPFRC)内部発振器
FRCDIV: FRCまたはLPFRCを分周器(1-256分周)で分周
FRCPLL: FRCDIVをPLLで4逓倍
LPRC: 31KHzの内部発振器
SOSC: セカンダリ外部発振器
Foscの最高は32MHzです。
上記のいずれかをDOZEで分周(またはしない)ものがFoscとなります。
CPUのインストラクションサイクルはFoscの1/2です。(最高32MHz/2 = 16MHz = 16Mips)
FoscまたはXT, HS, ECのいずれかを、プログラマブル分周器を通して外部(REFO)に出力できます。REFOは外部の回路で使うことができます。
各プログラマブル分周器はプログラム実行中に分周比を変更できます。
クロック源の切り替えも可能です。ただし特定のシーケンスを実行する必要があります。
クロックの設定はオシレータ・コンフィグレーションの_FOSCSELと_FOSCで行います。
以下のプログラムでは次のように設定しています。
_FOSCSEL(FNOSC_FRCPLL & IESO_OFF)
FNOSC_FRCPLLでFRCPLLを選択しています。
IESO_OFFでクロック切り替えを禁止しています。
_FOSC(POSCMOD_NONE & OSCIOFNC_OFF & POSCFREQ_MS & SOSCSEL_SOSCLP & FCKSM_CSECMD)
POSCMOD_NONE プライマリオシレータは使いません。
OSCIOFNC_OFF CLKOにFosc/2またはZODEで分周した結果を出力します。
POSCFREQ_MS プライマリオシレータの周波数を指定しています(POSCは使わない)
SOSCSEL_SOSCLP セカンダリオシレータをローパワーモードにしています。(SOSCは使わない)
FCKSM_CSECMD クロック切り替え可能にします。フェールセーフ時の切り替えは行わない
クロック源はFRCなので8MHzです。
プログラムの実行時CLKDIVbits.RCDIV = 1としてFRCの分周比を1/2にしてFRC / 2 = 4MHz(FRCDIV)を得ています。
FRCDIVをPLLで4逓倍してFosc 16MHz(FRCPLL)を得ています。インストラクションサイクル(CLKOにも出力される)はFosc / 2 = 8MHz Tcy = 125nsとなります。
FRCPLLはプログラムの実行時、REFOCONbits.RODIV = 4としてリファレンスオシレータ分周器の分周比を1/16にしてREFOに1MHzを出力しています。

Ch1(上) CLKOに出力された8MHz(Fosc/2)の波形
Ch2(下) REFOに出力された1MHz(REFO)の波形
プログラムはクロックを設定したあと永久ループしています。
#include <p24f16ka102.h>
_FBS(BWRP_OFF & BSS_OFF)
_FGS( GWRP_OFF & GCP_OFF)
/*OSCILLATOR SELECTION CONFIGURATION REGISTER
Oscillator Select:
FNOSC_FRC Fast RC oscillator (FRC)
-
FNOSC_FRCPLL Fast RC oscillator with divide-by-N with PLL module (FRCDIV+PLL)
FNOSC_PRI Primary oscillator (XT, HS, EC)
FNOSC_PRIPLL Primary oscillator with PLL module (HS+PLL, EC+PLL)
FNOSC_SOSC Secondary oscillator (SOSC)
FNOSC_LPRC Low-Power RC oscillator (LPRC)
FNOSC_LPFRC 500 kHz Low-Power FRC oscillator with divide-by-N (LPFRCDIV)
FNOSC_FRCDIV 8 MHz FRC oscillator with divide-by-N (FRCDIV)Internal External Switch Over bit:
-
IESO_OFF Internal External Switchover mode disabled (Two-Speed Start-up disabled)
IESO_ON Internal External Switchover mode enabled (Two-Speed Start-up enabled) */
_FOSCSEL(FNOSC_FRCPLL & IESO_OFF)
-
/*OSCILLATOR CONFIGURATION REGISTER
Primary Oscillator Configuration bits:
POSCMOD_EC External clock mode selected
POSCMOD_XT XT oscillator mode selected
POSCMOD_HS HS oscillator mode selected
-
POSCMOD_NONE Primary oscillator disabled
CLKO Enable Configuration bit:-
OSCIOFNC_ON CLKO output disabled; pin functions as port I/O
OSCIOFNC_OFF CLKO output signal is active on the OSCO pin
Primary Oscillator Frequency Range Configuration bits:
POSCFREQ_LS Primary oscillator/external clock input frequency less than 100 kHz
-
-
POSCFREQ_MS Primary oscillator/external clock input frequency between 100 kHz and 8 MHz
POSCFREQ_HS Primary oscillator/external clock input frequency greater than 8 MHz
SOSC Power Selection Configuration bits:
-
SOSCSEL_SOSCLP Secondary oscillator configured for low-power operation
SOSCSEL_SOSCHP Secondary oscillator configured for high-power operation
Clock Switching and Monitor Selection:
FCKSM_CSECME Both Clock Switching and Fail-safe Clock Monitor are enabled
-
-
FCKSM_CSECMD Clock switching is enabled, Fail-Safe Clock Monitor is disabled
FCKSM_CSDCMD Both Clock Switching and Fail-safe Clock Monitor are disabled */
_FOSC(POSCMOD_NONE & OSCIOFNC_OFF & POSCFREQ_MS & SOSCSEL_SOSCLP & FCKSM_CSECMD)
_FWDT(WDTPS_PS32768 & FWPSA_PR128 & WINDIS_OFF & FWDTEN_OFF)
_FPOR(BOREN_BOR3 & PWRTEN_OFF & I2C1SEL_PRI & BORV_LPBOR & MCLRE_ON)
_FICD( ICS_PGx3 & COE_OFF & BKBUG_OFF)
_FDS(DSWDTPS_DSWDTPSF & DSWDTOSC_SOSC & RTCOSC_SOSC & DSBOREN_ON & DSWDTEN_OFF)
int main(void){
CLKDIVbits.RCDIV = 1; // 1/2
REFOCONbits.RODIV = 4; // 1/16
REFOCONbits.ROEN = 1;
while(1);
}
(JF1VRR)