2018 Microchip Technology Inc. DS50002509B_JP - p. 1
MPLAB
®
XC32ユ ーザガイド
組み込みエンジニア向け
MPLAB
®
XC32 ユーザガイド
はじめに
本書には32 ビットデバイスと MPLAB® XC32 C コンパイラ向けの 7 つのサンプル コードを掲載しています。読者にはマイクロコントローラとC 言語プログラミングに 関するある程度の知識が必要です。 1. LED を点灯 / 消灯させる 2. 遅延関数を使って LED を点滅させる 3. 遅延用に割り込みを使って LED を点滅させる4. ADC を使ってポテンショメータの値を LED で表示する (MPLAB Harmony を使用 ) 5. ADC を使ってポテンショメータの値を LED で表示する (MCC を使用 )
6. フラッシュメモリへの書き込みステータスを LED で表示する (MPLAB Harmony を使用)
7. フラッシュメモリの値を LED で表示する (MCC を使用 )
補遺A MPLAB X IDE内でのコード実行 補遺B ソフトウェアとハードウェアの入手先
1. LED を点灯 / 消灯させる
以下のサンプルコードは、PIC32MX470F512L プラグイン モジュール (PIM) を挿した Explorer 16/32 開発ボード上の LED を点灯 / 消灯します。詳細は B.「ソフトウェアと ハードウェアの入手先」を参照してください。
// PIC32MX470F512L Configuration Bit Settings // 'C' source line config statements
// DEVCFG3
// USERID = No Setting
#pragma config FSRSSEL = PRIORITY_7 // Shadow Register Set Priority 7 #pragma config PMDL1WAY = ON // Peripheral Module - One Reconfig #pragma config IOL1WAY = ON // Peripheral Pin Select - One Reconfig #pragma config FUSBIDIO = ON // USB USID Selection - Port Function #pragma config FVBUSONIO = ON // USB VBUS ON Selection - Port Function // DEVCFG2
#pragma config FPLLIDIV = DIV_12 // PLL Input Divider - 12x #pragma config FPLLMUL = MUL_24 // PLL Multiplier - 24x
#pragma config UPLLIDIV = DIV_12 // USB PLL Input Divider - 12x #pragma config UPLLEN = OFF // USB PLL Disabled and Bypassed #pragma config FPLLODIV = DIV_256 // Sys PLL Output Divide by 256 // DEVCFG1
#pragma config FNOSC = FRCDIV // Oscillator - Fast RC Osc w/Div-by-N #pragma config FSOSCEN = ON // Secondary Oscillator Enabled
#pragma config IESO = OFF // Internal/External Switch Over Disabled #pragma config POSCMOD = OFF // Primary Oscillator Disabled
#pragma config OSCIOFNC = OFF // CLKO on OSCO Pin Disabled
#pragma config FPBDIV = DIV_8 // Peripheral Clock Divisor:Sys_Clk/8 #pragma config FCKSM = CSDCMD // Clock Switch Disable, FSCM Disabled #pragma config WDTPS = PS1048576 // WDT Postscaler 1:1048576
#pragma config WINDIS = OFF // Watchdog Timer is in Non-Window Mode #pragma config FWDTEN = OFF // WDT Disabled (SWDTEN Control)
#pragma config FWDTWINSZ = WINSZ_25 // Watchdog Timer Window 25% // DEVCFG0
#pragma config DEBUG = OFF // Background Debugger Disabled #pragma config JTAGEN = OFF // JTAG Disabled
#pragma config ICESEL = ICS_PGx2 // ICE/ICD Comm Channel PGEC2/PGED2 #pragma config PWP = OFF // Program Flash Write Protect Disabled #pragma config BWP = OFF // Boot Flash Write Protect Disabled #pragma config CP = OFF // Code Protect Disabled
// #pragma config statements should precede project file includes. // Use project enums instead of #define for ON and OFF.
#include <xc.h>
#define LEDS_ON_OFF 0x55 int main(void) {
// Port A access
TRISA = 0x0000; // set all port bits to be output LATA = LEDS_ON_OFF; // write to port latch
return 0; } 1.1 参照 1.2 参照 1.3 参照 1.4 参照
2018 Microchip Technology Inc. DS50002509B_JP - p. 3 Microchip 社製デバイスは、各種デバイス機能の動作を設定する ( または有効 / 無効に する) ためのビットを格納したコンフィグレーション レジスタを備えています。 1.1.1 設定が必要なコンフィグレーション ビット 特に以下の設定が必要です。 • オシレータの選択 - ハードウェアのオシレータ回路に適合させる必要があります。 正しく選択しないとデバイスクロックは動作しません。一般的に、開発ボードは高 速水晶振動子を使います。以下はサンプルコードからの抜粋です。
#pragma config FNOSC = PRI
#pragma config POSCMOD = HS
• ウォッチドッグ タイマ - このタイマは、必要になるまで無効にしておく事を推奨し ます。そうする事で、予期せぬリセットを防ぎます。以下はサンプルコードからの 抜粋です。
#pragma config FWDTEN = OFF
• コード保護 - コード保護は、必要になるまで無効にしておきます。そうする事で、 デバイスメモリへのフルアクセスを確保します。以下はサンプルコードからの抜粋 です。
#pragma config CP = OFF
本書のサンプルコードとは異なる32 ビットデバイスを使う場合、上記とは異なるコ ンフィグレーション ビットの設定が必要になる場合があります。対応するコンフィグ レーション ビットの番号と機能は、各デバイスのデータシートを参照してください。 データシートはhttp://www.microchip.comで製品番号を使って検索できます。 各デバイスが備えるコンフィグレーション ビットの詳細は、MPLAB XC32 インス トール ディレクトリに保存されている以下のファイルを参照してください。
MPLAB XC32 Installation Directory/docs/PIC32ConfigSet.html
1.1.2 コンフィグレーション ビットの設定方法
MPLAB X IDE では、[Configuration Bits] ウィンドウを使ってコンフィグレーション ビットを表示/ 設定できます。このウィンドウは、メニューを Window > PIC Memory
Views > Configuration Bits と選択すると開きます。
図1: [Configuration Bits] ウィンドウ
必要な設定を済ませたら、コード内で pragma ディレクティブを挿入する位置 (main() より前 ) をクリックしてから、[Insert Source Code in Editor] アイコンを クリックします。または、[Generate Source Code to Output] をクリックした後に、
[Output]ウィンドウ内のpragmaディレクティブをコードにコピーする事もできます。
Note: コンフィグレーション ビットを正しく設定しないと、デバイスは期待通
1.2
ヘッダファイル
<xc.h>
このヘッダファイルは、ソースファイル内のコードからコンパイラ固有またはデバイ ス固有の機能を使えるようにします。xc.h とその他のヘッダファイルは、MPLAB XC32 インストール ディレクトリ内の pic32mx/include サブディレクトリに保存 されています。 ユーザが選択したデバイスに基づき、コンパイラは xc.h が適切なデバイス固有ヘッ ダファイルを指定できるようにマクロを設定します。デバイス固有ヘッダは、ユーザ コード内でインクルードしない事が必要です( コードの移植性が失われるため )。 1.3LED 値マクロの定義
LED に書き込む値は、マクロ記述 (LEDS_ON_OFF) に割り当て済みです (LED D3/D5/D7/D9 は ON、LED D4/D6/D8/D10 は OFF)。Explorer 16/32 開発ボード関連の 文書 ( 回路図を含む ) は、B.5「Explorer 16/32 開発ボードの入手先と設定方法」に 記載したリンクから入手できます。 1.4
ポートアクセス
デジタルI/O デバイスピンは周辺モジュール I/O ピンと多重化されている場合があり ます。デジタルI/O のみを使うため、多重化されている周辺モジュールは無効にしま す。これには、周辺モジュール レジスタ内のビット値を定義済みの C 変数を使いま す。これらの変数は、デバイス固有ヘッダファイル ( コンパイラ インストール ディ レクトリ内のpic32mx/include/proc,)に書かれています。 どの周辺モジュールが どのピンを共有しているかは、各デバイスのデータシートを参照してください。 「1. LED を点灯または消灯させる」サンプルコードのデバイスでは、ポート A ピンが 周辺モジュール( 既定値では無効 ) と多重化されています。また、ポート A はアナロ グI/O 機能を備えないため、全てのポート A ピンは既定値によりデジタル I/O として 動作します。ポートがアナログI/O 機能を備えている場合、ピンをデジタル I/O とし て動作させるには、ADxPCFT レジスタを使ってアナログ機能を無効にする必要があ ります。デバイスピンは、デジタルI/O ポート (PORT) またはデバイス内のラッチ (LAT) レジ スタのどちらかに接続します。このサンプルコードでは LATA を使います。変数 portValue に代入された値がラッチに代入されます。
LATA = portValue; // write to port latch
さらに、ピン方向( 入力または出力 ) を指定するために TRIS レジスタを使います。サ ンプルコードでは TRISA を使います。このレジスタ内のビットを「0」にクリアする と対応するピンは出力として設定され、「1」にセットすると入力として設定されま す。以下に例を示します。
2018 Microchip Technology Inc. DS50002509B_JP - p. 5
2. 遅延関数を使って LED を点滅させる
以下のサンプルコードでは、前のサンプルコードの一部を変更しています。このサン プルコードは LED を単純に点灯するのではなく、自動的に点滅させます。追加した コードを赤字で示しています。
// PIC32MX470F512L Configuration Bit Settings // 'C' source line config statements
// DEVCFG3
// USERID = No Setting
#pragma config FSRSSEL = PRIORITY_7 // Shadow Register Set Priority 7 #pragma config PMDL1WAY = ON // Peripheral Module - One Reconfig #pragma config IOL1WAY = ON // Peripheral Pin Select - One Reconfig #pragma config FUSBIDIO = ON // USB USID Selection - Port Function #pragma config FVBUSONIO = ON // USB VBUS ON Selection - Port Function // DEVCFG2
#pragma config FPLLIDIV = DIV_12 // PLL Input Divider - 12x #pragma config FPLLMUL = MUL_24 // PLL Multiplier - 24x
#pragma config UPLLIDIV = DIV_12 // USB PLL Input Divider - 12x #pragma config UPLLEN = OFF // USB PLL Disabled and Bypassed #pragma config FPLLODIV = DIV_256 // Sys PLL Output Divide by 256 // DEVCFG1
#pragma config FNOSC = FRCDIV // Oscillator - Fast RC Osc w/Div-by-N #pragma config FSOSCEN = ON // Secondary Oscillator Enabled
#pragma config IESO = OFF // Internal/External Switch Over Disabled #pragma config POSCMOD = OFF // Primary Oscillator Disabled
#pragma config OSCIOFNC = OFF // CLKO on OSCO Pin Disabled
#pragma config FPBDIV = DIV_8 // Peripheral Clock Divisor:Sys_Clk/8 #pragma config FCKSM = CSDCMD // Clock Switch Disable, FSCM Disabled #pragma config WDTPS = PS1048576 // WDT Postscaler 1:1048576
#pragma config WINDIS = OFF // Watchdog Timer is in Non-Window Mode #pragma config FWDTEN = OFF // WDT Disabled (SWDTEN Control)
#pragma config FWDTWINSZ = WINSZ_25 // Watchdog Timer Window 25% // DEVCFG0
#pragma config DEBUG = OFF // Background Debugger Disabled #pragma config JTAGEN = OFF // JTAG Disabled
#pragma config ICESEL = ICS_PGx2 // ICE/ICD Comm Channel PGEC2/PGED2 #pragma config PWP = OFF // Program Flash Write Protect Disabled #pragma config BWP = OFF // Boot Flash Write Protect Disabled #pragma config CP = OFF // Code Protect Disabled
// #pragma config statements should precede project file includes. // Use project enums instead of #define for ON and OFF.
#include <xc.h>
#define LEDS_ON_OFF 0x55
#define LEDS_OFF_ON 0xAA void delay (void)
{
int n = 50000; while(n>0) {n--;} }
int main(void) { // Port A access
TRISA = 0x0; // set all port bits to be output while(1) {
LATA = LEDS_ON_OFF; // write to port latch
// delay value change delay();
LATA = LEDS_OFF_ON; // write to port latch // delay value change
delay(); } return -1; } 2.1
while() ループと変数値
ループ内で最初に portValue に値を代入し、次にその相補値を代入する事で、ポー トA の LED の状態 ( 点灯 / 消灯 ) を変更します。このループは while(1) { } を使っ て実行します。正常に動作している限り、この while ループは終了しません。エラー が発生すると、main 関数は -1 を返します。 2.2delay() 関数
実行速度が速いため、LED は点滅しているように見えません。このため実行速度を遅 くする必要があります。このため、関数 delay() を main() の前で宣言および定義 し、main() コード内で2 度呼び出します。 2.1 参照 2.2 参照 Note: コンパイル時は、コードを最適化しない事が必要です ( 最適化オプショ ンは -O0 を指定)。最適化すると遅延ループは削除されます。次のサン プルコードでは、別の方法でコード実行を遅延させます。 2018 Microchip Technology Inc. DS50002509B_JP - p. 7
3. 遅延用に割り込みを使って LED を点滅させる
以下のサンプルコードでは、前のサンプルコードの一部を変更しています。前のサン プルコードでは、ループの実行を遅らせるために遅延関数を使いましたが、それに よってプログラムにデッドタイムが生じました。これを防ぐため、以下のサンプル コードではタイマ割り込みを使います。割り込みが発生するたびに変数値をインクリ メントし、この値をLED で表示します。 このサンプルコードでは、コアタイマを使います。プリスケーラ/ ポストスケーラを 設定しない場合、このタイマは2 システムクロック周期でインクリメントします ( こ の動作は全てのPIC32 MCU で一貫しています )。その他のデバイスタイマも遅延用 に使えますが、他のモジュールもそのタイマを使っている場合、注意が必要です。追 加したコードを赤字で示しています。// PIC32MX470F512L Configuration Bit Settings // 'C' source line config statements
// DEVCFG3
// USERID = No Setting
#pragma config FSRSSEL = PRIORITY_7 // Shadow Register Set Priority 7 #pragma config PMDL1WAY = ON // Peripheral Module - One Reconfig #pragma config IOL1WAY = ON // Peripheral Pin Select - One Reconfig #pragma config FUSBIDIO = ON // USB USID Selection - Port Function #pragma config FVBUSONIO = ON // USB VBUS ON Selection - Port Function // DEVCFG2
#pragma config FPLLIDIV = DIV_12 // PLL Input Divider - 12x #pragma config FPLLMUL = MUL_24 // PLL Multiplier - 24x
#pragma config UPLLIDIV = DIV_12 // USB PLL Input Divider - 12x #pragma config UPLLEN = OFF // USB PLL Disabled and Bypassed #pragma config FPLLODIV = DIV_256 // Sys PLL Output Divide by 256 // DEVCFG1
#pragma config FNOSC = FRCDIV // Oscillator - Fast RC Osc w/Div-by-N #pragma config FSOSCEN = ON // Secondary Oscillator Enabled
#pragma config IESO = OFF // Internal/External Switch Over Disabled #pragma config POSCMOD = OFF // Primary Oscillator Disabled
#pragma config OSCIOFNC = OFF // CLKO on OSCO Pin Disabled
#pragma config FPBDIV = DIV_8 // Peripheral Clock Divisor:Sys_Clk/8 #pragma config FCKSM = CSDCMD // Clock Switch Disable, FSCM Disabled #pragma config WDTPS = PS1048576 // WDT Postscaler 1:1048576
#pragma config WINDIS = OFF // Watchdog Timer is in Non-Window Mode #pragma config FWDTEN = OFF // WDT Disabled (SWDTEN Control)
#pragma config FWDTWINSZ = WINSZ_25 // Watchdog Timer Window 25% // DEVCFG0
#pragma config DEBUG = OFF // Background Debugger Disabled #pragma config JTAGEN = OFF // JTAG Disabled
#pragma config ICESEL = ICS_PGx2 // ICE/ICD Comm Channel PGEC2/PGED2 #pragma config PWP = OFF // Program Flash Write Protect Disabled #pragma config BWP = OFF // Boot Flash Write Protect Disabled #pragma config CP = OFF // Code Protect Disabled
// #pragma config statements should precede project file includes. // Use project enums instead of #define for ON and OFF.
#include <xc.h>
#include <cp0defs.h> #include <sys/attribs.h>
// CORE_TICK_RATE = FOSC/2/TOGGLES_PER_SEC
// FOSC/2 = Core timer clock frequency = 8MHz/2=4MHz // TOGGLES_PER_SEC = Toggle LED x times per second; x=5 #define CORE_TICK_RATE 800000u
// Interrupt function
void __ISR(_CORE_TIMER_VECTOR, IPL2SOFT) CTInterruptHandler(void) {
// static variable for permanent storage duration static unsigned char portValue = 0;
// variables for Compare period
unsigned long ct_count = _CP0_GET_COUNT(); unsigned long period = CORE_TICK_RATE; // write to port latch
LATA = portValue++;
// update the Compare period period += ct_count;
_CP0_SET_COMPARE(period); // clear the interrupt flag IFS0CLR = _IFS0_CTIF_MASK; }
int main(void) {
unsigned int stat_gie, cause_val;
// Disables interrupts by clearing the global interrupt enable bit // in the STATUS register.
stat_gie = __builtin_disable_interrupts();
// Port A access
TRISA = 0x0; // set all port bits to be output LATA = 0x0; // clear all bits
// Configure the core timer // clear the CP0 Count register _CP0_SET_COUNT(0);
// set up the period in the CP0 Compare register _CP0_SET_COMPARE(CORE_TICK_RATE);
// halt core timer and program at a debug breakpoint _CP0_BIC_DEBUG(_CP0_DEBUG_COUNTDM_MASK);
// Set up core timer interrupt // clear core timer interrupt flag IFS0CLR = _IFS0_CTIF_MASK;
// set core time interrupt priority of 2 IPC0CLR = _IPC0_CTIP_MASK;
IPC0SET = (2 << _IPC0_CTIP_POSITION); // set core time interrupt subpriority of 0 IPC0CLR = _IPC0_CTIS_MASK;
IPC0SET = (0 << _IPC0_CTIS_POSITION); // enable core timer interrupt
IEC0CLR = _IEC0_CTIE_MASK; IEC0SET = (1 << _IEC0_CTIE_POSITION); 3.2 参照 3.3 参照 3.4 参照
2018 Microchip Technology Inc. DS50002509B_JP - p. 9 // set the CP0 Cause register Interrupt Vector bit
cause_val = _CP0_GET_CAUSE(); cause_val |= _CP0_CAUSE_IV_MASK; _CP0_SET_CAUSE(cause_val);
// enable multi-vector interrupts INTCONSET = _INTCON_MVEC_MASK;
// enable global interrupts __builtin_enable_interrupts();
while(1); return -1; }
3.1
追加のヘッダファイル
xc.h に加えて、2 つのヘッダファイル (CP0 マクロ用の cp0defs.h と ISR マクロ用の sys/attribs.h) をインクルードする必要があります。 3.2割り込み関数
このサンプルコードでは、ISRマクロ__ISR(v,IPL) を使ってCTInterruptHandler() を割り込み関数にします(v: コアタイマの割り込みベクタ、IPL: 割り込み優先度 (2) とソフトウェアによるコンテクスト保存方法を IPL2SOFT として指定)。ISR の詳細 は、『MPLAB® XC32 C/C++ コンパイラ ユーザガイド』(DS50001686) 内の「割り込 み」を参照してください。 割り込み関数内でカウンタ portValue がインクリメントし、LED で表示されます。 割り込みをクリアするには、CP0 コンペアレジスタに値を書き込む必要があります。 その後、コンペアレジスタ内の値とコアタイマの値が比較され、次の割り込みが生成 されます。コアタイマの現在の値は _CP0_GET_COUNT() により取得します。 最終的に割り込みフラグがクリアされます。 3.3コアタイマの設定
32 ビットコアタイマは「0」に初期設定します。コンペアレジスタは、初期値 CORE_TICK_RATE に設定します。コアタイマ値がコンペアレジスタ値に達した時に 割り込みがトリガされます。 加えて、デバッグを支援するため、ブレークポイントでコアタイマが停止するよう設 定します。 コアタイマの詳細は、『PIC32 ファミリ リファレンス マニュアル、セクション 2. M4K® コア搭載デバイス用 CPU』(DS61113) を参照してください。 3.4コアタイマ割り込み
コアタイマ割り込みは以下の手順で設定します。 main コードの最初で、__builtin_disable_interrupts() を使ってグローバル割り込みを 無効にします。 while(1) ループへジャンプする前に、__builtin_enable_interrupts() を使ってグローバル割り込みを有効にします。 デバイス ヘッダファイル内のマクロを使ってコアタイマ割り込みフラグをクリアし ます(xc.h からアクセス )。 デバイスマクロを使って割り込みの優先度と副優先度を設定します。この優先度は、 割り込み関数の優先度(= 2) と一致する必要があります。 デバイスマクロを使ってコアタイマとマルチベクタ割り込みを有効にします。デバイ スマクロと CP0 マクロを使って CP0 Cause レジスタ内の割り込みベクタビットを セットします 2018 Microchip Technology Inc. DS50002509B_JP - p. 11
4. ADC を使ってポテンショメータの値を LED で表示する (MPLAB Harmony を使用 )
このサンプルコードは、3.「遅延用に割り込みを使って LED を点滅させる」と同じ
デバイスとポート A LED を使います。ただし、このサンプルコードでは、デモボー ド上のポテンショメータからの値をポートB (RB2/AN2) 経由でアナログ / デジタル コ ンバータ(ADC) に入力し、その変換結果を LED で表示します。
また、コードは手書きではなく MPLAB Harmony を使って生成します。MPLAB Harmony 統合ソフトウェア フレームワークは以下からダウンロードできます。 http://www.microchip.com/mplab/mplab-harmony
MPLAB Harmony Configurator (MHC) は、MPLAB Harmony の GUI をセットアップす るための MPLAB X IDE プラグインです。このプラグインは、MPLAB X IDE の
[Available Plugins] タブ (Tools > Plugins で開く ) を使ってインストールできます。
プラグインのインストール方法はMPLAB X IDE のヘルプを参照してください。 このサンプルコードは、adc_pot サンプルコードに基づきます。Windows®PC の場
合、このコードは以下に格納されています:
C:\microchip\harmony\v1_10\apps\examples\peripheral\adc\adc_pot
4.1
MPLAB X IDE 内で MPLAB Harmony プロジェクトを作成する
以下のダイアログにより、このサンプルコード向けにMPLAB Harmony プロジェクト を設定します。
MPLAB X IDE で、メニューから File > New Project を選択します。
[Harmony Path] が MPLAB Harmony の実際のインストール先を指している事を確認 します。
2018 Microchip Technology Inc. DS50002509B_JP - p. 13 4.2
MPLAB Harmony プロジェクトの設定
プロジェクトの設定に従い、MHC は実装済みクロックの情報を表示します。青でハ イライト表示されたテキストは変更を示します。このサンプルコードでは、クロック 設定を一切変更しません。
ADC ドライバを図6の通りに設定し、BSP (Board Support Packages) を図7の通り に設定します。
図4: MPLAB Harmony プロジェクトと MHC
図6: Harmony フレームワークの設定 - ADC ドライバ
2018 Microchip Technology Inc. DS50002509B_JP - p. 15
4.3
コードを生成してアプリケーション
ファイルを編集する
以上の図の通りにMHC を設定した後に、[MPLAB Harmony Configurator] タブ上の
[Generate Code] ボタンをクリックします。
設定を保存し(図9参照)、プロジェクト コードを生成します (図10参照)。 図9: 設定の保存
2018 Microchip Technology Inc. DS50002509B_JP - p. 17 図11に示す通り、MPLAB Harmony が生成するコードはモジュール化されています。 アプリケーション ファイル (app.h と app.c) は、本サンプルコード向けに編集しま す。 フラッシュメモリの使い方の詳細は、『PIC32 ファミリ リファレンス マニュアル、セ クション 17. 10 ビットアナログ / デジタルコンバータ (ADC)』 (DS61104) を参照して ください。 図11: MHC が生成したコードの ADC プロジェクト ツリー
4.4
編集後の app.h コード
編集後の app.h テンプレート ファイルを以下に示します。一部のコメントは省略し ました( 省略箇所には < > で囲んだ注釈を記入しています )。追加したコードを赤字 で示しています。
/******************************************************************** MPLAB Harmony Application Header File
<See generated app.h file for file information.>
********************************************************************/ //DOM-IGNORE-BEGIN
/******************************************************************** Copyright (c) 2013-2014 released Microchip Technology Inc. All rights reserved.
<See generated app.h file for copyright information.>
********************************************************************/ //DOM-IGNORE-END #ifndef _APP_H #define _APP_H #define ADC_NUM_SAMPLE_PER_AVERAGE 16 // ****************************************************************** // ****************************************************************** // Section:Included Files // ****************************************************************** // ****************************************************************** #include <stdint.h> #include <stdbool.h> #include <stddef.h> #include <stdlib.h> #include "system_config.h" #include "system_definitions.h" // DOM-IGNORE-BEGIN
#ifdef __cplusplus // Provide C++ Compatibility extern "C" { #endif // DOM-IGNORE-END // ****************************************************************** // ****************************************************************** // Section:Type Definitions // ****************************************************************** // ****************************************************************** // ****************************************************************** /* Application states Summary:
Application states enumeration Description:
2018 Microchip Technology Inc. DS50002509B_JP - p. 19
This enumeration defines the valid application states.These
states determine the behavior of the application at various times. */
typedef enum {
/* Application's state machine's initial state.*/ APP_STATE_INIT=0, APP_ADC_WAIT, APP_ADC_DISPLAY } APP_STATES; // ****************************************************************** /* Application Data Summary:
Holds application data Description:
This structure holds the application's data. Remarks:
Application strings and buffers are be defined outside this structure.
*/
typedef struct {
/* The application's current state */ APP_STATES state;
/* Values for the conversions */ int potValue;
int ledMask;
} APP_DATA;
// ****************************************************************** // ****************************************************************** // Section:Application Callback Routines
// ****************************************************************** // ****************************************************************** /* These routines are called by drivers when certain events occur. */
// ****************************************************************** // ****************************************************************** // Section:Application Initialization and State Machine Functions // ****************************************************************** // ****************************************************************** /******************************************************************** Function:
void APP_Initialize ( void ) Summary:
MPLAB Harmony application initialization routine. <See generated app.h file for app init information.>
*/
void APP_Initialize ( void );
/******************************************************************** Function:
void APP_Tasks ( void ) Summary:
MPLAB Harmony Demo application tasks function <See generated app.h file for app tasks information.> */
void APP_Tasks( void ); #endif /* _APP_H */ //DOM-IGNORE-BEGIN #ifdef __cplusplus } #endif //DOM-IGNORE-END /******************************************************************** End of File */
2018 Microchip Technology Inc. DS50002509B_JP - p. 21 4.5
編集後の app.c コード
編集後の app.c テンプレート ファイルを以下に示します。一部のコメントは省略し ました( 省略箇所には < > で囲んだ注釈を記入しています )。追加したコードを赤字 で示しています。 一部の長いコード行は次のページにまたがっています。これは、本書のコードをその ままエディタへカット& ペーストできるように配慮したためです。 /******************************************************************** MPLAB Harmony Application Source File
<See generated app.c file for file information.>
********************************************************************/ // DOM-IGNORE-BEGIN
/******************************************************************** Copyright (c) 2013-2014 released Microchip Technology Inc. All rights reserved.
<See generated app.c file for copyright information.>
********************************************************************/ // DOM-IGNORE-END // ****************************************************************** // ****************************************************************** // Section:Included Files // ****************************************************************** // ****************************************************************** #include "app.h" // ****************************************************************** // ****************************************************************** // Section:Global Data Definitions
// ****************************************************************** // ****************************************************************** // ****************************************************************** /* Application Data
Summary:
Holds application data Description:
This structure holds the application's data. Remarks:
This structure should be initialized by the APP_Initialize function.
Application strings and buffers are be defined outside this structure.
*/
APP_DATA appData;
// ****************************************************************** // ****************************************************************** // Section:Application Callback Functions
// ****************************************************************** // ****************************************************************** /* TODO:Add any necessary callback functions.
*/
// ****************************************************************** // ****************************************************************** // Section:Application Local Functions
// ****************************************************************** // ******************************************************************
/******************************************************************** Function:
void Set_LED_Status ( void ) Description:
Set LEDs to display the ADC average result. */ void Set_LED_Status(void) { int i; appData.ledMask = 0;
/* Creates a mask for the LEDs, corresponding to the value read * from the potentiometer */
appData.potValue >>= 7; /* 10-bit value to 3-bit value */ for (i = 0; i <= appData.potValue; i++)
{
appData.ledMask |= 1<<(i); }
/* Write the mask to the LEDs */
SYS_PORTS_Write( PORTS_ID_0, PORT_CHANNEL_A, (PORTS_DATA_MASK)appData.ledMask ); }
// ****************************************************************** // ****************************************************************** // Section:Application Initialization and State Machine Functions // ****************************************************************** // ****************************************************************** /******************************************************************** Function:
void APP_Initialize ( void ) Remarks:
See prototype in app.h. */
void APP_Initialize ( void ) {
/* Place the App state machine in its initial state.*/ appData.state = APP_STATE_INIT;
/* TODO:Initialize your application's state machine and other * parameters.
2018 Microchip Technology Inc. DS50002509B_JP - p. 23
*/ }
/******************************************************************** Function:
void APP_Tasks ( void ) Remarks:
See prototype in app.h. */
void APP_Tasks ( void ) {
/* Check the application's current state.*/ switch ( appData.state )
{
/* Application's initial state.*/ case APP_STATE_INIT: { /* Enable ADC */ DRV_ADC_Open(); appData.state = APP_ADC_WAIT; break; }
/* Display pot value on LEDs*/ case APP_ADC_DISPLAY: { Set_LED_Status(); appData.state = APP_ADC_WAIT; break; }
/* Wait for ADC */ case APP_ADC_WAIT: {
/* Wait for conversion*/
if (DRV_ADC_SamplesAvailable()) { int i; //Read data for(i=0;i<ADC_NUM_SAMPLE_PER_AVERAGE;i++) appData.potValue += PLIB_ADC_ResultGetByIndex(ADC_ID_1, i); appData.potValue = appData.potValue / ADC_NUM_SAMPLE_PER_AVERAGE; appData.state = APP_ADC_DISPLAY; } break; }
/* The default state should never be executed.*/ default:
4.6 参照
4.7 参照
{
/* TODO:Handle error in application's state machine.*/ break; } } } /******************************************************************** End of File */ 4.6
アプリケーション
ステート - APP_STATE_INIT
タスクループの開始時にアプリケーションは初期ステートです。この場合、ADC は 自動サンプリング モードで有効になります。次に、アプリケーションは待機ステート (APP_ADC_WAIT) に移行します。アプリケーション ステートは app.h 内で定義され ます。 4.7アプリケーション
ステート - APP_ADC_DISPLAY
APP_ADC_WAIT 中にADC 値がキャプチャされると、Application Local Functions セク ション内で関数 Set_LED_Status() を呼び出す事によって、その値を表示します。 この関数は、マスク(appData.ledMask) を使って、ポテンショメータからの ADC 値(appData.potValue) を LED に表示します。これらの変数は、app.h 内で定義 されます。 この関数が戻ると、アプリケーション ステートは APP_ADC_WAIT に戻り、次のサン プルを待機します。 4.8
アプリケーション
ステート - APP_ADC_WAIT
初期化(APP_STATE_INIT) 後に、アプリケーションはポテンショメータ値が変換されるまで 待機します。ADC値が変数appData.potValueに代入されると、ステートAPP_ADC_DISPLAY でその値がLED に表示されます。ADC_NUM_SAMPLE_PER_AVERAGE は app.h 内で 定義されます。 2018 Microchip Technology Inc. DS50002509B_JP - p. 25
5. ADC を使ってポテンショメータの値を LED で表示する (MCC を使用 )
このサンプルコードは、3.「遅延用に割り込みを使って LED を点滅させる」と同じ デバイスとポート A LED を使います。ただし、このサンプルコードでは、デモボー ド上のポテンショメータからの値をポートB (RB2/AN2) 経由でアナログ / デジタル コ ンバータ(ADC) に入力し、その変換結果を LED で表示します。コードは手書きではなくMPLAB Code Configurator (MCC)を使って生成します。MCC プラグインは、MPLAB X IDE の [Available Plugins] タブ (Tools > Plugins で開く ) を 使ってインストールできます。プラグインのインストール方法はMPLAB X IDE のヘ ルプを参照してください。
MCC のインストール情報と『MPLAB® Code Configurator ユーザガイド』(DS40001725)
は、以下のMPLAB Code Configurator ウェブページで入手できます。 http://www.microchip.com/mplab/mplab-code-configurator
このサンプルコードを生成するために使ったMCC の設定を以下の図に示します。 図12: ADC プロジェクト - リソース - システム モジュール
2018 Microchip Technology Inc. DS50002509B_JP - p. 27
2018 Microchip Technology Inc. DS50002509B_JP - p. 29
図16: ADC プロジェクト - ADC1 - Easy Setup
図17: ADC プロジェクト - ADC1 - ピンリソース
図18: ADC プロジェクト - リソース - ピンモジュール
図19: ADC プロジェクト - ピンモジュール - Easy Setup
図20でピンRA0:7 が選択されている場合、これらのピンは上図のウィンドウに表示されます。 RB2 は図17で選択済みです。
RB6 と RB7 は、図13でPGEC2/PGED2 向けに選択済みです。
2018 Microchip Technology Inc. DS50002509B_JP - p. 31
以上のようにコードを設定した後に、[Project Resources] ウィンドウの [Generate] ボタンをクリックします ( 図 12)。MCC はモジュール形式のコードを生成します。 従って main、システム、周辺モジュールコードは全て別々のファイルとして生成さ れます。各周辺モジュールのヘッダファイルも別々です。 潜在的なエラーを捉えるために割り込みマネージャ ファイルが生成されます。このア プリケーションでは割り込みは使いませんが、将来用に割り込みマネージャ ファイル が生成されます。 プログラムに機能を追加する場合、必ず main.c を編集する必要があります。また、 そのコードに必要な全ての関数またはマクロが生成されたファイル内に含まれてい るかどうか確認する必要があります。 フラッシュメモリの使い方の詳細は、『PIC32 ファミリ リファレンス マニュアル、セ クション 17. 10 ビットアナログ / デジタルコンバータ (ADC)』 (DS61104) を参照して ください。 図21: MCC が生成したコードの ADC プロジェクト ツリー
2018 Microchip Technology Inc. DS50002509B_JP - p. 33 5.1
編集後の main.c コード
編集後の main.c テンプレート ファイルを以下に示します。一部のコメントは省略 しました( 省略箇所には < > で囲んだ注釈を記入しています )。main() に追加した コードを赤字で示しています。 /**Generated Main Source File
<See generated main.c file for file information.> */
/*
(c) 2016 Microchip Technology Inc. and its subsidiaries.You may use this software and any derivatives exclusively with Microchip products. <See generated main.c file for additional copyright information.> */
#include "mcc_generated_files/mcc.h"
unsigned int value = 0;
/* Creates a mask for the LEDs, corresponding * to the value read from the potentiometer */ unsigned int Mask_Value(unsigned int pot_value){ int i;
unsigned int mask_value = 0;
pot_value >>= 7; /* 10-bit value to 3-bit value */ for (i = 0; i <= pot_value; i++)
{ mask_value |= 1<<(i); } return mask_value; } /* Main application */ int main(void) {
// initialize the device SYSTEM_Initialize(); while (1) {
// Wait for conversion // and then get result
while(!ADC1_IsConversionComplete()); value = ADC1_ConversionResultGet(); // Mark value value = Mask_Value(value);
// Write to Port Latch/LEDs LATA = value; } return -1; } 5.2 参照 5.3 参照 5.4 参照
/** End of File */ 5.2
ADC 変換および結果
MCC は AD1CON1 レジスタ内のビットを次の通りに設定します : ADC を有効にする、 自動サンプリングを使う、内部カウンタを使ってサンプリングを終了/ 変換を開始す る。従って、main() コードは変換の終了を待機し、結果を取得するだけで済みます。 adc1.c モジュールから以下の関数を使います。 bool ADC1_IsConversionComplete(void) uint16_t ADC1_ConversionResultGet(void) その他のADC 機能の設定の詳細は『PIC32 ファミリ リファレンス マニュアル、セク ション 17. 10 ビットアナログ / デジタルコンバータ (ADC)』 (DS61104) を参照してく ださい。 5.3ADC 変換結果のマスク
ADC 変換結果は 10 ビットであるのに対し LED は 8 個しかないため、関数 Mask_Value() を使って変数 value 内の変換結果をマスクする事により、最上位の 3 ビットだけを 3 個の LED で表示します。。 5.4ポートラッチと
LED への書き込み
マスクしたADC 変換結果は、ポート A の LED で表示します。 2018 Microchip Technology Inc. DS50002509B_JP - p. 35
6. フラッシュメモリへの書き込みステータスを LED で表示する (MPLAB Harmony を使用 )
このサンプルコードは、4.「ADC を使ってポテンショメータの値を LED で表示する (MPLAB Harmony を使用 )」と同じデバイスとポート A LED を使います。ただし、
このサンプルコードでは、フラッシュ( 不揮発性 ) メモリに対して値を読み書きし、 それが成功した時にLED2 を点灯させ、失敗した時に LED0 を点灯させます。 コードは手書きではなくMPLAB Harmony を使って生成します。MPLAB Harmony 統 合ソフトウェア フレームワークと MPLAB Harmony Configurator (MHC) MPLAB X IDE プラグインのダウンロード / インストール方法は、4.「ADC を使ってポテンショ メータの値をLED で表示する (MPLAB Harmony を使用 )」を参照してください。
MPLAB X IDE における MPLAB Harmony プロジェクトの作成方法については、4.1 「MPLAB X IDE 内で MPLAB Harmony プロジェクトを作成する」を参照してくださ
い。以下のサンプルコードのプロジェクト名は「Expample6」です。
このサンプルコードは、以下の場所にあるフラッシュ ドライバ アプリケーションに 基づきます(Windows OS の場合 ):
C:\microchip\harmony\v1_10\apps\examples\peripheral\flash\flash_modify
6.1
MPLAB Harmony プロジェクトの設定
プロジェクトの設定に従い、MPLAB Harmony Configurator (MHC) は実装済みクロッ クの情報を表示します。青のハイライトは変更を示します。このサンプルコードでは、 クロック設定を一切変更しません。
フラッシュドライバを図22の通りに設定し、BSP (Board Support Packages) を図23 の通りに設定します。
2018 Microchip Technology Inc. DS50002509B_JP - p. 37 6.2
コードを生成してアプリケーション
ファイルを編集する
以上の図の通りにMHC を設定した後に、[MPLAB Harmony Configurator] タブ上の
[Generate Code] ボタンをクリックします。 設定を保存し、プロジェクト コードを生成します (4.3「コードを生成してアプリケー ション ファイルを編集する」参照 )。 図24に示す通り、MPLAB Harmony が生成するコードはモジュール化されています。 アプリケーション ファイル (app.h と app.c) は、本サンプルコード向けに編集しま す。 フラッシュメモリの使い方の詳細は、『PIC32 ファミリ リファレンス マニュアル、セ クション 5. 10 ビットアナログ / デジタルコンバータ (ADC)』(DS60001121) を参照 してください。 図24: MHC が生成したコードのフラッシュ プロジェクト ツリー
6.3
編集後の app.h コード
編集後の app.h テンプレート ファイルを以下に示します。一部のコメントは省略し ました( 省略箇所には < > で囲んだ注釈を記入しています )。追加したコードを赤字 で示しています。
/******************************************************************** MPLAB Harmony Application Header File
<See generated app.h file for file information.>
********************************************************************/ //DOM-IGNORE-BEGIN
/******************************************************************** Copyright (c) 2013-2014 released Microchip Technology Inc. All rights reserved.
<See generated app.h file for copyright information.>
*******************************************************************/ //DOM-IGNORE-END
#ifndef _APP_H #define _APP_H
#define USERLED_SUCCESS LED_2 //D5 on Explorer 16/32 #define USERLED_ERROR LED_0 //D3 on Explorer 16/32
// ****************************************************************** // ****************************************************************** // Section:Included Files // ****************************************************************** // ****************************************************************** #include <stdint.h> #include <stdbool.h> #include <stddef.h> #include <stdlib.h> #include "system_config.h" #include "system_definitions.h" // DOM-IGNORE-BEGIN
#ifdef __cplusplus // Provide C++ Compatibility extern "C" { #endif // DOM-IGNORE-END // ****************************************************************** // ****************************************************************** // Section:Type Definitions // ****************************************************************** // ******************************************************************
#define APP_DATABUFF_SIZE (sizeof(databuff) / sizeof(uint32_t))
/* Row size for device is 2Kbytes */
#define APP_DEVICE_ROW_SIZE_DIVIDED_BY_4 (DRV_FLASH_ROW_SIZE/4)
2018 Microchip Technology Inc. DS50002509B_JP - p. 39 /* Page size for device is 16Kbytes */
#define APP_DEVICE_PAGE_SIZE_DIVIDED_BY_4 (DRV_FLASH_PAGE_SIZE/4)
#define APP_PROGRAM_FLASH_BASE_ADDRESS_VALUE (unsigned int) 0x9D008000
#define APP_PROGRAM_FLASH_BASE_ADDRESS (unsigned int *) APP_PROGRAM_FLASH_BASE_ADDRESS_VALUE
// ****************************************************************** /* Application states
Summary:
Application states enumeration Description:
This enumeration defines the valid application states.These states determine the behavior of the application at various times.
*/
typedef enum {
/* Application's state machine's initial state.*/ APP_STATE_INIT=0, APP_STATE_NVM_FILL_DATABUF_AND_ERASE_STATE, APP_STATE_NVM_ERASE_COMPLETION_CHECK, APP_STATE_NVM_WRITE_START, APP_STATE_NVM_WRITE_COMPLETION_CHECK_AND_VERIFY_CHECK, APP_STATE_NVM_ERROR_STATE, APP_STATE_NVM_SUCCESS_STATE, } APP_STATES; // ****************************************************************** /* Application Data Summary:
Holds application data Description:
This structure holds the application's data. Remarks:
Application strings and buffers are be defined outside this structure.
*/
typedef struct {
/* The application's current state */ APP_STATES state;
DRV_HANDLE flashHandle;
} APP_DATA;
// ****************************************************************** // ******************************************************************
// Section:Application Callback Routines
// ****************************************************************** // ****************************************************************** /* These routines are called by drivers when certain events occur. */
// ****************************************************************** // ****************************************************************** // Section:Application Initialization and State Machine Functions // ****************************************************************** // ****************************************************************** /******************************************************************** Function:
void APP_Initialize ( void ) Summary:
MPLAB Harmony application initialization routine. <See generated app.h file for app init information.> */
void APP_Initialize ( void );
/******************************************************************** Function:
void APP_Tasks ( void ) Summary:
MPLAB Harmony Demo application tasks function <See generated app.h file for app tasks information.> */
void APP_Tasks( void );
#endif /* _APP_H */ //DOM-IGNORE-BEGIN #ifdef __cplusplus } #endif //DOM-IGNORE-END /******************************************************************** End of File */
2018 Microchip Technology Inc. DS50002509B_JP - p. 41 6.4
編集後の app.c コード
編集後の app.c テンプレート ファイルを以下に示します。一部のコメントは省略し ました( 省略箇所には < > で囲んだ注釈を記入しています )。追加したコードを赤字 で示しています。 一部の長いコード行は次のページにまたがっています。これは、本書のコードをその ままエディタへカット& ペーストできるように配慮したためです。 /******************************************************************** MPLAB Harmony Application Source File<See generated app.c file for file information.>
*******************************************************************/ // DOM-IGNORE-BEGIN
/******************************************************************** Copyright (c) 2013-2014 released Microchip Technology Inc. All rights reserved.
<See generated app.c file for copyright information.>
*******************************************************************/ // DOM-IGNORE-END // ****************************************************************** // ****************************************************************** // Section:Included Files // ****************************************************************** // ****************************************************************** #include "app.h" // ****************************************************************** // ****************************************************************** // Section:Global Data Definitions
// ****************************************************************** // ******************************************************************
/***************************************************** * Initialize the application data structure.All * application related variables are stored in this * data structure.
*****************************************************/ /* Array in the KSEG1 RAM to store the data */
uint32_t databuff[APP_DEVICE_ROW_SIZE_DIVIDED_BY_4] __attribute__((coherent, aligned(16)));
// ****************************************************************** /* Application Data
Summary:
Holds application data Description:
This structure holds the application's data. Remarks:
This structure should be initialized by the APP_Initialize function.
Application strings and buffers are be defined outside this structure.
*/
APP_DATA appData;
// ****************************************************************** // ****************************************************************** // Section:Application Callback Functions
// ****************************************************************** // ****************************************************************** /* TODO:Add any necessary callback functions.
*/
// ****************************************************************** // ****************************************************************** // Section:Application Local Functions
// ****************************************************************** // ******************************************************************
/* TODO:Add any necessary local functions. */
// ****************************************************************** // ****************************************************************** // Section:Application Initialization and State Machine Functions // ****************************************************************** // ****************************************************************** /******************************************************************** Function:
void APP_Initialize ( void ) Remarks:
See prototype in app.h. */
void APP_Initialize ( void ) {
/* Place the App state machine in its initial state.*/ appData.state = APP_STATE_INIT;
/* TODO:Initialize your application's state machine and other * parameters.
*/ }
/******************************************************************** Function:
void APP_Tasks ( void ) Remarks:
2018 Microchip Technology Inc. DS50002509B_JP - p. 43
See prototype in app.h. */
void APP_Tasks ( void ) {
unsigned int x;
/* Check the application's current state.*/ switch ( appData.state )
{
/* Application's initial state.*/ case APP_STATE_INIT:
appData.flashHandle = DRV_FLASH_Open(DRV_FLASH_INDEX_0, intent);
appData.state = APP_STATE_NVM_FILL_DATABUF_AND_ERASE_STATE; break;
/* Fill data buffer, clear LEDs, * and begin erase page */
case APP_STATE_NVM_FILL_DATABUF_AND_ERASE_STATE: for (x = 0; x < APP_DATABUFF_SIZE; x++) { databuff[x] = x; } BSP_LEDOff(USERLED_SUCCESS); BSP_LEDOff(USERLED_ERROR);
/* Erase the page which consist of the row to be written */ DRV_FLASH_ErasePage(appData.flashHandle,
APP_PROGRAM_FLASH_BASE_ADDRESS_VALUE);
appData.state = APP_STATE_NVM_ERASE_COMPLETION_CHECK; break;
/* Check for erase complete */
case APP_STATE_NVM_ERASE_COMPLETION_CHECK: if(!DRV_FLASH_IsBusy(appData.flashHandle)) { appData.state = APP_STATE_NVM_WRITE_START; } break;
/* Write row of Flash */ case APP_STATE_NVM_WRITE_START: /* Erase Success */
/* Write a row of data to PROGRAM_FLASH_BASE_ADDRESS, * using databuff array as the source */
DRV_FLASH_WriteRow(appData.flashHandle,
APP_PROGRAM_FLASH_BASE_ADDRESS_VALUE, databuff); appData.state =
APP_STATE_NVM_WRITE_COMPLETION_CHECK_AND_VERIFY_CHECK; break;
/* Check for write complete * and verify write operation */
case APP_STATE_NVM_WRITE_COMPLETION_CHECK_AND_VERIFY_CHECK: if(!DRV_FLASH_IsBusy(appData.flashHandle))
{
/* Verify that data written to flash memory is valid * (databuff array read from kseg1) */
if (!memcmp(databuff, (void *)KVA0_TO_KVA1(APP_PROGRAM_FLASH_BASE_ADDRESS), 6.5 参照 6.6 参照 6.7 参照 6.8 参照 6.9 参照
sizeof(databuff))) { appData.state = APP_STATE_NVM_SUCCESS_STATE; } else { appData.state = APP_STATE_NVM_ERROR_STATE; } } break; /* Write Failure */ case APP_STATE_NVM_ERROR_STATE: /*stay here, nvm had a failure*/ BSP_LEDOn(USERLED_ERROR); BSP_LEDOff(USERLED_SUCCESS); break; /* Write Success */ case APP_STATE_NVM_SUCCESS_STATE: BSP_LEDOn(USERLED_SUCCESS); BSP_LEDOff(USERLED_ERROR); break; } } /******************************************************************** End of File */ 6.5
アプリケーション
ステート - 初期ステート
タスクループの開始時にアプリケーションは初期ステート(APP_STATE_INIT) です。 このステートではフラッシュ ドライバが初期化され、アプリケーションは次のステー ト (APP_STATE_NVM_FILL_DATABUF_AND_ERASE_STATE) に移行します。アプリ ケーション ステートは app.h 内で定義されます。 6.6アプリケーション
ステート - データバッファの書き込みとページ消去
初期化が完了すると、書き込みの準備を実行します。最初に、フラッシュメモリに書 き込むデータをデータバッファに書き込みます( データバッファは、「Section: Global Data Definitions」内で定義されます )。次に、動作の成功 / 失敗を示す LED をクリア します( これらの値は app.h 内で設定されます )。その後、フラッシュメモリ (NVM) ページの消去を開始します。最後に、アプリケーションはページ消去の完了を待機す るためのステート(APP_STATE_NVM_ERASE_COMPLETION_CHECK) に移行します。 6.7アプリケーション
ステート - ページ消去の完了
このステートは、前のステートで開始したページ消去が完了するまで待機します。 ページ消去が完了すると、アプリケーションはフラッシュメモリ (NVM) への書き込 みを開始するためのステート(APP_STATE_NVM_WRITE_START) に移行します。 6.8アプリケーション
ステート フラッシュメモリの行書き込み
フラッシュメモリ内の消去済みページへの行書き込みを開始します。この行には、データバッ ファ内の値を書き込みます。その後、アプリケーション ステートは書き込みの終了と検証の ためのステート(APP_STATE_NVM_WRITE_COMPLETION_CHECK_AND_VERIFY_CHECK)に移行 します。 6.10 参照 6.11 参照 2018 Microchip Technology Inc. DS50002509B_JP - p. 45 6.9
アプリケーション
ステート 行書き込みの完了と検証
このステートは、前のステートで開始した行書き込みが完了するまで待機します。完了 すると、書き込んだ値とデータバッファ内の値を照合します。書き込みが成功していた 場合、アプリケーション ステートは APP_STATE_NVM_SUCCESS_STATE に移行します。 失敗していた場合、アプリケーション ステートは APP_STATE_NVM_ERROR_STATE に移 行します。 6.10アプリケーション
ステート - エラーステート
フラッシュメモリの書き込みに失敗した場合、エラーステートに移行します。デモ ボード上のLED 3 (D3) を点灯させる事でエラーの発生を示します。 6.11アプリケーション
ステート - 成功ステート
フラッシュメモリの消去/ 書き込みに成功した場合、成功ステートに移行します。デ モボード上のLED 5 (D5) を点灯させる事でアプリケーションの実行が成功した事を 示します。7. フラッシュメモリの値を LED で表示する (MCC を使用 )
このサンプルコードは、5.「ADC を使ってポテンショメータの値を LED で表示する (MCC を使用 )」と同じデバイスとポート A LED を使います。ただし、このサンプル
コードでは、フラッシュ( 不揮発性 ) メモリに対して値を読み書きし、それが成功し た時にLED2 を点灯させ、失敗した時に LED0 を点灯させます。
コードの一部はMPLAB Code Configurator (MCC) で生成します。MCC のインストー ル方法とユーザガイドの入手方法は、5.「ADC を使ってポテンショメータの値を LED
で表示する(MCC を使用 )」を参照してください。
このサンプルコードを生成するために使ったMCC の設定を以下の図に示します。 図25: フラッシュ プロジェクト - リソース - システム モジュール
2018 Microchip Technology Inc. DS50002509B_JP - p. 47
2018 Microchip Technology Inc. DS50002509B_JP - p. 49
2018 Microchip Technology Inc. DS50002509B_JP - p. 51 図30: フラッシュ プロジェクト - リソース - ピンモジュール 図31: フラッシュ プロジェクト -I/O ピン設定 図32: フラッシュ プロジェクト - I/O ピンリソース 図32でピンRA0 と RA2 が選択されている場合、これらのピンは上図のウィンドウに表示されます。 RB6 と RB7 は、図26で PGEC2/PGED2 向けに選択済みです。 ウィンドウ内にピン設定が表示されたら、各ピンに対してピン設定を表示および選択できます。
以上のようにコードを設定した後に、[Project Resources] ウィンドウの [Generate] ボタンをクリックします ( 図 12)。MCC はモジュール形式でコードを生成します。 従って main、システム、周辺モジュールコードは全て別々のファイルとして生成さ れます。各周辺モジュールのヘッダファイルも別々です。 潜在的なエラーを捉えるために割り込みマネージャ ファイルが生成されます。このア プリケーションでは割り込みは使いませんが、将来用に割り込みマネージャ ファイル が生成されます。 プログラムに機能を追加する場合、必ず main.c を編集する必要があります。また、 そのコードに必要な全ての関数またはマクロが生成されたファイル内に含まれてい るかどうか確認する必要があります。 フラッシュメモリの使い方の詳細は、『PIC32 ファミリ リファレンス マニュアル、セ クション 5. 10 ビットアナログ / デジタルコンバータ (ADC)』(DS60001121) を参照 してください。 図33: MCC が生成したコードのフラッシュ プロジェクト ツリー
2018 Microchip Technology Inc. DS50002509B_JP - p. 53 7.1
編集後の main.c コード
編集後の main.c テンプレート ファイルを以下に示します。一部のコメントは省略 しました( 省略箇所には < > で囲んだ注釈を記入しています )。追加済みコードは赤 字で示しています。 /**Generated Main Source File
<See generated main.c for file information.> */
/*
(c) 2016 Microchip Technology Inc. and its subsidiaries.You may use this software and any derivatives exclusively with Microchip products. <See generated main.c for additional copyright information.>
*/
#include "mcc_generated_files/mcc.h"
// Program Flash Physical Addresses:0x1D00_0000?0x1D07_FFFF // Program Flash Virtual Addresses:KSEG0:0x9D00_0000?0x9D07_FFFF // KSEG1:0xBD00_0000?0xBD07_FFFF #define NVM_PROGRAM_PAGE 0xbd008000
unsigned int databuff[128];
/*
Main application */
int main(void) {
unsigned int x;
// initialize the device SYSTEM_Initialize();
// Fill databuff with some data for(x =0; x < sizeof(databuff); x++)
databuff[x] = x;
// Erase second page of Program Flash NVM_ErasePage((void *)NVM_PROGRAM_PAGE); // Write 128 words starting at
// Row Address NVM_PROGRAM_PAGE
NVM_WriteRow((void *)NVM_PROGRAM_PAGE, (void*)databuff); // Verify data matches
if(memcmp(databuff, (void *)NVM_PROGRAM_PAGE, sizeof(databuff))) {
// If not turn led0 on to indicate an error IO_RA0_SetHigh();
} else {
// If true turn led2 on to indicate success IO_RA2_SetHigh();
}
7.2 参照 7.3 参照
while (1) { // End of program } return -1; } /** End of File */ 7.2
フラッシュメモリのページ消去
フラッシュメモリの消去可能な最小領域は1 ページです。 これには nvm.c ファイル内の NVM_ErasePage() 関数を使います。 7.3フラッシュメモリの行書き込み
データバッファの内容は、フラッシュメモリ内の1 行に書き込みます。 これには nvm.c ファイル内の NVM_WriteRow() 関数を使います。 7.4書き込みの検証と
LED でのデータ表示
フラッシュメモリに書き込まれたデータとデータバッファの内容を比較します。両者 が一致しない場合、LED0/D3 を点灯させてエラーが発生した事を示します。一致す る場合、LED2/D5 を点灯させて書き込みが成功した事を示します。 2018 Microchip Technology Inc. DS50002509B_JP - p. 55
補遺
A.
MPLAB X IDE 内でのコード実行
サンプルコード1、2、3 のプロジェクトの作成手順は以下の通りです。 1. MPLAB X IDE を起動します。
2. IDE から [New Project] ウィザードを起動します (File > New Project)。 3. 画面の指示に従って以下の手順で新しいプロジェクトを作成します。 a) プロジェクトの選択 : 「Microchip Embedded」を選択し、次に「Standalone Project」を選択します。 b) デバイスの選択 : サンプルコードのデバイスを選択します。 c) ヘッダの選択 : 何も選択しません。 d) ツールの選択: 使用するハードウェア デバッグツールのシリアル番号(SNxxxxxx) を選択します。デバッグツール名の下にシリアル番号(SN) が表示されない場 合、そのデバッグツールが正しくインストールされているか確認します。詳 細はデバッグツールのマニュアルを参照してください。 e) プラグインボードの選択 : 何も選択しません。 f) コンパイラの選択: XC32 ( 最新バージョン番号 ) を選択します ([bin location])。 XC32 の下にコンパイラが表示されない場合、コンパイラが正しくインストー ルされているか、およびMPLAB X IDE がコンパイラを検出できているかを 確認します。Tools > Options を選択し、[Build Tools] タブの [Embedded] ボ
タンをクリックして使用中のコンパイラを確認します。詳細はMPLAB XC32 とMPLAB X IDE のマニュアルを参照してください。
g) プロジェクト名とフォルダの選択 : プロジェクト名を指定します。
4. [Projects] ウィンドウ内でプロジェクト名を右クリックし、New > Empty FIle を 選択します。[New Empty File] ダイアログが開きます。
5. 「File name」に名前を入力します。 6. [Finish] をクリックします。 7. 本書のサンプルコードを空白のエディタ ウィンドウにコピー / ペーストし、File > Save を選択します。 サンプルコード 4 および 6 のプロジェクトの作成手順は、4.1「MPLAB X IDE 内で MPLAB Harmony プロジェクトを作成する」に記載した通りです。プロジェクトを 作成した後、MHC を設定してコードを生成し、本書に記載した通りに編集します。 サンプルコード 5 および 7 の場合、上記のステップ 1 ~ 3 を実行します。その後、 MCC を設定してコードを生成し、本書に記載した通りに編集します。 最後に[Debug Run] を選択します。これによりコードをビルドしてデバイスにダウン ロードし、実行します。そしてコードの出力を LED で確認します。実行を終了する には[Halt] をクリックします。 図34: ツールバー アイコン