2416496_ja-JP

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

2416496_ja-JP

2416496_ja-JP

MCXN547 SC Timer0 SDKドライバーの問題

私はMCUとSDK MCXN547VKLバージョン26.06.00を使っています。

コンテキスト: 私は SCT タイマー 0 を使用して、スプリット モードの COUNTER を使用して 2 つの異なる PWM 波形を生成しています。CONFIG[UNIFY] = 0、つまり COUNT_L を 1 つの PWM ジェネレーターに、COUNT_H を別の PWM ジェネレーターに使用しています。

問題はこうです:ドライバーAPI「SCTIMER_SetCOUNTValue(SCT0,kSCTIMER_Counter_H,0U)」でCOUNTER_Hを読み込むと、バスフォールトが発生します。

問題の原因をSDKのドライバーコードに突き止めました。ドライバコードはCOUNT_H単独で16ビットの書き込みではなく、COUNT_HとCOUNT_Lの両方を32ビット書き込みで行います。COUNT_H が書き込まれている間に COUNT_L が実行されていたため、バス障害が発生しました。SDKのドライバーコードを16ビット書き込みに変更したところ、バスの故障は発生しませんでした。ドライバーコードを添付し、問題の原因となったコードラインと修正方法を色で示しました。もし本当にこれが問題なら、SDKドライバーを更新できます。- ありがとう


/*!

* @brief カウンターの値を設定します。

*

* この機能は、カウントレジスタの値を設定することであり、COUNT_L、COUNT_H、または統合レジスタに書き込みます。

* は、対応するカウンタが停止しているとき(CTRL レジスタの HALT ビットが 1 に設定されているとき)にのみ許可されます。

*

* @param base SCTimer ペリフェラル ベースアドレス

* @param whichCounter SCTimer カウンターを使います。16ビットモードでは、Counter_LとCounter_Hを選択できます。

* 32ビットモードではCounter_Uを選択できます。

* @Param value COUNTレジスタへのカウンタ値の更新。

*/

static inline void SCTIMER_SetCOUNTValue ( SCT_Type *base, sctimer_counter_t whichCounter, uint32_t value)

{

SCTIMER_StopTimer(base, ( uint32_t )whichCounter);

スイッチ (whichCounter)

{

case kSCTIMER_Counter_L:

assert(value <= 0xFFFFU);

assert(0U == (base-> CONFIG & SCT_CONFIG_UNIFY_MASK));

/* ユーザーがLowカウンターを設定したいときにビットCounter_Lを使います */

base-> COUNT_ACCESS16BIT.COUNTL = ( uint16_t ) value;

壊す;


case kSCTIMER_Counter_H:

assert(value <= 0xFFFFU);

assert(0U == (base-> CONFIG & SCT_CONFIG_UNIFY_MASK));

/* ユーザーがHighカウンターを設定したいときにCounter_Hビットを使う */

// base->COUNT = (uint32_t)base->COUNT_ACCESS16BIT.COUNTL | SCT_COUNT_CTR_H(value);

base- > COUNT_ACCESS16BIT.COUNTH = ( uint16_t )value; //修正

壊す;


CASE kSCTIMER_Counter_U:

assert(1U == (base-> CONFIG & SCT_CONFIG_UNIFY_MASK));

/* カウンタが 32 ビットモードで動作している場合 (カウンタを統合する場合) は、Counter_L ビットと Counter_H ビットの両方を使用します。*/

base-> COUNT = value;

壊す;


デフォルト:

/* MISRA C-2012 問題ルール 16.4 を修正します。*/

壊す;

}


SCTIMER_StartTimer(base, ( uint32_t )whichCounter);

}

クロック|タイマーRe: MCXN547 SC Timer0 SDK driver Issue

こんにちは、 @JawaharA さん。

ご意見ありがとうございます。バス障害の原因に関するあなたの分析は正しいです。COUNT_H の更新には COUNT レジスタへの 32 ビット書き込みが使用されますが、現在の関数は H カウンタのみを停止します。Lカウンタがまだ動作している場合、この書き込みアクセスはSCTバスエラーを引き起こします。

しかし、COUNTHへの16ビット書き込みへのアクセス変更はSCTハードウェアアクセス要件に適合しません。なぜなら、COUNT_HはCOUNT_L と一緒にワードとして書かなければならないからです。正しいソフトウェアの解決策は、32ビットのCOUNTへの書き込みを行う前にLとHの両方のカウンターを停止し、その後に以前の実行状態を復元することです。別途16ビットの書き込みを使わずにSDKをレビューし、適切に更新することを推奨COUNT_H。

Harry_Zhang_0-1790589981399.png


BR

ハリー

Re: MCXN547 SC Timer0 SDK driver Issueこんにちは、ハリーさん。
迅速なご対応ありがとうございます。
ご回答で参照されたマニュアルページによると、CONFIG[UNIFY] = 0の場合、COUNT_LレジスタとCOUNT_Hレジスタの両方をそれぞれカウンタが動作していない間に個別に読み書きできます。SDKはレジスタに16ビット書き込みCOUNT_L使っています。COUNT_HレジスタはCONFIG[UNIFY]の設定に関係なく32ビット書き込みで書き込む必要がありますが、これは非公式な条件でしょうか?
ありがとう - ジャワハル
タグ(1)
評価なし
バージョン履歴
最終更新日:
17 時間前
更新者: