AHI互換関数
AHI互換関数
AHI 関数群の一部について、ソースコードの互換を目的として実装しています。
- 本ライブラリの実装は、 fsl ドライバの手続きをまとめた TWENETmwf ライブラリを用いて実装されています。
- この実装は完全な互換性を保つことを目的とはしていません。
- 独自拡張を行った関数は関数名に
_MW
を付記しています。 - 本書記述時点で判明している留意点などを記載します。
- 内部の実装は予告なく変更される場合があります。
- 解説中のパラメータについても、留意が必要な部分のみ記述しています。省略部分は、原典の AHI ライブラリマニュアルを参照ください。
- TWELITE GOLD 特有の話題や FSL ライブラリ、またマイコンコアなどの振る舞いについては、NXP社のJN5189半導体マニュアル及び TWENETmcu ライブラリの実装を参照してください。
以下には AHI 互換関数について記載しています。SPI, I2C などは別ファイルに記載しているものもあります。
一般関数
u32AHI_Init()
uint32 u32AHI_Init();
本来AHIライブラリの初期化を行いますが、本ライブラリでは一部の変数の初期化のみを実施します。
bAHI_SetClockRate(), u8AHI_GetSystemClkRate()
bool_t bAHI_SetClockRate(uint8 u8clk_code);
uint8 u8AHI_GetSystemClkRate();
CPUのクロック速度を設定または設定値の取得を行います。
設定されるクロックは以下のようになります。TWELITE BLUE/REDの設定とは大きく異なるため注意が必要です。
u8clk_code | TWELITE BLUE/RED | TWELITE GOLD |
---|---|---|
0 | 4Mhz | 12Mhz |
1 | 8Mhz | 12Mhz |
2 | 16Mhz | 32Mhz |
3 | 32Mhz | 48Mhz |
4.. | 設定有り | 無視される |
kFROM1M_to_MAIN_CLK
といったクロックも fsl ライブラリ内では設定可能ですが、動作に大きな難があるため設定できないようにしています。- デバッガを利用するような場合は、クロック変更に支障が出る場合があります。
- 規定値は 2、32Mhz (TWELITE GOLD) です。(参考:TWELITE BLUE/REDでは 16MHz)
bAHI_Set32KhzClockMode()
bool_t bAHI_Set32KhzClockMode(uint8 u8mode);
なにもしません。
vAHI_CpuDoze()
static inline void vAHI_CpuDoze() { __WFI(); }
割り込み待ち低電力待機 DOZE 状態に入ります。TWELITE-GOLD では WFI (割り込み待ち) を発効します。
vAHI_SwReset()
static inline void vAHI_SwReset() { NVIC_SystemReset(); }
リセットを行います。
電源関係
u16AHI_PowerStatus()
uint16 u16AHI_PowerStatus();
本関数では、以下のビットマップを報告します。
ビット | 解説 |
---|---|
bit0 | スリープからの復帰時に 1 |
bit1 | RAMが保持されていた場合に 1 |
POR 時は 0
、通常のRAM保持スリープからの復帰は 3
になります。
vAHI_BrownOutConfigure()
static inline void vAHI_BrownOutConfigure(
uint8 const u8VboSelect,
bool_t const bVboRstEn,
bool_t const bVboEn,
bool_t const bVboIntEnFalling,
bool_t const bVboIntEnRising) { ; } // DUMMY FUNC
コンパイルエラー回避のための定義です。この関数は何もしません。
スリープについて
void ToCoNet_vSleep(uint8 u8Device, uint32 u32Periodms, bool_t bPeriodic, bool_t bRamOff)
スリープは TWENET C ライブラリでは ToCoNet_vSleep()
関数を用います。
※ mwxライブラリでは the_twelite.sleep()
を用います。
bRamOff
はTRUEを指定した場合、全てのRAMセグメントを保持しない形でスリープを行います。なお、この場合もJN518x FSL ライブラリ定義のPM_POWER_DOWN
を用いPM_DEEP_DOWN
は使用しません。
スリープの失敗について(TWELITE GOLD)
TWELITE GOLD では、スリープ遷移の半導体ライブラリ中の手続き(POWER_EnterPowerMode()
)が稀に失敗し、スリープが行われません。そのため以下の対処を行っています。
- 半導体ライブラリの手続き失敗時は関数呼び出しからそのまま抜けてしまうが、100usec 相当(
DelayLoopN(100)
)のループ待ちを行った後、再度スリープの手続きを実行します。 - 上記を3回試行して失敗した場合は
ToCoNet_vSleep()
は無限ループを呼び出し、通常はウォッチドッグタイマーによるリセットが発生します。当社では、2回または3回の再試行は確認されていませんが、念のため3回までとしています。 - 上記スリープ手続きが行われた場合、スリープ復帰後
extern uint8 g_twenet_power_down_fails;
の値が0
以外であれば、上記の再試行が行われていたことを示します。但し、ウォッチドッグタイマーによるリセット時はこの変数は初期化されます。
内部処理用
u32AppApiInit()
uint32
u32AppApiInit(PR_GET_BUFFER prMlmeGetBuffer,
PR_POST_CALLBACK prMlmeCallback,
void *pvMlmeParam,
PR_GET_BUFFER prMcpsGetBuffer,
PR_POST_CALLBACK prMcpsCallback,
void *pvMcpsParam);
AppQAPIの初期化処理を行います。
vAHI_RegEvMgr_MW()
void vAHI_RegEvMgr_MW();
TWENETmwfライブラリでのクラスオブジェクトを管理するための管理オブジェクト(mwf::the_sys_ev_manager
)を構築します。
vAHI_OnWakeup_MW(), vAHI_OnWakeupRamOff_MW()
void vAHI_OnWakeup_MW(bool_t b_init_2nd);
void vAHI_OnWakeupRamOff_MW(bool_t b_init_2nd);
起床時に実施する手続きです。TWENETmcuのtwenet_main.cの処理を参照してください。
- TWENETmwf ライブラリ内のクラスオブジェクトの起床時処理
mwf::the_sys_ev_manager->on_wakeup()
を行います。 vAHI_DioOnWakeup_MW()
を呼び出します。起床要因のピンを保存します。b_init_2nd
がFALSEの場合は始動初期の段階の呼び出しで、TRUEの場合はある程度の初期化が終わった時点(cbAppWarmStart(TRUE)
呼び出し前)での呼び出しになります。
vAHI_OnWakeupRamOff_MW()
はRAM非保持スリープ復帰時に呼び出されます。
b_init_2nd
がFALSEの場合は始動初期の段階の呼び出しで、TRUEの場合はある程度の初期化が終わった時点(cbAppWarmStart(TRUE)
呼び出し後)での呼び出しになります。
vAHI_OnSleep_MW()
vAHI_OnSleep_MW();
スリープ前に実施する手続きです。
- TWENETmwf ライブラリ内のクラスオブジェクトのスリープ前処理
mwf::the_sys_ev_manager->on_sleep()
を行います。 vAHI_DioOnSleep_MW()
を呼び出します。DIO起床ピンの設定をします。
vAHI_DMAEnable_MW(), vAHI_DMADisable_MW()
void vAHI_DMAEnable_MW();
void vAHI_DMADisable_MW();
DMA機能の有効化と無効化を行います。
vAHI_DMADisable_MW()
は何も実行しません。