LPCファミリの一部のプロセッサにはEMCが搭載されており、外部パラレルSRAM、NORフラッシュ、SDRAMを接続でき、SPIフラッシュやIICフラッシュなどのシリアルフラッシュにコードを保存し、コードをSDRAMにコピーしてSDRAMでコードを実行するアプリケーションがあります。
これは、SDRAMでコードを実行する方法をデモする簡単なコードで、コードはSDKパッケージを使用してSDRAMサンプルコードの下で開発され、SDRAMを初期化してSDRAMにデータを書き込み、SDRAMからデータを読み出し、データの書き込みとデータの読み取りが同じかどうかを比較します。単純な関数 void LED_Toggle(void) を使用して LED を切り替え、API 関数は関数 void mem2mem(uint16_t *sourceAdd,uint16_t *destinationAdd,uint16_t length) で SDRAM にコピーされます。関数が呼び出された後、関数ポインタが定義され、関数ポインタにジャンプします。
ところで、ユーザーがSDRAMでコードを実行する場合は、Cortex-M4のMPUモジュールを初期化して、SDRAMのコードをフェッチして実行できるようにする必要があります。
デモコードは、MCUXpresso ver10.3.1およびLPCXpresso546xxボード(OM40003)で開発されています。
コードを実行すると、LED2 が LPCXpresso546xx ボードに切り替わります。
ここにメインコードをリストします。すべてのプロジェクトが添付されています。
void mem2mem(uint16_t *sourceAdd,uint16_t *destinationAdd,uint16_t length)
{
sourceAdd = (uint16_t *)((uint32_t)sourceAdd & (0xFFFFFFFE));
destinationAdd=(uint16_t *)((uint32_t)destinationAdd & 0xFFFFFFFE);
for(uint16_t i=0; i
destinationAdd[i]=sourceAdd[i];
}
__DSB();
__ISB();
}
#define SDRAM_BASE_ADDR_CODE 0xa0000001
typedef void (*functionPointer)(void);
PC の値は奇数でなければなりませんが、コード・アドレスは偶数の値です //値
void runCodeInSDRAM(void)
{
((関数ポインタ)SDRAM_BASE_ADDR_CODE)();
}
void LED_Toggle(void)
{
while(1)
{
delay_1();
GPIO->NOT[3]|=1<<3;
}
}
ボイドMPU_Init(ボイド)
{
MPUを無効にする
MPU->CTRL=0x00;
Region0: デフォルトのリージョン 0
MPU->RBAR=0x00000010;
MPU->RASR=0x1004003f;
リージョン 1:
フラッシュ、ROM、SRAMのセットアップ...リージョン 1 として
#0x00000000 - 0x3FFFFFFF
MPU->RBAR=0x00000011;
MPU->RASR=0x0306E23b;
リージョン 2:
周辺機器のセットアップ
#0x40000000 - 0x400FFFFF
MPU->RBAR=0x40000012;
MPU->RASR=0x13050033;
リージョン 3:
チップセレクトとデバイスのセットアップ
#0x80000000 - 0x9000FFFF
MPU->RBAR=0x80000013;
MPU->RASR=0x1305001f;
リージョン 4:
SDRAMのセットアップ
##0xA0000000 - 0xA0FFFFFF
MPU->RBAR=0xa0000014;
MPU->RASR=0x0307002f;
リージョン 5:
Cortex-M4プライベートペリフェラルバスのセットアップ
#0xE0000000 - 0xE00FFFFF
MPU->RBAR=0xe0000015;
MPU->RASR=0x13040027;
リージョン 6:
設定 未使用
#0xE0000000 - 0xE00FFFFF
MPU->RBAR=0xe0000016;
MPU->RASR=0x00000000;
リージョン 7:
スタックの設定
//#
MPU->RBAR=0x1000E017;
MPU->RASR=0x10060009;
MPUを有効にする
MPU->CTRL=0x01;
}
int main(void)
{
uint32_tインデックス;
uint32_t *SDRAM = (uint32_t *)SDRAM_BASE_ADDR;/* SDRAM開始アドレス。*/
/* ハードウェアの初期化 */
CLOCK_EnableClock(kCLOCK_InputMux);
/* 12 MHz クロックを FLEXCOMM0 に接続 (デバッグ コンソール) */
CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);
BOARD_InitPins();
BOARD_BootClockFROHF96M();
BOARD_InitDebugConsole();
LEDInit();
LED_Toggle();
BOARD_InitSDRAM();
MPU_Init();
mem2mem((uint16_t *)LED_Toggle,(uint16_t *)SDRAM_BASE_ADDR_CODE,400);
LED_Toggle();
runCodeInSDRAM();
}