このドキュメントでは、KDS 2.0.0 と最新バージョンの KSDK 1.1.0 で低電力デモ アプリケーション (FRDM-KL03Z ボード上の低電力デモ アプリケーション ) を作成する方法について説明します。KSDK 1.1.0インプリメンテーションには、低消費電力デモ・アプリケーションの設計をより複雑にする新機能があります。
このドキュメントでは、次の低電力デモ アプリケーションの作成について説明します。
アプリケーションが緑色のLEDの点滅を1回起動すると、RTCデバイスアラームが15秒(外部発振器32768Hzを使用)に設定されてCPUがウェイクアップし、CPUはVLLS1モードになります(VLLS0モードは外部発振器では使用できません)。
CPU のウェイクアップは、次の方法で可能です。
- SW2ボタンを押すと、プロセッサがウェイクアップし、緑色のLEDが点滅し始めます(5回)。
- ピンPTB6をアースに5回短絡すると(ピンは8ピンヘッダーコネクタ(ピン番号4)にあり、たとえばボタンをピン番号4とアースに接続できます)、プロセッサがウェイクアップし、緑色のLEDが点滅し始めます(5回)。
- 選択したRTCタイムアウトが期限切れ(15秒)すると、アラーム割り込みによってプロセッサがウェイクアップされ、緑色のLEDが点滅し始めます(5回)。
アプリケーションが再度初期化され、VLLS1 モードからのリカバリーが実行されます。アラームは再び 15 秒に設定され、CPU は再び VLLS1 モードに入ります。
まず、KDS 2.0.0 と KSDK 1.1.0をインストールする必要があります。手順については、ドキュメント「 KDS 2.0.0にKinetis SDK 1.1.0サポートをインストールする方法」を参照してください。
すべてのソフトウェアを適切にインストールして更新すると、低電力デモアプリケーションを作成する準備が整います。
新しいKinetis design Studioプロジェクトを作成します。
FRDM-KL03Zボードを選択します
KSDK 1.1.0へのKinetis SDKパスを選択します。をクリックし、[Processor Expert] を選択します。
アプリケーションが作成され、[問題] ウィンドウに警告は報告されません。
しかし、別の問題があります。OSグループのfsl_os_abstractionコンポーネントがアプリケーションに追加され(KSDK 1.0.0にはありませんでした)、継承されたfsl_lptmr_halコンポーネントにLPTMRデバイスが割り当てられます。
この競合の唯一の解決策は、このコンポーネントを削除することです (低電力デモには OS は必要なく、単純なアプリケーションのみです)。ただし、このコンポーネントは fsl_clock_manager によって使用され、fsl_clock_managerは PinSettings コンポーネントによって使用されます。したがって、これらすべてのコンポーネント(fsl_os_abstraction、fsl_clock_manager、PinSettings)を削除する必要があります。
PinSettings がプロジェクトから削除されると、すべての信号名も削除されるため、CPU コンポーネントでピンを再度選択する必要があります。
PinSettings コンポーネントはInit_GPIO配線や電気的プロパティなどの GPIO ピンの設定を可能にするコンポーネントに置き換える必要があります。
Init_GPIOコンポーネントをプロジェクトに追加し、次のプロパティを設定します(詳細ビューに切り替えます)。
これらの設定には、選択したピンの配線のための初期化コードと、フリーダムボード上のRGB LEDの緑色LEDの駆動に使用されるPTB11のGPIO機能が提供されます。
また、新しいバージョンのGCCツールをインストールした場合は、リンカの設定を変更する必要があります (ドキュメント「 KDS 2.0.0にKinetis SDK 1.1.0サポートをインストールする方法 - Kinetis Lファミリの追加手順」の章を参照)
プロジェクトのコンテキスト メニューを開き、[プロパティ] 項目を選択し、C/C++ ビルド/設定の [ツール設定] タブの [Cross ARM C++ Linker/Miscellaneous] で [その他のリンカー フラグ] 設定を "-specs=nano.specs -specs=nosys.specs" に変更します。
Tip:
コンパイルされたコードとコードサイズの詳細を知りたい場合は、次のオプションを使用して拡張リストファイルを作成し、次の ツールチェーン タブでコードサイズ情報を印刷できます。
Processor Expertコードを生成し、エラーや警告なしにアプリケーションのビルドを処理できます。
ビルドが完了すると、コンソールウィンドウに次の情報が表示されます。
'呼び出し: Cross ARM GNU Create Listing'
arm-none-eabi-objdump --source --all-headers --demangle --line-numbers --wide "低電力デモ KL03.elf" > "低電力デモ KL03.lst"
「完成した建物:低電力デモKL03.lst」
' '
「呼び出し:クロスARM GNU印刷サイズ」
arm-none-eabi-size --format=berkeley "低電力デモKL03.elf"
テキストデータ BSS DEC HEX ファイル名
1480 108 876 2464 9a0低電力デモKL03.elf
「完成した建物:低電力デモKL03.siz」
' '
注記:
すべての SDK コンポーネントが削除されているため、メモリ フットプリントが非常に小さいことがわかります。
ピンの配線は、プロジェクト内のInit_GPIOおよびその他のコンポーネントによって提供されます。次のピンが使用されます。
これで、低電力デモアプリケーションのすべてのコンポーネントを追加できます。
外部発振器32768Hzを使用し、Very Low Leakage Stopモードを許可するようにデバイスを構成する必要があります。そこで、CPU のコンポーネントインスペクターで次のプロパティを設定します (アドバンスビューに切り替えます)。
fsl_gpio_halコンポーネントのコンポーネントインスペクターを開き、 詳細 ビューに切り替えて、次のプロパティを設定します。
Init_LLWU のコンポーネントインスペクターを開き、 詳細 ビューに切り替えて、次のプロパティを設定します。
LLWUを使用してCPUをウェイクアップし、割り込みは必要ありません。
Init_SRTC のコンポーネントインスペクターを開き、 詳細 ビューに切り替えて、次のプロパティを設定します。
Init_LPTMR のコンポーネントインスペクターを開き、 詳細 ビューに切り替えて、次のプロパティを設定します。
Processor Expertコンポーネントの設計時設定が完了し、アプリケーションコードを作成する準備が整いました。
コードを生成してアプリケーションをビルドすると、エラーや警告は発生しません。Processor Expert プロジェクトは、次のようになります。
コンポーネント設定では、RTC割り込みとLPTMR割り込みの2つの割り込みを有効にしました。したがって、これらの割り込みサービスルーチンを書く必要があります。たとえば、RTC.hファイルでは、RTC_IRQHandler割り込みルーチンの宣言を見つけることができます。したがって、宣言を使用して、main.c にルーチンの定義を書き込むことができますプログラムモジュール:
#define RTC_ALARM_TIMEOUT_SEC 15
/* RTC割り込みサービスルーチン */
PE_ISR(RTC_IRQHandler) {
if (RTC_HAL_HasAlarmOccured(RTC_BASE)) {
次のアラームを RTC_ALARM_TIMEOUT_SEC 秒で設定します (TAF フラグもクリアします)
RTC_HAL_SetAlarmReg(RTC_BASE,RTC_HAL_GetAlarmReg(RTC_BASE) + RTC_ALARM_TIMEOUT_SEC);
}
if (RTC_HAL_IsTimeInvalid(RTC_BASE)) {
/* カウンターの停止とTSR レジスタ の設定によりTIF(Time Invalid Flag)をクリア */
RTC_HAL_EnableCounter(RTC_BASE, false);
RTC_HAL_SetSecsReg(RTC_BASE, 0);
/* イネーブルカウンター */
RTC_HAL_EnableCounter(RTC_BASE, 真);
}
}
この割り込みルーチンは、実行モードで緑色のLEDが点滅しているときにアラーム割り込みが呼び出された場合(フラグをクリアして新しいアラーム時間を設定)にアラーム割り込みを処理し、VLLS1モードからの回復中に発生する可能性のある無効な時間割り込みも処理します。RTCモジュールは少し特殊で、すべての実行、待機、および停止モードで動作し、リセットによりTime Invalid割り込みビット(TIIEビットRTC_IER)が有効になり、リセット時にTime Invalid割り込み(PORまたはソフトウェアリセット)が呼び出されることに注意してください。したがって、Invalid Timeフラグをクリアしないと、アプリケーションは無限サイクルでRTC割り込みを呼び出し続け、アプリケーションはまったく機能しません(これは、簡単な解決策がない問題の1つでもあります)。RTC割り込みルーチン(上記で定義)は、アプリケーションで必要なすべてのケースを適切に処理します。
RTC割り込みは、常に低リークストップモードからのウェイクアップを引き起こすことに注意してください(KL03派生物のLLWUでは設定できません–チップ固有のLLWU情報を参照)。また、レジスタのリセット後の値が0x01 RTC_SR(TIFフラグがセットされている)です。そのため、RTCが初期化されず、低リークストップモードに入ると、RTCモジュールの割り込みフラグ(TIFフラグがセットされる)により、CPUは直ちにウェイクアップします。つまり低リーク停止モードに入る前に、常にRTCモジュールを適切に初期化し、すべてのフラグをクリアする必要があります。
また、VLSS1 モードからのウェイクアップに使用される LPTMR デバイスのサービス ルーチンも必要です。これは、LPTMR 割り込みフラグをクリアするだけの単純な割り込みサービス ルーチンです。
/* LPTMR 割り込みサービスルーチン */
PE_ISR(LPTMR0_IRQHandler) {
/* LPTMR割り込みフラグをクリアする */
LPTMR_HAL_ClearIntFlag(LPTMR0_BASE);
}
これで、main 関数を記述できます。点滅するための一時的なカウント変数が必要になります。
/* ここにローカル変数の定義を記入してください */
揮発性uint32_t i; 待機用
uint8_t blink_count;
また、緑色のLEDを駆動するピンPTB11の定義も必要です
/* PTB11 - LEDグリーンピン */
#define LED_GREEN_PIN 11
また、点滅しているLEDの数:
#define LED_BLINK 5
PE_low_level_init() でデバイスを初期化した後、リセットの理由を確認する必要があります (POR リセットまたは VLLS1 リカバリ)。したがって、次のコードを書くことができます。
/* ここにコードを書きます */
if (RCM_SRS0 == 0x01) { /* リセットの理由をテストします - VLLSでの ウェイクアップ */
if(PMC->REGSC & PMC_REGSC_ACKISO_MASK) {
PMC->REGSC |= PMC_REGSC_ACKISO_MASK; /* VLLSx recovery */
}
for (blink_count = 0; blink_count < LED_BLINK; blink_count++) {
緑色のLEDが点滅
GPIO_HAL_ClearPinOutput(GPIOB_BASE,LED_GREEN_PIN);
for (i = 0; i<40000; i++);
GPIO_HAL_SetPinOutput(GPIOB_BASE,LED_GREEN_PIN);
for (i = 0; i<40000; i++);
}
次のアラームを「RTC_ALARM_TIMEOUT_SEC」秒で設定します(TAFフラグもクリアします)
RTC_HAL_SetAlarmReg(RTC_BASE,RTC_HAL_GetAlarmReg(RTC_BASE)+RTC_ALARM_TIMEOUT_SEC);
} else {
/* パワーオンリセット */
/ *緑色のLEDをオンにします* /
GPIO_HAL_ClearPinOutput(GPIOB_BASE,LED_GREEN_PIN);
/* しばらく待つ */
for (i = 0; i<40000; i++);
/ *緑色のLEDをオフに切り替えます* /
GPIO_HAL_SetPinOutput(GPIOB_BASE,LED_GREEN_PIN);
}
VLLS1 リカバリの場合、PMC_REGSC レジスタのピン絶縁 ACKISO ビットを認識します。このビットをクリアすると、すべてのピンが通常の動作モードになります。次に、緑色のLEDが5回点滅します(これはデモ目的の単純なコードにすぎません。必要に応じて、Init_TPMコンポーネントを使用してTPMxデバイスで点滅するための独自のより洗練されたコードを書くことができます)。
PORリセットの場合、緑色のLEDが1回点滅します。
リセット/ワクアップ状態がアプリケーションコードによって提供されると、VLLS1モードに入ることができます。最初のステップとして、CPU を VLLS1 モードからウェイクアップするための割り込みフラグが設定されていないことを確認する必要があるため、LLWU および SW2 ピン (PTB0) 割り込みフラグをクリアし、enter_vllsx機能を使用して VLLS1 モードに入ります。
/* 選択したピン 4 - PTB0 の LLWU フラグをクリア */
LLWU_F1 |= LLWU_F1_WUF4_MASK;
/* SW2 ピンの割り込みフラグをクリア - PTB0 */
PORTB_PCR0 |= PORT_PCR_ISF_MASK;
VLLS3を入力してください
enter_vllsx((smc_por_option_t)NULL,kSmcStopSub3);
VLLS0 に入る - VLLS0 モードでは外部水晶クロック ソースが機能しない ため 、RTC と LPTMR が機能しない
enter_vllsx(kSmcPorEnabled, kSmcStopSub0);
VLLS1を入力してください
enter_vllsx((smc_por_option_t)NULL,kSmcStopSub1);
緑色のLEDをオンに切り替えます-VLLSxモードに入っていないときはエラー状態です
GPIO_HAL_ClearPinOutput(GPIOB_BASE,LED_GREEN_PIN);
VLLS1モードが入っていない場合(エラー状態の表示)に緑色のLEDをオンにするためのコードもあります。
enter_vllsx関数は次のように定義されます (デモ KSDK デモ例の既存の関数を使用します)。
/*
* VLLSxモードエントリー ルーチン
*/
スタティックボイドenter_vllsx(smc_por_option_t PORPOValue, smc_stop_submode_t VLLSValue) {
smc_power_mode_config_t smcConfig;
/* 電源モードを特定のVLLSxモードに設定する */
smcConfig です。porOption = true;
smcConfig.porOptionValue = (smc_por_option_t) PORPOValue;
smcConfig です。powerModeName = kPowerModeVlls;
smcConfig.stopSubMode = (smc_stop_submode_t) VLLSValue;
SMC_HAL_SetMode(SMC_BASE, &smcConfig);
}
これは、低電力デモアプリケーションに必要なすべてのコードです。これで、アプリケーションをビルドして実行できます。
'呼び出し: Cross ARM GNU Create Listing'
arm-none-eabi-objdump --source --all-headers --demangle --line-numbers --wide "低電力デモ KL03.elf" > "低電力デモ KL03.lst"
「完成した建物:低電力デモKL03.lst」
' '
「呼び出し:クロスARM GNU印刷サイズ」
arm-none-eabi-size --format=berkeley "低電力デモKL03.elf"
テキストデータ BSS DEC HEX ファイル名
7828 112 896 8836 2284低電力デモKL03.elf
「完成した建物:低電力デモKL03.siz」
' '
注記:
アプリケーションでSDK関数が使用されているため、コードサイズが大きくなっていることがわかります。
これは、標準ライブラリを使用してエラーを報告できる assert 関数の使用によるところもあります。この機能が不要で、コンパクトなコード(消費電力を減らすため)だけが必要な場合は、次の方法で実行できます。
Low Power デモ KL03 アプリケーションの [プロパティ] を開き、[C/C++Build/Settings] を選択し、[Tool Settings] タブで [Cross ARM C Compiler/Preprocessor] を選択し、[ Defined symbols ] リストに NDEBUG シンボルを追加します。
アプリケーションを再びクリーンにしてビルドすると、コードサイズは縮小されます。
「呼び出し:クロスARM GNU印刷サイズ」
arm-none-eabi-size --format=berkeley "低電力デモKL03.elf"
テキストデータ BSS DEC HEX ファイル名
3192 108 876 4176 1050低電力デモKL03.elf
「完成した建物:低電力デモKL03.siz」
' '
08:20:28 ビルド完了 (15s.886ms を要)
また、アプリケーションのコードサイズを縮小するための追加の手順もあります。GNU Cツールの最適化レベルを設定できます。
低電力デモ KL03 アプリケーションの [プロパティ] を開き、[C/C++Build/Settings] を選択し、[Tool Settings] タブで [Optimization] を選択し、[Optimization Level] を要求された値に設定します (一部のレベルはデバッグに適していないことに注意してください)。
アプリケーションには、デフォルトで事前定義されたデバッグ接続が含まれています。.Project Explorer ウィンドウでプロジェクトのコンテキスト メニューを開き、[Debug As/Debug Configurations...] を選択すると、[デバッグ構成] ウィンドウが開き、すべての事前定義済みデバッグ構成 (OpenOCD、PE Micro、Segger J-link) を選択して構成できます。デフォルト設定は、Freedomボード(OpenSDAインターフェース– j-linkまたはPE Micro)で簡単に使用できます。
適切なデバッグ接続を選択し、アプリケーションのデバッグのためにデバッグをクリックするだけです。
[Debug Configuration] ウィンドウで [GDB SEGGER J-Link Debugger] グループを開き、[Low power demo KL03 Debug] コンフィギュレーションを選択します。[デバッガー]タブを見ると、MKL03Z32xxx4デバイス名がすでに入力されています。セミホスティングとSWOのコンソールの割り当てのチェックを外します(SWOはOpenSDA SEGGER J-linkではサポートされていません)。
[スタートアップ]タブに移動し、[SWOを有効にする]オプションのチェックを外します(SWOはOpenSDA SEGGER J-linkではサポートされていません)。
[Apply and Debug] ボタンをクリックすると、デバッガが起動します (FRDM-KL03Z ボードをワークステーションに接続する必要があります)。
これで、アプリケーションを起動し( [再開 ]ボタンをクリック)、機能を確認できます。VLLS1 モード エントリのため、デバッガーが切断されます。ただし、アプリケーションは実行され、使用できます。
LPTMRパルスを生成するためのボタンを接続する場合は、ボタンの1つのピンを8ピンコネクタJ1のピン#4のPTB6に接続し、ボタンの2番目のピンをGNDの10ピンコネクタJ2のピン#7に接続できます。
このデモ・アプリケーションは、実際の低消費電力アプリケーションの出発点として使用できます。それがあなたを助け、プロセッサエキスパートでの最初の低電力アプリケーションの実装の時間を節約することを願っています。
VLLS1モードでCPUの消費電力を測定することもできます。これは、FRDM-KL03ユーザーガイドに記載されています。R27とR28をはんだ付けし、ヘッダーピンをボードのJ10位置にはんだ付けするだけです。ここで J10 のジャンパーを使用して CPU の電源を接続する必要があり、ジャンパーを取り外すと、これらの 2 つのピンを使用して CPU のエネルギー消費量を測定できます (マルチメーターなど)