コンフィギュレーション (Configuration)

デバイスのハードウェア上の設定を行います。

各デバイスにどのような設定値が存在するかは、そのデバイスのヘッダファイルに記述されています。たとえばp30f4012.hでは、次のように定義されています。

/* -------------------------------------------- */
/* Macros for Device Configuration Registers    */
/* -------------------------------------------- */

/* FOSC */
#define _FOSC(x) __attribute__((section("__FOSC.sec,code"))) int _FOSC = (x);

#define CSW_FSCM_OFF    0xFFFF
#define CSW_ON_FSCM_OFF 0x7FFF
#define CSW_FSCM_ON     0x3FFF
#define EC              0xFFFB
#define ECIO            0xFFFC
#define EC_PLL4         0xFFFD
#define EC_PLL8         0xFFFE
#define EC_PLL16        0xFFFF
#define ERC             0xFFF9
#define ERCIO           0xFFF8
#define XT              0xFFF4
#define XT_PLL4         0xFFF5
#define XT_PLL8         0xFFF6
#define XT_PLL16        0xFFF7
#define XTL             0xFFF0
#define FRC_PLL4        0xFFF1
#define FRC_PLL8        0xFFFA
#define FRC_PLL16       0xFFF3
#define HS              0xFFF2
#define LP              0xFCFF
#define FRC             0xFDFF
#define LPRC            0xFEFF

/* FWDT */
#define _FWDT(x) __attribute__((section("__FWDT.sec,code"))) int _FWDT = (x);

#define WDT_ON         0xFFFF
#define WDT_OFF        0x7FFF
#define WDTPSA_1       0xFFCF
#define WDTPSA_8       0xFFDF
#define WDTPSA_64      0xFFEF
#define WDTPSA_512     0xFFFF
#define WDTPSB_1       0xFFF0
#define WDTPSB_2       0xFFF1
#define WDTPSB_3       0xFFF2
#define WDTPSB_4       0xFFF3
#define WDTPSB_5       0xFFF4
#define WDTPSB_6       0xFFF5
#define WDTPSB_7       0xFFF6
#define WDTPSB_8       0xFFF7
#define WDTPSB_9       0xFFF8
#define WDTPSB_10      0xFFF9
#define WDTPSB_11      0xFFFA
#define WDTPSB_12      0xFFFB
#define WDTPSB_13      0xFFFC
#define WDTPSB_14      0xFFFD
#define WDTPSB_15      0xFFFE
#define WDTPSB_16      0xFFFF

/* FBORPOR */
#define _FBORPOR(x) __attribute__((section("__FBORPOR.sec,code"))) int _FBORPOR = (x);

#define MCLR_EN        0xFFFF
#define MCLR_DIS       0x7FFF
#define RST_IOPIN      0xFFFF
#define RST_PWMPIN     0xFBFF
#define PWMxH_ACT_HI   0xFFFF
#define PWMxH_ACT_LO   0xFDFF
#define PWMxL_ACT_HI   0xFFFF
#define PWMxL_ACT_LO   0xFEFF
#define PBOR_ON        0xFFFF
#define PBOR_OFF       0xFF7F
#define BORV_20        0xFFFF
#define BORV_27        0xFFEF
#define BORV_42        0xFFDF
#define BORV_45        0xFFCF
#define PWRT_OFF       0xFFFC
#define PWRT_4         0xFFFD
#define PWRT_16        0xFFFE
#define PWRT_64        0xFFFF


/* FGS */
#define _FGS(x) __attribute__((section("__FGS.sec,code"))) int _FGS = (x);

#define CODE_PROT_OFF  0xFFFF
#define CODE_PROT_ON   0xFFFD
#define GWRP_OFF  0xFFFF
#define GWRP_ON   0xFFFE
※これはヘッダの一部のみの抜粋

コンフィギュレーションの設定

コンフィギュレーションの設定は、下記のように各レジスタ用に用意されたマクロを使用して行います。複数の定数を指定する場合は、&で論理和を取ります。

_FOSC( CSW_FSCM_OFF & XT_PLL8 );
コンフィギュレーションに関連するレジスタ一覧
レジスタ 設定対象
FOSC クロック発振器 (OSCillator)
FWDT ウォッチドッグタイマ (WatchDog Timer)
FBORPOR ブラウンアウトリセット (Brown-Out Reset)
パワーオンリセット (Power-On Reset)
FGS コードプロテクト (General code Segment)
ファイル名 アドレス Bit 15 Bit 14 Bit 13 Bit 12 Bit 11 Bit 10 Bit 9 Bit 8 Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
FOSC F80000 FCKSM - - - - FOS - - - - FPR
FWDT F80002 FWDTEN - - - - - - - - - FWPSA FWPSB
FBORPOR F80004 MCLREN - - - - PWMPIN HPOL LPOL BOREN - BORV - - FPWRT
FGS F8000A - - - - - - - - - - - - - - GCP GWRP
TABLE 21-8: DEVICE CONFIGURATION REGISTER MAP (DS70135C)

FOSCレジスタ (OSCillator)

クロック発振器の設定を行います。

_FOSC(x)
_FOSC( CSW_FSCM_OFF & XT_PLL8 );

クロック設定

CSWとFSCMの設定値
定数 CSW
(クロック切り替え)
FSCM
(フェールセーフ クロックモニタ)
CSW_FSCM_OFF × (無効) × (無効)
CSW_ON_FSCM_OFF ○ (有効) × (無効)
CSW_FSCM_ON ○ (有効) ○ (有効)
CSW クロック切り替え (Clock SWitching)
プログラム実行中にクロックの切り替えを可能とする機能です。なおこの切り替え先は、OSCCONレジスタのNOSC<1:0>ビットで指定します。
FSCM フェールセーフ クロックモニタ (Fail-Safe Clock Monitor)
クロックが停止したときには、それを内蔵のLPRC発振に切り替えて処理を続行できるようにする機能です。(クロックの切り替えを必要とするため、CSWが有効のときしか機能しないようにされていると考えられます)

発振モード

発振モードの設定値 (一部)
モード 定数 周波数範囲※1 PLL※2 備考
水晶発振
(Crystal)
LP 32kHz × 低電力
HS 10 ~ 25MHz  
XT 4 ~ 10MHz ×  
XT_PLL8 8倍  
XT_PLL16 4 ~ 7.5MHz 16倍  
外部クロック
(External clock input)
EC 0 ~ 40MHz ×  
ECIO OSC2ピンはI/O
EC_PLL8 0 ~ 15MHz 8倍
EC_PLL16 0 ~ 7.5MHz 16倍
外部RC発振
(External RC oscillator)
ERC 0 ~ 4MHz × OSC2ピンはクロック出力
ERCIO OSC2ピンはI/O
内蔵RC発振
(Internal RC oscillator)
LPRC 512kHz × 低電力
FRC 8MHz ×  
FRC_PLL8 8倍  
FRC_PLL16 7.5MHz 16倍  
※1 dsPIC30Fの動作周波数の最大は120MHzのため、周波数範囲もそれに制限されます。
※2 PLL (Phase Locked Loop)

クロックの上限値

動作周波数の最大は電源電圧によって制限されるため、それに留意する必要があります。

電圧範囲 最大 動作周波数
30MIPS※1 20MIPS※1
4.5 ~ 5.5V 120MHz (30MIPS) 80MHz (20MIPS)
3.0 ~ 3.6V 80MHz (20MIPS) 60MHz (15MIPS)
2.5 ~ 3.0V 40MHz (10MIPS) 30MHz (7.5MIPS)
※1 デバイスタイプは、デバイス上に刻印されています。たとえば[ dsPIC30F4012-30I ]の太字部分。ここが「30」ならば30MIPS、「20」ならば20MIPSになります。
※MIPS = ( FOSC * PLL ) / 4

OSCCONレジスタ (OSCillator CONtrol)

定数 説明
_NOSC0 _NOSC0と_NOSC1で設定します。それぞれが、
  • 1と1 … 主発振器
  • 1と0 … 内蔵LPRC発振器
  • 0と1 … 内蔵FRC発振器
  • 0と0 … 低電力32kHz水晶発振器
の対応関係となっています。
_NOSC1
/* OSCCON */
#define _OSWEN   OSCCONbits.OSWEN
#define _LPOSCEN OSCCONbits.LPOSCEN
#define _CF      OSCCONbits.CF
#define _LOCK    OSCCONbits.LOCK
#define _POST    OSCCONbits.POST
#define _NOSC    OSCCONbits.NOSC
#define _TUN0    OSCCONbits.TUN0
#define _TUN1    OSCCONbits.TUN1
#define _COSC    OSCCONbits.COSC
#define _TUN2    OSCCONbits.TUN2
#define _TUN3    OSCCONbits.TUN3
#define _POST0   OSCCONbits.POST0
#define _POST1   OSCCONbits.POST1
#define _NOSC0   OSCCONbits.NOSC0
#define _NOSC1   OSCCONbits.NOSC1
#define _COSC0   OSCCONbits.COSC0
#define _COSC1   OSCCONbits.COSC1

FWDTレジスタ (WatchDog Timer)

ウォッチドッグタイマの設定を行います。

_FWDT(x)
_FWDT( WDT_OFF );
WDT (Watchdog Timer) の設定値
定数 説明
WDT_OFF ウォッチドッグタイマ (WatchDog Timer) の有効/無効 無効
WDT_ON 有効
WDTPSA_xx ウォッチドッグタイマ プリスケーラ (WatchDog Timer PreScaler)

プリスケーラAの値

xxは「1、8、64、512」のいずれか

WDTPSB_xx

プリスケーラBの値

xxは「1~16」のいずれか

FBORPORレジスタ (BOR / POR)

_FBORPOR(x)
_FBORPOR( PBOR_OFF & MCLR_EN );

BOR (Brown-out Reset)

BOR (Brown-out Reset) の設定値
定数 説明
PBOR_OFF ブラウンアウトの有効/無効 無効
PBOR_ON 有効
BORV_20 ブラウンアウトの動作電圧 2.0V
BORV_27 2.7V
BORV_42 4.2V
BORV_45 4.5V

POR (Power-on Reset)

POR (Power-on Reset) の設定値
定数 説明
PWRT_OFF パワーオンリセットの無効 無効
PWRT_4 タイムアウト時間 4ms
PWRT_16 16ms
PWRT_64 64ms

MCLR (Master Clear)

MCLR (Master Clear) の設定値
定数 MCLRピンによるリセット
MCLR_EN ○ (有効)
MCLR_DIS × (無効)

PWM (Pulse Width Modulation)

PWMの設定値
定数 説明
RST_IOPIN PWMピンモード I/O
RST_PWMPIN PWM
PWMxH_ACT_HI 高位側 アクティブHigh
PWMxH_ACT_LO アクティブLow
PWMxL_ACT_HI 低位側 アクティブHigh
PWMxL_ACT_LO アクティブLow

FGSレジスタ (General code Segment)

プログラム保護の設定を行います。

  • GCP (General code segment Code-Protect)
  • GWRP (General code segment WRite-Protect)
_FGS(x)
_FGS( CODE_PROT_OFF );
GS (General code Segment) の設定値
定数 説明
CODE_PROT_OFF ユーザープログラムメモリのコード保護
(読み込み禁止)
× (無効)
CODE_PROT_ON ○ (有効)
GWRP_OFF ユーザープログラムメモリの書き込み保護
(書き込み禁止)
× (無効)
GWRP_ON ○ (有効)

参考

  • Section 24. Device Configuration (DS70071D)
  • Section 33. Device Configuration (Part II) (DS70271B)
  • dsPIC30Fファミリー リファレンスマニュアル (DS70046B_JP)
    24章「デバイスコンフィギュレーション」
  • Section 7. Oscillator (DS70054E)