みなさん、こんにちは!
MCUはK32L2A41
Cyclone デバッガーを介してチップをフラッシュすると、コードがフラッシュし、main() でブレークポイントが正しく設定されます。コードを実行し続けると、TMP2(「WAIT1MS」ペリフェラルと呼ばれる)を含むすべてが正しく起動します。
これは 1ms の一般的なタイマーに使用され、1ms ごとに割り込みを行い、0 である限りいくつかのシステム カウンターから差し引かれ>ように設定されています。
/* 割り込みフラグをクリアします。
WAIT1MS_PERIPHERAL->CNT = 0;
uint32_t intStatus;
/* ステータスレジスタのすべての割り込みフラグを読み出します */
intStatus = TPM_GetStatusFlags(WAIT1MS_PERIPHERAL);
TPM_ClearStatusFlags(WAIT1MS_PERIPHERAL, intStatus);
/* NVICで割り込みWAIT1MS_IRQNリクエストを有効にする */
EnableIRQ(WAIT1MS_IRQN);
IRQ ハンドラは次のとおりです。
/* TPM2_IRQn interrupt handler */
void WAIT1MS_IRQHANDLER(void) {
uint32_t intStatus;
/* ステータスレジスタのすべての割り込みフラグを読み出します */
intStatus = TPM_GetStatusFlags(WAIT1MS_PERIPHERAL);
/* ここにコードを配置します */
if(Cpu_Delay1000US){Cpu_Delay1000US--;}
if(sendLegacy_McuWait_ms){sendLegacy_McuWait_ms--;}
/* 割り込みフラグをクリアします。
TPM_ClearStatusFlags(WAIT1MS_PERIPHERAL, intStatus);
} /* WAIT1MS_IRQHANDLERの終わり */
すべてが期待どおりに実行されます。
問題-最初の実行では、工場出荷時の新製品からのみ:
工場出荷時の新しいチップを搭載した新しいPCBでは、1回目のフラッシュは最初は機能しません。
コードは点滅し、起動し、main()を正しく実行し、TMP2が設定されるまで、最初に必要になる直前、メインの永久ループの前にすべてが正しく開始されます。
As soon as it executes EnableIRQ(WAIT1MS_IRQN);
(これは NVIC->ISER[0U] = (uint32_t)(1UL << ((((uint32_t)IRQn) & 0x1FUL)); core_cm0plus.hコード)
「シグナルハンドラ」をスローして電話を切ります。それはまだCycloneに接続されており、MCUXpressoの[再起動]ボタンをクリックするだけで、コードは再起動し、期待どおりに完全に実行されます(SIGINTの問題はありません)。
コードが 1 回目のフラッシュで停止すると、これが Fault と Exception に表示されます。上記の私のコードでは、保留中の割り込みをクリアし、EnableIRQの前にカウントをリセットしようとしました(最初は、MCUXpressoが生成されたペリフェラルコードからこれを完全に設定できるようにしていました)。
CS2030-K32v1.axf
スレッド #1 (中断 : シグナル : SIGINT:割り込み)
0x1c00429c
()
core_cm0plus.h:750での__NVIC_EnableIRQ()0x7348
EnableIRQ() at fsl_common_arm.h:5350x1c5cc
CS2030-K32.cのmain():352 0x78f4
ipsrfaults 0x24Interrupt Program Status レジスタ
例外番号 0x8 プロセッサが処理している例外を示します
この最初のフラッシュと実行の後、SIGINTエラーが発生すると、コールドスタートからいつでもコードを実行でき、デバッガの有無にかかわらず、電源をオフ/オンにしたり、コードを変更して再フラッシュしたり(コードの他の部分をデバッグするため)、期待どおりに起動します。それは、システムがこのSIGINTにハングしているのは 、工場新品からのこの非常に最初のフラッシュだけです。
「まあ、1回目のフラッシュの後は大丈夫だ、そういうことの1つだけだ」と肩をすくめるのではなく、何が問題なのかを理解し、もちろん適切に修正してから、完成品としてデプロイしたいと考えています。それは、私が試着するすべての新しいPCB /工場新品のチップで発生します。一度発生すると、同じPCBに複製することはできず、最初のフラッシュでのみ発生します。
親愛なるNXP愛好家の皆さん、ご意見をお聞かせください!
追加の詳細を提供できるのはうれしいですが、これらのビットが最も関連性があるように思われました。
ありがとうございました!非常に理にかなっています。他のデバッガー オプションを検討する場合があります。私たちはPEを15年間使用してきましたが、問題なかったので、利用可能な他のオプションを検討したことはありません。
乾杯!
Hi,
率直に言って、私はCycloneデバッガを使用したことがありません、それはこれはサイクロンデバッガ固有の問題であるようです。
割り込みが発生した後、初めてフラッシュすると Cyclone デバッガーが原因でコアが ISR を検出できないようです。
ISRを含むすべてのコードをフラッシュに記述してから、TPMモジュールを開始することは可能ですか?
それがあなたを助けることができることを願っています
BR
シャンジュン・ロン