デバイスのハードウェア上の設定を行います。
各デバイスにどのような設定値が存在するかは、そのデバイスのヘッダファイルに記述されています。たとえば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 |
クロック発振器の設定を行います。
_FOSC(x)
_FOSC( CSW_FSCM_OFF & XT_PLL8 );
定数 | CSW (クロック切り替え) |
FSCM (フェールセーフ クロックモニタ) |
---|---|---|
CSW_FSCM_OFF | × (無効) | × (無効) |
CSW_ON_FSCM_OFF | ○ (有効) | × (無効) |
CSW_FSCM_ON | ○ (有効) | ○ (有効) |
モード | 定数 | 周波数範囲※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倍 |
動作周波数の最大は電源電圧によって制限されるため、それに留意する必要があります。
電圧範囲 | 最大 動作周波数 | |
---|---|---|
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) |
定数 | 説明 |
---|---|
_NOSC0 | _NOSC0と_NOSC1で設定します。それぞれが、
|
_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(x)
_FWDT( WDT_OFF );
定数 | 説明 | |
---|---|---|
WDT_OFF | ウォッチドッグタイマ (WatchDog Timer) の有効/無効 | 無効 |
WDT_ON | 有効 | |
WDTPSA_xx | ウォッチドッグタイマ プリスケーラ (WatchDog Timer PreScaler) |
プリスケーラAの値 xxは「1、8、64、512」のいずれか |
WDTPSB_xx |
プリスケーラBの値 xxは「1~16」のいずれか |
_FBORPOR(x)
_FBORPOR( PBOR_OFF & MCLR_EN );
定数 | 説明 | |
---|---|---|
PBOR_OFF | ブラウンアウトの有効/無効 | 無効 |
PBOR_ON | 有効 | |
BORV_20 | ブラウンアウトの動作電圧 | 2.0V |
BORV_27 | 2.7V | |
BORV_42 | 4.2V | |
BORV_45 | 4.5V |
定数 | 説明 | |
---|---|---|
PWRT_OFF | パワーオンリセットの無効 | 無効 |
PWRT_4 | タイムアウト時間 | 4ms |
PWRT_16 | 16ms | |
PWRT_64 | 64ms |
定数 | MCLRピンによるリセット |
---|---|
MCLR_EN | ○ (有効) |
MCLR_DIS | × (無効) |
定数 | 説明 | |
---|---|---|
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(x)
_FGS( CODE_PROT_OFF );
定数 | 説明 | |
---|---|---|
CODE_PROT_OFF | ユーザープログラムメモリのコード保護 (読み込み禁止) |
× (無効) |
CODE_PROT_ON | ○ (有効) | |
GWRP_OFF | ユーザープログラムメモリの書き込み保護 (書き込み禁止) |
× (無効) |
GWRP_ON | ○ (有効) |