LPCファミリのSDRAMでのコードの実行 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
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(); }
查看全文