2146090_ja-JP

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

2146090_ja-JP

2146090_ja-JP

MPC5746Cのフラッシュメモリアレイの整合性チェック

こんにちは、

MPC5746C のフラッシュ メモリ アレイの整合性チェックに取り組んでいます。
MPC5746C リファレンス マニュアルに記載されている手順に基づいて関数を作成しました。この機能を実行すると、継続的なリセットが行われます。

VinayYammanuru_0-1754298537859.png


手順に基づいて、以下のコードが記述されます。そして、while ループ内で継続的にリセットを行っています。しかし、ブレークポイントを維持し、ステップごとに実行すれば、動作します。

一度ご確認いただき、フィードバックや解決策をご提供いただけますでしょうか。


静的void WaitForAIDBitSet(uint32_t タイムアウト)
{
揮発性 int 遅延;
(遅延 = 0; 遅延 < 1000; 遅延++) の場合 { __asm__ volatile ("nop"); }
while ((C55FMC.UT0.B.AID == 0) && (タイムアウト > 0U))
{
タイムアウト - ;
}
}

uint8 フラッシュメモリ整合性テスト(void)
{
uint32_t misr_result[10];

/* ウォッチドッグを無効にする */
Wdg_modeSwitchInt(FALSE);

/* ステップ 1: UTest モードに入る */
C55FMC_UT0 = 0xF9F99999;

/* ステップ2: ECC設定 - ECCエラー報告を無効にする */
C55FMC.MCR.B.EER = 0; // ECCイベント情報
C55FMC.MCR.B.SBC = 0; // シングルビット訂正

/* ステップ3: PFLASHの読み取り動作を構成する */
PFLASH.PFCR1.B.RWSC = 0x04; // 待機状態
PFLASH.PFCR1.B.APC = 0x01; // プリフェッチ有効

/* ステップ4: SELx経由でテストするフラッシュブロックを選択する */
C55FMC.SEL0.R = 0x00FF0FFC;
C55FMC.SEL1.R = 0x00000000;
C55FMC.SEL2.R = 0x00000000;
C55FMC.SEL3.R = 0x00000000;

/* ステップ5: シーケンシャルアドレッシングを使用する */
C55FMC.UT0.B.AIS = 1;

/* ステップ 6: MISR レジスタをシードする */
C55FMC_UM0 = MISR_SEED;
C55FMC_UM1 = MISR_SEED;
C55FMC_UM2 = MISR_SEED;
C55FMC_UM3 = MISR_SEED;
C55FMC_UM4 = MISR_SEED;
C55FMC_UM5 = MISR_SEED;
C55FMC_UM6 = MISR_SEED;
C55FMC_UM7 = MISR_SEED;
C55FMC_UM8 = MISR_SEED;
C55FMC_UM9 = MISR_SEED;

/* ステップ7: 配列整合性操作を開始する */
C55FMC.UT0.B.AIE = 1;

/* ステップ8: AID = 1(操作完了)を待機します */
WaitForAIDBitSet(0xFFFFFF); // タイムアウト制限を追加する

/* ステップ9: MISR値を読み戻す */
misr_result[0] = C55FMC_UM0;
misr_result[1] = C55FMC_UM1;
misr_result[2] = C55FMC_UM2;
misr_result[3] = C55FMC_UM3;
misr_result[4] = C55FMC_UM4;
misr_result[5] = C55FMC_UM5;
misr_result[6] = C55FMC_UM6;
misr_result[7] = C55FMC_UM7;
misr_result[8] = C55FMC_UM8;
misr_result[9] = C55FMC_UM9;

/* ステップ10: AIEをクリアする */
C55FMC.UT0.B.AIE = 0;

/* ステップ11: 必要に応じてウォッチドッグを有効にする */
Wdg_modeSwitchInt(TRUE);

/* ステップ12: MISRの結果を比較する */
if ((misr_result[0] == MISR_UM0) &&
(misr_result[1] == MISR_UM1) &&
(misr_result[2] == MISR_UM2) &&
(misr_result[3] == MISR_UM3) &&
(misr_result[4] == MISR_UM4) &&
(misr_result[5] == MISR_UM5) &&
(misr_result[6] == MISR_UM6) &&
(misr_result[7] == MISR_UM7) &&
(misr_result[8] == MISR_UM8) &&
(misr_result[9] == MISR_UM9))
{
FLS_SAFE_STATE_INACTIVE を返します。
}
それ以外
{
return FLS_SAFE_STATE_ACTIVE; // 整合性チェックに失敗しました
}
}

Re: Flash memory array integrity check on MPC5746C

こんにちは、

この関数は、フラッシュ ブロックの実際の MISR 値と output.txt の予想値を比較します。

MISR ツールをセットアップするには、詳細な readme.txt とフォルダーの開始アドレスの例を参照してください。

完全なツールを添付します。Web サンプルでは一部の doc/example ファイルが欠落しているようです。

これで疑問がすべて解消されることを願っています。

よろしくお願いいたします。

ピーター

Re: Flash memory array integrity check on MPC5746C

ツールがどのようにして期待されるゴールデン署名を計算するのか理解できませんでした。

予想される署名を計算する手順を教えてください。そして、例にあるツールはどのように機能しますか?

Re: Flash memory array integrity check on MPC5746C

こんにちは、

もう一つの質問があります。計算された MISR 署名値をどのように CAN 検証できるのでしょうか?つまり、取得した署名が正しいかどうかをどのように判断CANのでしょうか?

検証戦略の概要

  1. 既知のメモリ領域 (テスト配列など) の MISR シグネチャを計算します。
  2. 結果を事前に計算された参照署名 (ゴールデン値) と比較します。
  3. 値が一致する場合、メモリの内容は有効であると見なされます。


配列の整合性チェックを完了するために、MISR 署名値を計算して検証するサンプル コードを共有していただけますか?

#include "MPC5746C.h" // Replace with actual header for your environment

#define ARRAY_SIZE 256
#define CRC_BASE_ADDRESS 0xFF000000 // Replace with actual CRC module base address

uint32_t test_array[ARRAY_SIZE] = { /* Fill with known values */ };
uint32_t expected_signature = 0x12345678; // Replace with your golden MISR value

void init_crc_module(void) {
// Enable CRC module clock
// Configure CRC settings (polynomial, seed, etc.)
// This is platform-specific and may require register-level access
}

uint32_t calculate_misr_signature(uint32_t *data, uint32_t size) {
volatile uint32_t *crc_data_reg = (uint32_t *)(CRC_BASE_ADDRESS + 0x04); // Data input register
volatile uint32_t *crc_result_reg = (uint32_t *)(CRC_BASE_ADDRESS + 0x10); // Result register

for (uint32_t i = 0; i < size; i++) {
*crc_data_reg = data[i];
}

return *crc_result_reg;
}

int main(void) {
init_crc_module();

uint32_t signature = calculate_misr_signature(test_array, ARRAY_SIZE);

if (signature == expected_signature) {
// Signature matches
// Memory integrity is validated
} else {
// Signature mismatch
// Possible memory corruption
}

return 0;
}

この例を見てください。これは同じ C55 フラッシュ モジュールのものです。

https://community.nxp.com/t5/MPC5xxx-Knowledge-Base/Example-MPC5744P-FlashArrayIntegrityCheck-test-S...

よろしくお願いいたします。

ピーター

Re: Flash memory array integrity check on MPC5746C

マシン チェック例外のためリセットが発生しています。

もう一つの質問があります。計算された MISR 署名値をどのように CAN 検証できるのでしょうか?つまり、取得した署名が正しいかどうかをどのように判断 CAN ますか?

配列の整合性チェックを完了するために、MISR 署名値を計算して検証するサンプル コードを共有していただけますか?

Re: Flash memory array integrity check on MPC5746C

こんにちは、

デバッグ モードではリセットは発生しないため、この問題は何らかのタイマーによって発生していると想定されます。デバッガーによって無効化される SWT と同様。

リセット理由は、RGM [FES/DES] レジスタから読み取ることがCANます。

よろしくお願いいたします。

ピーター

Tags (1)
No ratings
Version history
Last update:
‎11-21-2025 07:57 AM
Updated by: