2383549_ja-JP

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 

2383549_ja-JP

2383549_ja-JP

i.MXRT1176: 外部SRAMへのアクセスに関する質問

こんにちは、

外部のSRAMにアクセスするのに問題が発生しています。SRAMはCSX1(パッドL14 – GPIO_AD_26)を介して選択されますが、私のテストプログラムは常にメモリ管理フォルトを引き起こします。私のコードのどこが間違っていたのでしょうか?ご協力ありがとうございます。

/*

* 著作権 2017 NXP

* 無断転載を禁じます。

*

* SPDX-License-Identifier: BSD-3-Claise

*/

#include "board.h"

#include "fsl_debug_console.h"

#include "fsl_device_registers.h"

#include "pin_mux.h"

#include "fsl_semc.h"

#include "clock_config.h"

/****

* 定義

**********************************************************************************/

#define EXAMPLE_SEMC SEMC

#define EXAMPLE_SEMC_CLK_FREQ CLOCK_GetRootClockFreq(kCLOCK_Root_Semc)


/****

* プロトタイプ

**********************************************************************************/

extern status_t BOARD_InitSRAM ( void ) ;


/****

* 変数

**********************************************************************************/


/****

* コード

**********************************************************************************/

#define SRAM_BASE 0x60000000

//#define SRAM_BASE 0x81000000

status_t BOARD_InitAsyncSRAM_CS1 ( void )

{

semc_config_t設定;

semc_sram_config_t xsram_config ;


uint32_t clockFrq = kCLOCK_Root_Semc ;


SEMC_GetDefaultConfig ( & config ) ;

config.dqsMode = kSEMC_Loopbackdqspad ;

SEMC_Init ( SEMC , & config ) ;


memset ( & config , 0 , sizeof ( semc_config_t )) ;

memset ( & xsram_config , 0 , sizeof ( semc_sram_config_t )) ;



xsram_config.address = 0x60000000 ;

xsram_config . memsize_kbytes= 512 ;

xsram_config . addrPortWidth= 16 ;

xsram_config portSize = kSEMC_PortSize16Bit ;

xsram_config.addrMode = kSEMC_AddrDataNonMux ;

xsram_config.syncMode = kSEMC_AsyncMode ;

xsram_config . advActivePolarity= kSEMC_AdvActiveLow ;

xsram_config . advLevelCtrl= kSEMC_AdvLow ;

xsram_config.burstLen = kSEMC_Nor_BurstLen1 ;


xsram_config . tWeLow_Ns= 25 ;

xsram_config . tWeHigh_Ns= 25 ;

xsram_config . tReLow_Ns= 25 ;

xsram_config . tReHigh_Ns= 25 ;

xsram_config . tTurnAround_Ns= 10 ;

xsram_config.cePinMux = kSEMC_MUXCSX1 ;

xsram_config.waitEnable = true ;

xsram_config.waitSample = true ;


xsram_config . tCeSetup_Ns= 25 ;

xsram_config . tCeHold_Ns= 20 ;

xsram_config . tAddrSetup_Ns= 25 ;

xsram_config . tAddrHold_Ns= 25 ;

xsram_config . tWriteSetup_Ns= 25 ;

xsram_config . tWriteHold_Ns= 25 ;

xsram_config.readCycle = 30 ;

xsram_config . readHoldTime_Ns= 25 ;


xsram_config . tCeInterval_Ns= 25 ;

xsram_config . tAddr2WriteHold_Ns= 25 ;

xsram_config.latencyCount= 3 ;

xsram_config.delayChain = 25 ;

xsram_config.addr27 = kSEMC_MORA27_NONE ;



SEMC -> IOCR |= 0x00908BB6 ;

// SEMC->IOCR |= 0x08;

return SEMC_ConfigureSRAMWithChipSelection ( SEMC , kSEMC_SRAM_CS1 , & xsram_config , clockFrq ) ;

}



/*!

* @brief メイン機能

*/

int main ( void )

{

/* ハードウェア初期化。*/

BOARD_ConfigMPU () ;

BOARD_InitPins () ;

BOARD_BootClockRUN () ;

BOARD_InitDebugConsole () ;


BOARD_InitAsyncSRAM_CS1 () ;


SEMC -> IOCR |= SEMC_IOCR_MUX_CSX1 ( 0x08 ) ;

PRINTF ( "\r\n SEMC SRAM MSpec を WAIT 書き込みテストで開始します。\r\n" ) ;

PRINTF ( "CCM_OBS_SEMC_CLK_ROOT: %d\r\n" , CLOCK_GetFreqFromObs ( CCM_OBS_SEMC_CLK_ROOT )) ;



//////////////////////////////////////////////////////////////////////////////////////////////

volatile uint16_t * sram_ptr = ( volatile uint16_t * ) 0x60000000 ;


uint16_t i = 0 ;

* sram_ptr = 0 ;


for ( i = 0 ; i <= 10 ; i ++ )

{

* sram_ptr = i ;

}


for ( i = 0 ; i <= 10 ; i ++ )

{

PRINTF ( "\r\n sram = %d \r\n" , sram_ptr ) ;

}

}

Re: i.MXRT1176: Question about accessing an external SRAM

こんにちは、 @RainerHL さん

私たちの製品にご関心を寄せ、コミュニティをご利用いただき、本当にありがとうございます。

1: あなたのコードはCSX1/CS1上でSEMC SRAMを設定していますが、テストは0x60000000にアクセスしており、これはRT1170の有効なSEMC SRAMマッピング i.MX ありません。これがメモリ管理障害の主な原因です。

mayliu1_1-1782110430487.pngmayliu1_1-1782110430487.png

0x60000000の代わりに、設定済みのCSX1デバイスに対応するSEMC SRAMベースアドレスウィンドウを使用してください。

2: 手動IOCR書き込み。リファレンス・マニュアルにはIOCR構成は静的であるべきと書かれていますが、動的再マッピングはサポートされていません。

mayliu1_0-1782110416135.pngmayliu1_0-1782110416135.png

mayliu1_2-1782110479824.pngmayliu1_2-1782110479824.png


3:プロジェクト内のMPU構成を確認してください。

4:PRINTF("\r\n sram = %d \r\n", sram_ptr);

これはポインタ値を表示するものであり、SRAMデータを表示するものではありません。例えば sram_ptr のようなポインタを逆参照する必要があるが、それが MemoryManage の障害の原因ではない。


お役に立てれば幸いです。

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

5月

标记 (1)
无评分
版本历史
最后更新:
‎06-23-2026 02:33 AM
更新人: