NXPコミュニティの皆様、こんにちは。
最近、古い LPC1758FBD80 ( SKB283.1 10 ZSD1810A ) を交換するために、新しいバージョンの LPC1758FBD80 ( AZC39200 11 SSD2347C ) を購入しました。
次の 2 つの問題が発生しています。
Error while calling macro execUserFlashInit Failed to load flash loader: FlashNXPLPC512K_Cortex.flash Could not start CPU core. (ErrorCode: -2)同じ IAR セットアップは、古いLPC1758FBD80でも完璧に動作します。
最新バージョンの IAR ARM ツールチェーンですでに試しましたが、同じエラーが発生して失敗します。
質問:
古いLPC1758FBD80から新しいものにアプリケーションを移行する方法について、アドバイスや推奨事項をいただければ幸いです。
よろしくお願い申し上げます。
こんにちは@Tay33
とても嬉しいです!発見したことや結果を共有していただきありがとうございます。きっと他の人にも役立つと思います!
ディエゴ
@diego_charlesさん、返信ありがとうございます。
ISP ピンを確認しましたが、それでもアプリケーションを起動できませんでした。
しかし、IAR フラッシュ ローダーがもう動作していないのではないかと疑っていたので、プロジェクト → オプション → デバッガー → ダウンロードの下にある「フラッシュ ローダーを使用する」オプションのチェックを外したら、J-Link プローブから新しい LPC1758 を正常にデバッグできるようになりました。
デバッグ中に、MCUがChip_SetupXtalClocking()関数(sysinit_17xx_40xx.c内)でスタックしていることがわかりました。SCS レジスタの SYSCTL_OSCSTAT ビットが低く固定されていたため、ファイルでエラーが発生しました。
外部発振器を調べたところ、発振するのではなく安定した電圧レベルを生成していることに気付きました。チップの交換中に何か問題が発生し、外部発振器が損傷した可能性があります。
一時的な修正として、内部 RC 発振器を使用するように切り替えたところ、アプリケーションが正常に起動しました。
私は間違いなく IAR にお問い合わせして、LPC1758 用のフラッシュ ローダーの更新バージョンを入手するつもりですが、今のところは先に進むことができます。
サポートありがとうございます!
こんにちは@Tay33
お問い合わせいただきありがとうございます!2 番目のデバイス リビジョンから 3 番目のデバイス リビジョンに移行していると理解しています。
最新版では、以前の版からのいくつかの誤りが修正されています。表 2 の機能上の問題表によると、変更点をさらに説明する別のエラッタ バージョンは用意されていません。
確認したところ、このリビジョンでは新しいソフトウェアはリリースされておらず、IAR のフラッシュローダーを更新するためのガイドラインもありません。
J-Link でプログラミングした後でも起動に失敗するとのことでした。CAN ISP ピンを確認できますか?最新リビジョンを使用した場合、このピンの測定電圧はどれくらいですか?
よろしくお願いします、
ディエゴ
こんにちは、
次のエラーが発生するため、IAR は LPC17xx.mac ファイルを最新の LPC1758 バージョンで動作するように更新していないと思われます。
C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm/config/flashloader/NXP/LPC17xx.mac(40,17): Error: Operation error.
しかし、これを機能させるために何を変更する必要があるかはわかりません。
誰かこれについてCAN助けてくれませんか?
__var FLASHCFG;
__var MEMMAP;
__var CLKSRCSEL;
__var SCS;
__var CCLKSEL;
__var PLL0CON;
execUserFlashInit()
{
// Save registers contents
FLASHCFG = __readMemory32(0x400FC000, "Memory");
MEMMAP = __readMemory32(0x400FC040, "Memory");
CLKSRCSEL = __readMemory32(0x400FC10C, "Memory");
SCS = __readMemory32(0x400FC1A0, "Memory");
CCLKSEL = __readMemory32(0x400FC104, "Memory");
PLL0CON = __readMemory32(0x400FC080, "Memory");
// Disable the PLL.
__writeMemory32(0x00000000, 0x400FC080, "Memory"); // PLL0CON = 0
// Qualify the PLL change.
__writeMemory32(0x000000AA, 0x400FC08C, "Memory"); // PLL0FEED = 0xAA
__writeMemory32(0x00000055, 0x400FC08C, "Memory"); // PLL0FEED = 0x55
__writeMemory32(0x00000000, 0x400FC104, "Memory"); // CCLKSEL=0
// Enable main clock
__writeMemory32(0x00000020, 0x400FC1A0, "Memory"); // SCS.OSCEN = 1
__delay(1); //Reading status is unstable
// Wait on OSCSTAT bit, set when oscillator is ready.
//while(!(__readMemory32(0x400FC1A0, "Memory") & 0x40))
// Switch to main clock instead of internal RC for stable JTAG auto-speed
__writeMemory32(0x00000001, 0x400FC10C, "Memory"); // CLKSRCSEL = 1
// Make sure that the flash memory system is correctly setup.
__writeMemory32(0x3A , 0x400FC000, "Memory"); // FLASHCFG = 0x3A;
// If the MAM values was wrong, a dummy read is necessary to get the flash memory in sync.
__writeMemory32(0x00000001, 0x400FC040, "Memory"); // MEMMAP = 1
__readMemory32(0x00000000, "Memory");
}
execUserFlashExit()
{
// Restore modified registers
__writeMemory32(CLKSRCSEL, 0x400FC10C, "Memory");
__writeMemory32(PLL0CON, 0x400FC080, "Memory");
// Qualify the PLL change.
__writeMemory32(0x000000AA, 0x400FC08C, "Memory");
__writeMemory32(0x00000055, 0x400FC08C, "Memory");
__writeMemory32(CCLKSEL, 0x400FC104, "Memory");
__writeMemory32(SCS, 0x400FC1A0, "Memory");
if (SCS & 0x20)
{
__delay(1); //Reading status is unstable
// Wait on OSCSTAT bit, set when oscillator is ready.
//while(!(__readMemory32(0x400FC1A0, "Memory") & 0x40));
}
__writeMemory32(FLASHCFG, 0x400FC000, "Memory");
__writeMemory32(MEMMAP, 0x400FC040, "Memory");
// Dummy read to get the flash memory in sync
__readMemory32(0x00000000, "Memory");
}