私は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);
}
こんにちは、 @JawaharA さん。
ご意見ありがとうございます。バス障害の原因に関するあなたの分析は正しいです。COUNT_H の更新には COUNT レジスタへの 32 ビット書き込みが使用されますが、現在の関数は H カウンタのみを停止します。Lカウンタがまだ動作している場合、この書き込みアクセスはSCTバスエラーを引き起こします。
しかし、COUNTHへの16ビット書き込みへのアクセス変更はSCTハードウェアアクセス要件に適合しません。なぜなら、COUNT_HはCOUNT_L と一緒にワードとして書かなければならないからです。正しいソフトウェアの解決策は、32ビットのCOUNTへの書き込みを行う前にLとHの両方のカウンターを停止し、その後に以前の実行状態を復元することです。別途16ビットの書き込みを使わずにSDKをレビューし、適切に更新することを推奨COUNT_H。
BR
ハリー