1108188_ja-JP

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

1108188_ja-JP

1108188_ja-JP

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();

}

Tags (1)
No ratings
Version history
Last update:
‎01-06-2026 01:58 AM
Updated by: