忍者ブログ

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

2025/05/23

dsPIC33CH Curiosity Development Board(準備編)

まずはマイコンを動かす為の前段階として各設定をして行きます。

■コンフィグレーション設定
従来のdsPIC系に比べ、デュアルコアになっている為、コンフィグレーション設定は
やや複雑になっています。

特にマスターとスレーブのデータをやり取りするための設定や、どちらが
I/Oピンを使用するかのオーナーシップ設定が他のPIC系には見かけない設定です。


/*------------------------------------------------------------------------------------------*/
/*【****】FSEC,FBSLIM(ブートセグメント)*/
/*------------------------------------------------------------------------------------------*/
#pragma config BWRP = OFF               // ブートセグメント書き込み保護ビット(ブートセグメントは書き込み可能)
#pragma config BSS = DISABLED           // ブートセグメントコード保護レベルビット(保護なし(BWRP以外))
#pragma config BSEN = OFF               // ブートセグメント制御ビット(ブートセグメントなし)
#pragma config GWRP = OFF               // 一般セグメント書き込み保護ビット(一般セグメントは書き込み可能)
#pragma config GSS = DISABLED           // 一般セグメントコード保護レベルビット(保護なし(GWRP以外))
#pragma config CWRP = OFF               // 構成セグメント書き込み保護ビット(構成セグメントは書き込み可能)
#pragma config CSS = DISABLED           // コンフィギュレーションセグメントコード保護レベルビット(保護なし(CWRP以外))
#pragma config AIVTDIS = OFF            // 代替割り込みベクタテーブルビット(AIVT無効))

/*------------------------------------------------------------------------------------------*/
/*【****】FOSCSEL*/
/*------------------------------------------------------------------------------------------*/
#pragma config FNOSC = PRIPLL            // 発振器ソースの選択(ポストスケーラ付き内蔵高速RC(FRC)発振器)
#pragma config IESO = OFF                // 2速オシレータ起動許可ビット(FRCでデバイスを起動してから、ユーザが選択したオシレータソースに切り替える)

/*------------------------------------------------------------------------------------------*/
/*【****】FOSC(マスターオシレータ設定)*/
/*------------------------------------------------------------------------------------------*/
#pragma config POSCMD = EC              // プライマリオシレータモード選択ビット(外部クロック)
#pragma config OSCIOFNC = OFF           // OSC2端子機能ビット(OSC2はクロック出力)
#pragma config FCKSM = CSECMD           // クロック切り替えモードビット(クロック切り替えは有効、フェールセーフクロックモニターは無効)
#pragma config PLLKEN = PLLKEN_ON       // PLLロックステータス制御
#pragma config XTCFG = G1               // XT Config(8〜16 MHzクリスタル)
#pragma config XTBST = ENABLE           // XT Boost(キックスタートを後押し)
/*------------------------------------------------------------------------------------------*/
/*【****】FWDT(マスターウォッチドッグ)*/
/*------------------------------------------------------------------------------------------*/
#pragma config RWDTPS = PS2147483648    // ランモードウォッチドッグタイマポストスケーラ選択ビット(1:2147483648)
#pragma config RCLKSEL = LPRC           // ウォッチドッグタイマクロック選択ビット(常にLPRCを使用)
#pragma config WINDIS = ON              // ウォッチドッグタイマウィンドウイネーブルビット(ウォッチドッグタイマはノンウィンドウモードで動作)
#pragma config WDTWIN = WIN25           // ウォッチドッグタイマウィンドウ選択ビット(WDTウィンドウはWDT周期の25%)
#pragma config SWDTPS = PS2147483648    // スリープモードウォッチドッグタイマポストスケーラ選択ビット(1:2147483648)
#pragma config FWDTEN = ON_SW           // ウォッチドッグタイマ有効ビット(SWでWDT制御、WDTCON.ONビットを使用)

/*------------------------------------------------------------------------------------------*/
/*【****】FPOR(ブートスペースオプション)*/
/*------------------------------------------------------------------------------------------*/
#pragma config BISTDIS = DISABLED       // メモリBIST機能の無効化(リセット時のmBIST機能の無効化)

/*------------------------------------------------------------------------------------------*/
/*【****】FICD(マスター書き込み/デバッグ設定)*/
/*------------------------------------------------------------------------------------------*/
#pragma config ICS = PGD2               // ICD通信チャネル選択ビット(PGC2とPGD2で通信)
#pragma config JTAGEN = OFF             // JTAGイネーブルビット(JTAGはディセーブル)
#pragma config NOBTSWP = OFF            // BOOTSWP命令無効ビット(BOOTSWP命令は無効)

/*------------------------------------------------------------------------------------------*/
/*【****】FDMTIVTL,FDMTIVTH,FDMTCNTL,FDMTCNTH,FDMT(デッドマンタイマ)*/
/*------------------------------------------------------------------------------------------*/
#pragma config DMTIVTL = 0xFFFF         // デッドマンタイマ間隔下位ワード(32ビットDMTウィンドウ間隔の下位16ビット(0-0xFFFF))
#pragma config DMTIVTH = 0xFFFF         // デッドマンタイマー間隔上位ワード(32ビットDMTウィンドウ間隔のうち16ビット(0-0xFFFF)まで)
#pragma config DMTCNTL = 0xFFFF         // 32ビットDMT命令数タイムアウト値(0〜0×FFFF)の下位16ビット(32ビットDMT命令数タイムアウト値(0〜0×FFFF)の下位16ビット)
#pragma config DMTCNTH = 0xFFFF         // 32ビットDMT命令カウントタイムアウト値(0-0xFFFF)の上位16ビット(32ビットDMT命令カウントタイムアウト値(0-0xFFFF)の上位16ビット)
#pragma config DMTDIS = OFF             // デッドマンタイマー無効ビット(デッドマンタイマーは無効で、ソフトウェアで有効にできます)

/*------------------------------------------------------------------------------------------*/
/*【****】FDEVOPT(その他)*/
/*------------------------------------------------------------------------------------------*/
#pragma config ALTI2C1 = OFF            // 代替I2C1ピンビット(I2C1はSDA1 / SCL1ピンにマッピング)
#pragma config ALTI2C2 = OFF            // 代替I2C2ピンビット(I2C2はSDA2 / SCL2ピンにマッピング)
#pragma config SMBEN = SMBUS            // SMバスイネーブル(SMBus入力しきい値がイネーブル)
#pragma config SPI2PIN = PPS            // SPI2ピン選択ビット(SPI2はI / Oリマップ(PPS)ピンを使用)

/*------------------------------------------------------------------------------------------*/
/*【****】FALTREG(コンテキスト切り替え)*/
/*------------------------------------------------------------------------------------------*/
#pragma config CTXT1 = OFF              // 代替作業レジスター関連割り込み優先順位レベル(IPL) 1 bits (未割当)
#pragma config CTXT2 = OFF              // 代替作業レジスター関連割り込み優先順位レベル(IPL) 2 bits (未割当)
#pragma config CTXT3 = OFF              // 代替作業レジスター関連割り込み優先順位レベル(IPL) 3 bits (未割当)
#pragma config CTXT4 = OFF              // 代替作業レジスター関連割り込み優先順位レベル(IPL) 4 bits (未割当)

/*------------------------------------------------------------------------------------------*/
/*【****】FMBXM(メールボックス方向)*/
/*------------------------------------------------------------------------------------------*/
#pragma config MBXM0 = M2S              // メールボックス0のデータ方向(マスタデータ書き込み用に設定されたメールボックスレジスタ(マスタからスレーブへのデータ転送))
#pragma config MBXM1 = M2S              // メールボックス1のデータ方向(マスタデータ書き込み用に設定されたメールボックスレジスタ(マスタからスレーブへのデータ転送))
#pragma config MBXM2 = M2S              // メールボックス2のデータ方向(マスタデータ書き込み用に設定されたメールボックスレジスタ(マスタからスレーブへのデータ転送))
#pragma config MBXM3 = M2S              // メールボックス3のデータ方向(マスタデータ書き込み用に設定されたメールボックスレジスタ(マスタからスレーブへのデータ転送))
#pragma config MBXM4 = M2S              // メールボックス4のデータ方向(マスタデータ書き込み用に設定されたメールボックスレジスタ(マスタからスレーブへのデータ転送))
#pragma config MBXM5 = M2S              // メールボックス5のデータ方向(マスタデータ書き込み用に設定されたメールボックスレジスタ(マスタからスレーブへのデータ転送))
#pragma config MBXM6 = M2S              // メールボックス6のデータ方向(マスタデータ書き込み用に設定されたメールボックスレジスタ(マスタからスレーブへのデータ転送))
#pragma config MBXM7 = S2M              // メールボックス7のデータ方向(マスターデータ読み取り用に設定されたメールボックスレジスタ(スレーブからマスターへのデータ転送))
#pragma config MBXM8 = S2M              // メールボックス8のデータ方向(マスターデータ読み取り用に設定されたメールボックスレジスタ(スレーブからマスターへのデータ転送))
#pragma config MBXM9 = S2M              // メールボックス9のデータ方向(マスターデータ読み取り用に設定されたメールボックスレジスタ(スレーブからマスターへのデータ転送))
#pragma config MBXM10 = S2M             // メールボックス10のデータ方向(マスターデータ読み取り用に設定されたメールボックスレジスタ(スレーブからマスターへのデータ転送))
#pragma config MBXM11 = S2M             // メールボックス11のデータ方向(マスターデータ読み取り用に設定されたメールボックスレジスタ(スレーブからマスターへのデータ転送))
#pragma config MBXM12 = S2M             // メールボックス12のデータ方向(マスターデータ読み取り用に設定されたメールボックスレジスタ(スレーブからマスターへのデータ転送))
#pragma config MBXM13 = S2M             // メールボックス13のデータ方向(マスターデータ読み取り用に設定されたメールボックスレジスタ(スレーブからマスターへのデータ転送))
#pragma config MBXM14 = S2M             // メールボックス14のデータ方向(マスターデータ読み取り用に設定されたメールボックスレジスタ(スレーブからマスターへのデータ転送))
#pragma config MBXM15 = S2M             // メールボックス15のデータ方向(マスターデータ読み取り用に設定されたメールボックスレジスタ(スレーブからマスターへのデータ転送))

/*------------------------------------------------------------------------------------------*/
/*【****】FMBXHS1,FMBXHS2*/
/*------------------------------------------------------------------------------------------*/
#pragma config MBXHSA = MBX6            // メールボックスハンドシェイクプロトコルブロックAレジスタ割り当て(メールボックスハンドシェイクプロトコルブロックAに割り当てられたMSIxMBXD6)
#pragma config MBXHSB = MBX13           // メールボックスハンドシェイクプロトコルブロックBレジスタ割り当て(メールボックスハンドシェイクプロトコルブロックBに割り当てられたMSIxMBXD13)
#pragma config MBXHSC = MBX15           // メールボックスハンドシェイクプロトコルブロックCのレジスタ割り当て(メールボックスハンドシェイクプロトコルブロックCに割り当てられているMSIxMBXD15)
#pragma config MBXHSD = MBX15           // メールボックスハンドシェイクプロトコルブロックDのレジスタ割り当て(メールボックスハンドシェイクプロトコルブロックDに割り当てられているMSIxMBXD15)
#pragma config MBXHSE = MBX15           // メールボックスハンドシェイクプロトコルブロックEレジスタ割り当て(メールボックスハンドシェイクプロトコルブロックEに割り当てられたMSIxMBXD15)
#pragma config MBXHSF = MBX15           // メールボックスハンドシェイクプロトコルブロックFレジスタ割り当て(メールボックスハンドシェイクプロトコルブロックFに割り当てられたMSIxMBXD15)
#pragma config MBXHSG = MBX15           // メールボックスハンドシェイクプロトコルブロックGレジスタ割り当て(メールボックスハンドシェイクプロトコルブロックGに割り当てられたMSIxMBXD15)
#pragma config MBXHSH = MBX15           // メールボックスハンドシェイクプロトコルブロックHレジスタ割り当て(メールボックスハンドシェイクプロトコルブロックHに割り当てられたMSIxMBXD15)

/*------------------------------------------------------------------------------------------*/
/*【****】FMBXHSEN*/
/*------------------------------------------------------------------------------------------*/
#pragma config HSAEN = ON               // メールボックスAデータフロー制御プロトコルブロックの有効化(メールボックスデータフロー制御ハンドシェイクプロトコルブロックの有効化)
#pragma config HSBEN = ON               // メールボックスBデータフロー制御プロトコルブロックの有効化(メールボックスデータフロー制御ハンドシェイクプロトコルブロックの有効化)
#pragma config HSCEN = ON               // メールボックスCデータフロー制御プロトコルブロックの有効化(メールボックスデータフロー制御ハンドシェイクプロトコルブロックの有効化)
#pragma config HSDEN = OFF              // メールボックスDデータフロー制御プロトコルブロックの有効化(メールボックスデータフロー制御ハンドシェイクプロトコルブロックの無効化)
#pragma config HSEEN = OFF              // メールボックスEデータフロー制御プロトコルブロックの有効化(メールボックスデータフロー制御ハンドシェイクプロトコルブロックの無効化)
#pragma config HSFEN = OFF              // メールボックスFデータフロー制御プロトコルブロックの有効化(メールボックスデータフロー制御ハンドシェイクプロトコルブロックの無効化)
#pragma config HSGEN = OFF              // メールボックスGデータフロー制御プロトコルブロックの有効化(メールボックスデータフロー制御ハンドシェイクプロトコルブロックの無効化)
#pragma config HSHEN = OFF              // メールボックスHデータフロー制御プロトコルブロックの有効化(メールボックスデータフロー制御ハンドシェイクプロトコルブロックの無効化)

/*------------------------------------------------------------------------------------------*/
/*【****】FCFGPRA0(PortAピンオーナーシップビット)*/
/*------------------------------------------------------------------------------------------*/
#pragma config CPRA0 = MSTR             // ピン RA0 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRA1 = SLV1             // ピン RA1 オーナーシップビット (スレーブコアがピンを所有)
#pragma config CPRA2 = MSTR             // ピン RA2 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRA3 = MSTR             // ピン RA3 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRA4 = MSTR             // ピン RA4 オーナーシップビット (マスターコアがピンを所有.)

/*------------------------------------------------------------------------------------------*/
/*【****】FCFGPRB0(PortBピンオーナーシップビット)*/
/*------------------------------------------------------------------------------------------*/
#pragma config CPRB0 = MSTR             // ピン RB0 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRB1 = MSTR             // ピン RB1 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRB2 = SLV1             // ピン RB2 オーナーシップビット (スレーブコアがピンを所有)
#pragma config CPRB3 = MSTR             // ピン RB3 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRB4 = MSTR             // ピン RB4 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRB5 = MSTR             // ピン RB5 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRB6 = MSTR             // ピン RB6 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRB7 = MSTR             // ピン RB7 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRB8 = MSTR             // ピン RB8 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRB9 = MSTR             // ピン RB9 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRB10 = MSTR            // ピン RB10 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRB11 = SLV1            // ピン RB11 オーナーシップビット (スレーブコアがピンを所有)
#pragma config CPRB12 = SLV1            // ピン RB12 オーナーシップビット (スレーブコアがピンを所有)
#pragma config CPRB13 = MSTR            // ピン RB13 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRB14 = MSTR            // ピン RB14 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRB15 = MSTR            // ピン RB15 オーナーシップビット (マスターコアがピンを所有.)

/*------------------------------------------------------------------------------------------*/
/*【****】FCFGPRC0(PortCピンオーナーシップビット)*/
/*------------------------------------------------------------------------------------------*/
#pragma config CPRC0 = SLV1             // ピン RC0 オーナーシップビット (スレーブコアがピンを所有)
#pragma config CPRC1 = MSTR             // ピン RC1 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRC2 = MSTR             // ピン RC2 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRC3 = MSTR             // ピン RC3 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRC4 = MSTR             // ピン RC4 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRC5 = SLV1             // ピン RC5 オーナーシップビット (スレーブコアがピンを所有)
#pragma config CPRC6 = MSTR             // ピン RC6 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRC7 = MSTR             // ピン RC7 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRC8 = MSTR             // ピン RC8 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRC9 = MSTR             // ピン RC9 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRC10 = MSTR            // ピン RC10 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRC11 = MSTR            // ピン RC11 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRC12 = MSTR            // ピン RC12 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRC13 = SLV1            // ピン RC13 オーナーシップビット (スレーブコアがピンを所有)
#pragma config CPRC14 = SLV1            // ピン RC14 オーナーシップビット (スレーブコアがピンを所有)
#pragma config CPRC15 = SLV1            // ピン RC15 オーナーシップビット (スレーブコアがピンを所有)

/*------------------------------------------------------------------------------------------*/
/*【****】FCFGPRD0(PortDピンオーナーシップビット)*/
/*------------------------------------------------------------------------------------------*/
#pragma config CPRD0 = MSTR             // ピン RD0 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRD1 = MSTR             // ピン RD1 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRD2 = MSTR             // ピン RD2 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRD3 = MSTR             // ピン RD3 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRD4 = MSTR             // ピン RD4 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRD5 = MSTR             // ピン RD5 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRD6 = MSTR             // ピン RD6 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRD7 = MSTR             // ピン RD7 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRD8 = MSTR             // ピン RD8 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRD9 = SLV1             // ピン RD9 オーナーシップビット (スレーブコアがピンを所有)
#pragma config CPRD10 = SLV1            // ピン RD10 オーナーシップビット (スレーブコアがピンを所有)
#pragma config CPRD11 = MSTR            // ピン RD11 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRD12 = MSTR            // ピン RD12 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRD13 = MSTR            // ピン RD13 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRD14 = MSTR            // ピン RD14 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRD15 = MSTR            // ピン RD15 オーナーシップビット (マスターコアがピンを所有.)

/*------------------------------------------------------------------------------------------*/
/*【****】FCFGPRE0(PortEピンオーナーシップビット)*/
/*------------------------------------------------------------------------------------------*/
#pragma config CPRE0 = MSTR             // ピン RE0 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRE1 = SLV1             // ピン RE1 オーナーシップビット (スレーブコアがピンを所有)
#pragma config CPRE2 = MSTR             // ピン RE2 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRE3 = MSTR             // ピン RE3 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRE4 = MSTR             // ピン RE4 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRE5 = MSTR             // ピン RE5 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRE6 = MSTR             // ピン RE6 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRE7 = MSTR             // ピン RE7 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRE8 = MSTR             // ピン RE8 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRE9 = SLV1             // ピン RE9 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRE10 = MSTR            // ピン RE10 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRE11 = MSTR            // ピン RE11 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRE12 = MSTR            // ピン RE12 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRE13 = MSTR            // ピン RE13 オーナーシップビット (マスターコアがピンを所有.)
#pragma config CPRE14 = SLV1            // ピン RE14 オーナーシップビット (スレーブコアがピンを所有)
#pragma config CPRE15 = SLV1            // ピン RE15 オーナーシップビット (スレーブコアがピンを所有)

/*------------------------------------------------------------------------------------------*/
/*【****】FS1OSCSEL(スレーブオシレータ)*/
/*------------------------------------------------------------------------------------------*/
#pragma config S1FNOSC = PRIPLL        // 発振器ソースの選択(ポストスケーラ付き内蔵高速RC(FRC)発振器)
#pragma config S1IESO = OFF            // 2速オシレータ起動許可ビット(FRCでデバイスを起動してから、ユーザが選択したオシレータソースに切り替える)

/*------------------------------------------------------------------------------------------*/
/*【****】FS1OSC(スレーブオシレータ)*/
/*------------------------------------------------------------------------------------------*/
#pragma config S1OSCIOFNC = OFF         // スレーブOSC2端子機能ビット(OSC2はクロック出力)
#pragma config S1FCKSM = CSECMD         // クロック切り替えモードビット(クロック切り替えは有効、フェールセーフクロックモニターは無効)
#pragma config S1PLLKEN = S1PLLKEN_ON   // S1PLLKEN (S1PLLKEN_ON)

/*------------------------------------------------------------------------------------------*/
/*【****】FS1WDT(スレーブウォッチドッグタイマ)*/
/*------------------------------------------------------------------------------------------*/
#pragma config S1RWDTPS = PS1048576     // ランモードウォッチドッグタイマポストスケーラ選択ビット(1:1048576)
#pragma config S1RCLKSEL = LPRC         // ウォッチドッグタイマクロック選択ビット(常にLPRCを使用)
#pragma config S1WINDIS = ON            // ウォッチドッグタイマウィンドウイネーブルビット(ウォッチドッグタイマはノンウィンドウモードで動作)
#pragma config S1WDTWIN = WIN25         // ウォッチドッグタイマウィンドウ選択ビット(WDTウィンドウはWDT周期の25%)
#pragma config S1SWDTPS = PS1048576     // スリープモードウォッチドッグタイマポストスケーラ選択ビット(1:1048576)
#pragma config S1FWDTEN = ON_SW         // ウォッチドッグタイマイネーブルビット(WDTCはWDTCON.ONビットで制御)

/*------------------------------------------------------------------------------------------*/
/*【****】FS1POR(スレーブブートセグメント)*/
/*------------------------------------------------------------------------------------------*/
#pragma config S1BISTDIS = DISABLED     //リセットディセーブルビットのスレーブBIST(リセット機能のスレーブBISTディセーブル)

/*------------------------------------------------------------------------------------------*/
/*【****】FS1ICD(スレーブ書き込み/デバッグ) */
/*------------------------------------------------------------------------------------------*/
#pragma config S1ICS = PGD2             // ICD通信チャネル選択ビット(PGC2とPGD2で通信)
#pragma config S1ISOLAT = ON            // デバッグ中にスレーブコアサブシステムをマスターサブシステムから分離します(MSIのSLVENビットが0の場合でも、スレーブは(デバッグモードで)動作できます)。
#pragma config S1NOBTSWP = OFF          // BOOTSWP命令有効/無効ビット(BOOTSWP命令は無効)

/*------------------------------------------------------------------------------------------*/
/*【****】FS1DEVOPT(スレーブその他)*/
/*------------------------------------------------------------------------------------------*/
#pragma config S1ALTI2C1 = OFF          // 代替I2C1ピンビット(I2C1はSDA1 / SCL1ピンにマッピング)
#pragma config S1SPI1PIN = PPS          // S1 SPI1ピン選択ビット(スレーブSPI1はI / Oリマップ(PPS)ピンを使用)
#pragma config S1SSRE = ON              // スレーブリセットイネーブル(スレーブで生成されたリセットはMSIモジュールのスレーブイネーブルビットをリセットします)
#pragma config S1MSRE = ON              //マスタスレーブリセットイネーブル(マスタソフトウェア指向のRESETイベント(RESETオペコード、ウォッチドッグタイムアウト、TRAPリセット、illegalInstruction)によっても、スレーブサブシステムがリセットされます。)

/*------------------------------------------------------------------------------------------*/
/*【****】FS1ALTREG(スレーブコンテキストスイッチ)*/
/*------------------------------------------------------------------------------------------*/
#pragma config S1CTXT1 = OFF            // 代替作業レジスター関連割り込み優先順位レベル(IPL) 1 bits (未割当)
#pragma config S1CTXT2 = OFF            // 代替作業レジスター関連割り込み優先順位レベル(IPL) 2 bits (未割当)
#pragma config S1CTXT3 = OFF            // 代替作業レジスター関連割り込み優先順位レベル(IPL) 3 bits (未割当)
#pragma config S1CTXT4 = OFF            // 代替作業レジスター関連割り込み優先順位レベル(IPL) 4 bits (未割当)


■マクロ記述
マクロは別々のファイルに書いてあったりするのですが、ここではクロック設定に 関連したマクロを抜粋。
#define CORE_MASTER         0
#define CORE_SLAVE          1
#define CORE_TYPE           CORE_MASTER         /* CORE_MASTER or CORE_SLAVE */
/*----- OSCCONbits.COSC か OSCCONbits.NOSCで使用 -----*/
#define AUX_OSC_FRC         0u  /* 高速 RC オシレータ  */
#define AUX_OSC_FRCPLL      1u  /* PLL 併用高速 RC オシレータ */
#define AUX_OSC_PRI         2u  /* プライマリ オシレータ */
#define AUX_OSC_PRIPLL      3u  /* PLL 併用プライマリ オシレータ */
#define AUX_OSC_SOSC        4u  /* セカンダリ オシレータ  */
#define AUX_OSC_LPRC        5u  /* 低消費電力 RC オシレータ */
#define AUX_OSC_FRCDIV16    6u  /* 16 分周高速 RC オシレータ */
#define AUX_OSC_FRCDIVN     7u  /* N 分周高速 RC オシレータ */

/*----- OSCCONbits.OSWENで使用 -----*/
#define AUX_OSC_SWITCH_STAT   0u  /* オシレータ切り換えは完了した  */
#define AUX_OSC_SWITCH_EN     1u  /* オシレータへの切り換えを要求する */

/*----- OSCCONbits.LOCKで使用 -----*/
#define AUX_OSC_LOCK_OFF    0u  /* PLL はロック解除中、または起動タイマが作動中、または PLL は無効になっている  */
#define AUX_OSC_LOCK_ON     1u  /* PLL はロック中、または PLL 起動タイマは終了した */

/*----- CANCLKCONbits.CANCLKSELで使用 -----*/
#define AUX_DRV_CANCLK_NO           0u
#define AUX_DRV_CANCLK_FVCO         1u
#define AUX_DRV_CANCLK_FPLLO        2u
#define AUX_DRV_CANCLK_FVCO_DIV2    3u
#define AUX_DRV_CANCLK_FVCO_DIV3    4u
#define AUX_DRV_CANCLK_FVCO_DIV4    5u
#define AUX_DRV_CANCLK_AFPLLO       6u
#define AUX_DRV_CANCLK_AFVCO        7u
#define AUX_DRV_CANCLK_AFVCO_DIV2   8u
#define AUX_DRV_CANCLK_AFVCO_DIV3   9u
#define AUX_DRV_CANCLK_AFVCO_DIV4   10u

■クロック設定
外部クロック入力の8MHzをPLLで逓倍してFCY,FP = 90MHzに設定しています。
    /*------------------------------------------------------------------------------------------*/
    /* 動作クロックの設定をする */
    /* FVCO = FPLLI * M/N1 (Range = 400MHz to 1.6GHz)*/
    /* FPLLO = FPLLI * M/(N1 * N2 * N3) */
     /*       = 8 * 180 / (1 * 2 * 4) = 360MHz*/
    /* FOSC = FPLLO / 2 = 180MHz*/
    /* FCY = FOSC / 2 = 90MHz*/        
    /*------------------------------------------------------------------------------------------*/  
static void vds_Main_Init_Clock_Register(void)
{
#if (CORE_TYPE == CORE_MASTER)
        PLLFBDbits.PLLFBDIV = 180u; /* M = 180 */
        PLLDIVbits.POST2DIV = 1u;   /* N3 = 1 */
        PLLDIVbits.POST1DIV = 4u;   /* N2 = 4 */
        CLKDIVbits.PLLPRE = 1;      /* N1 = 1 */
#elif (CORE_TYPE == CORE_SLAVE)
        PLLFBDbits.PLLFBDIV = 180u; /* M = 180 */
        PLLDIVbits.POST2DIV = 1u;   /* N3 = 1 */
        PLLDIVbits.POST1DIV = 4u;   /* N2 = 4 */
        CLKDIVbits.PLLPRE = 1;      /* N1 = 1 */
#else  
#error "error";
#endif
    /*------------------------------------------------------------------------------------------*/
    /* オシレータの種類を選択し切り替える */
    /*------------------------------------------------------------------------------------------*/
        __builtin_write_OSCCONH(AUX_OSC_PRIPLL);
        __builtin_write_OSCCONL(OSCCON | AUX_OSC_SWITCH_EN);
    /*------------------------------------------------------------------------------------------*/
    /* FRC オシレータ調整レジスタ */
    /*------------------------------------------------------------------------------------------*/
        while (OSCCONbits.OSWEN != 0u)   {;}
    /*------------------------------------------------------------------------------------------*/
    /* PLLがロックするまで待機する */
    /*------------------------------------------------------------------------------------------*/
        while (OSCCONbits.LOCK != AUX_OSC_LOCK_ON) {;}
#endif
    
    /*------------------------------------------------------------------------------------------*/
    /* FRC オシレータ調整レジスタ */
    /*------------------------------------------------------------------------------------------*/
#if (CORE_TYPE == CORE_MASTER)		
        OSCTUN	= 0x0000u;	
#endif		
    /*------------------------------------------------------------------------------------------*/
    /* 補助クロック制御レジスタ 1 */
    /* AFVCO = AFPLLI * M/N1 (Range = 400MHz to 1.6GHz)*/        
    /* AFPLLO = AFPLLI * M/(N1 * N2 * N3) */
    /*------------------------------------------------------------------------------------------*/	
        ACLKCON1	= 0x0000u;	
        ACLKCON1bits.APLLPRE = 1u;      /* APLL 位相検出器入力分周比ビット */
        ACLKCON1bits.FRCSEL = 1u;       /* APLL 用参照クロック源 FRC 選択ビット */
        ACLKCON1bits.APLLCK = 0u;       /* APLL 位相ロック ステータスビット */
        ACLKCON1bits.APLLEN = 0u;       /* 補助PLL有効化選択ビット */
    /*------------------------------------------------------------------------------------------*/
    /* APLLフィードバック分周比レジスタ */
    /*------------------------------------------------------------------------------------------*/		
        APLLFBD1	= 125u;	
    /*------------------------------------------------------------------------------------------*/
    /* PLL VCO 出力分周比選択レジスタ */
    /*------------------------------------------------------------------------------------------*/	
        APLLDIV1	= 0x0000u;	
        APLLDIV1bits.APOST2DIV	= 2u;	/* APLL VCO 出力分周比選択ビット1 */
        APLLDIV1bits.APOST1DIV	= 1u;	/* APLL VCO 出力分周比選択ビット2 */
        APLLDIV1bits.AVCODIV	= 0u;	/* APLL VCO 出力分周比選択ビット */
            
        ACLKCON1bits.APLLEN	= 1u;       /* 補助PLL有効化選択ビット */ 
    /*------------------------------------------------------------------------------------------*/
    /* PLLがロックするまで待機する */
    /*------------------------------------------------------------------------------------------*/
        while (ACLKCON1bits.APLLCK == AUX_OSC_LOCK_ON);
        
    /*------------------------------------------------------------------------------------------*/
    /* CANクロック制御レジスタ */
    /*------------------------------------------------------------------------------------------*/
#if (CORE_TYPE == CORE_MASTER)				
        CANCLKCON	= 0x0000u;	
#endif
 }



次回は実際にLEDを点滅させて行きます。
PR

2019/04/21 dsPIC33C Comment(0)

COMMENT

COMMENT FORM

NAME
MAIL
WEB
TITLE
COMMENT
PASSWORD

プロフィール
 
HN:
ぴくお
性別:
非公開
 
 
カテゴリー
 
 
 
最新記事
 
(10/03)
(09/05)
(08/23)
(08/17)
(08/16)
 
 
RSS
 
 
 
リンク
 
 
 
免責事項
当サイトに掲載の回路図やプログラム等は動作する事を期待して掲載しておりますが、その動作の保証、性能の保証は致しません。 また掲載されているソフトウェアの使用により生じたいかなる損害に関しまして作者は一切責任を負いません。