Multi Source Translation Content

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

Multi Source Translation Content

ディスカッション

ソート順:
SAE J1939スタック 私はFRDM-A-S32K344ボードとS32K3 SDK 3.0.0を使用しています。FlexCANドライバがSAE J1939プロトコルスタックをサポートしているかどうか確認していただけますか?さらに、NXPからこのSDKバージョン3.0.0と互換性のある公式または推奨のSAE J1939スタックは入手可能でしょうか?CAN構成 Re: SAE J1939 Stack こんにちは、 @ganavi1 さん。 S32K3デバイスはFlexCAN IPを提供します。S32K3XXのリファレンスマニュアルには、「FlexCANは、ISO 11898-1:2015規格およびCAN 2.0 Part Bプロトコル仕様に従ってCANプロトコルを実装した通信コントローラです。」と記載されています。 J1939もCAN 2.0Bプロトコルを使用しているため、FlexCAN IPブロックと完全に互換性があります。 しかし、NXPはS32K3用のJ1939スタックを提供していません。VectorやSimmaなどの第三者プロバイダーに連絡する必要があります。 よろしくお願いします、 ジュリアン
記事全体を表示
SAE J1939 堆栈 我正在使用带有 S32K3 SDK 3.0.0 的 FRDM-A-S32K344 主板。请确认 FlexCAN 驱动程序是否支持 SAE J1939 协议栈?此外,恩智浦官方或推荐的 SAE J1939 协议栈是否与 SDK 3.0.0 版兼容?和 CAN 配置 Re: SAE J1939 Stack 嗨,@ganavi1、 S32K3 设备提供 FlexCAN IP。引用 S32K3XX 的参考手册:" FlexCAN 是一款根据 ISO 11898-1:2015 标准和 CAN 2.0 B 部分协议规范实现 CAN 协议的通信控制器。" 由于 J1939 也使用 CAN 2.0B 协议,因此与 FlexCAN IP 模块完全兼容。 不过,恩智浦没有为 S32K3 提供任何 J1939 栈。您需要联系第三方供应商,例如Vector或Simma。 致以最诚挚的问候, Julián
記事全体を表示
mc33774 醒来 你好。 目前,我使用 S32K310、MC33665A 和 MC33774 芯片进行电压采集。目前,我的 MC33665A 运行正常,MC33774 的电源和电路也正常。但是,当我通过 MC33665A 发送唤醒帧来唤醒 MC33774 时,总线链中的两个 AFE 都无法唤醒(这是通过测量 VDDC 电压是否可以达到 5V 来确定的)。我目前的唤醒方法是先发送一帧唤醒帧,然后延迟至少 10 毫秒再发送另一帧唤醒帧。无法正常醒来的可能原因是什么? 另一个问题是发送唤醒命令后,MC33774 没有唤醒。然而,当我发送单个电压采集指令时,第一个 MC33774 被唤醒,并在 DADD=0 状态下响应正确的电压值。这合理吗? wakeup frame唤醒帧 AFE_1 responds with data in the DADD=0 stateAFE_1在 DADD=0 状态下响应数据 MC33774 initialization processMC33774 初始化过程 Re: MC33774 WAKE UP HI. 我尝试了这种方式,但是这种枚举方式下我的AFE1被枚举为了DADD=2,相当于我发送的枚举AFE1为DADD=1的报文被忽略或者被当成了唤醒帧。唤醒帧和枚举帧的时间间隔设置了10ms,应该满足手册中的2.4ms。请问是不是我的唤醒帧发送格式错误? Re: MC33774 WAKE UP Hi  可以尝试: 唤醒第一个 33774 → 给第一个 33774 写入 DADD → 唤醒第二个 33774 → 给第二个 33774 写入 DADD→唤醒第 n 个33774 →给第 n 个 33774 写入 DADD。流程图如下所示:
記事全体を表示
MC33774 WAKE UP HI. Currently, I am using the S32K310, MC33665A, and MC33774 chips to perform voltage acquisition. At present, my MC33665A is operating normally, and the power supply and circuit of MC33774 are also normal. However, when I send a wakeup frame through MC33665A to wake up MC33774, neither of the two AFEs in the bus chain cannot be awakened (this is determined by measuring whether the VDDC voltage can reach 5V). My current wakeup method is to send one frame of the wakeup frame and then delay for at least 10ms before sending another frame of the wakeup frame. What could be the possible reasons for the inability to wake up normally? Another issue is that after sending the wakeup command, MC33774 did not wake up. However, when I sent a single voltage acquisition instruction, the first MC33774 was awakened, and it responded with the correct voltage value in the DADD=0 state. Is this reasonable? wakeup framewakeup frame AFE_1 responds with data in the DADD=0 stateAFE_1 responds with data in the DADD=0 state MC33774 initialization processMC33774 initialization process Re: MC33774 WAKE UP HI. I tried this method, but with this enumeration method my AFE1 is enumerated as DADD=2, which means that the messages I send with enumerated AFE1 as DADD=1 are ignored or treated as wakeup frames. The time interval between wakeup frame and enumeration frame is set to 10ms, which should meet the 2.4ms in the manual, is it possible that my wakeup frame is sent in the wrong format? Re: MC33774 WAKE UP Hi. You can try: Wake up the first 33774 → write DADD to the first 33774 → wake up the second 33774 → write DADD to the second 33774 → wake up the nth 33774 → write DADD to the nth 33774. the flowchart is shown below:
記事全体を表示
S32DSコマンドラインを使用してTCPIPスタックのサンプルをインポート、コードを更新、クリーンビルドする方法 拝啓、 S32DSコマンドラインを使用して、コードのインポート、更新、およびクリーンビルドを実行したい。 RTD のサンプル (Dio_Example_S32K388) は正常に実行できますが、lwip_FreeRTOS_s32k388 のようなスタック内のサンプルは失敗します。 確認を手伝っていただけますか?あるいは、その方法を教えていただけますか? 以下に示すように、S32K388とS32K344のいくつかの例をテストしました。 現在はlwip_FreeRTOS_s32k388のみが失敗しています。 lwip_FreeRTOS_s32k344 は問題ありません。 FreeRTOS_Toggle_Led_Example_S32K388 と FreeRTOS_Toggle_Led_Example_S32K344 は問題ありません。 Dio_Example_S32K388とUart_Example_S32K388は問題ありません。   そして、私の顧客は現在lwip_FreeRTOS_s32k388を使用しているので、この問題を解決する必要があります。   テスト環境: S32DS3.6.3 RTD : S32K3_S32M27x リアルタイム・ドライバ ASR R21-11 バージョン 6.0.0 QLP04 FREERTOS: SW32K3 FreeRTOS 11.1.0バージョン6.0.0 コードドロップ TCPIP スタック: SW32K3_S32M27X_TCPIP_STACK_3.0.0_D2507 ありがとうございます。 BR、 ショーン・ウー Re: How to use S32DS command line to import, update code, and cleanbuild the example in TCPIP stacks こんにちは、 @PavelL さん。 以前そのThreadを読んで、そこに書かれていたコマンドを試してみました。しかし、それでも失敗した。 -HeadlessToolが必要です。そうでない場合、S32DS GUIウィンドウがポップアップ表示されてしまいますが、これはお客様のご要望とは異なります。 lwip_FreeRTOS_s32k344 は私のコマンドで動作しました。 ご提案いただいたコマンドを使用して、lwip_FreeRTOS_s32k388 を試していただけますでしょうか? 私の顧客はlwip_FreeRTOS_s32k388を使用しているため、この問題を解決する必要があります。   ありがとうございます。 BR、 ショーン・ウー Re: How to use S32DS command line to import, update code, and cleanbuild the example in TCPIP stacks こんにちは、 @seanwu さん。 この関連Threadに基づくと: CLIでの設定の読み込みとビルドに失敗しました プロジェクトに合わせて、以下の手順を実行する必要があります(プロジェクトによっては、アップデートが必要になる場合があります)。 -Load %PROJECT_PATH% \ %PROJECT_NAME% .mexで mex をロードします この行は「コードの更新」とは同等ではありません。-HeadlessTool ペリフェラル を削除してください。 -MCU S32K388で MCU を明示的に設定します -SDKVersion PlatformSDK_S32K3 を使用してください。 「コードの更新をクリック」 -ExportAll %PROJECT_PATH% あるいは、デバッグ情報を追加して、-consoleLog オプションで何が起こっているかを確認してください。 つまり、「更新コード」は次のようになります。 .\s32dsc.exe -noSplash ^ -アプリケーション com.nxp.swtools.framework.application ^ --launcher.ini %DS_INSTALL% \eclipse\s32ds.ini ^ -データ%WORKSPACE% ^ -sdkPath %RTD_PATH% ^ -MCU S32K388 ^ -SDKVersion PlatformSDK_S32K3 ^ -Load %PROJECT_PATH% \ %PROJECT_NAME% .mex^ -ExportAll %PROJECT_PATH% サンプルコードlwip_FreeRTOS_s32k344は、デフォルト設定が原因で偶然にしか動作しない場合があります。 よろしくお願いいたします。 パベル Re: How to use S32DS command line to import, update code, and cleanbuild the example in TCPIP stacks こんにちは、 @PavelL さん。 「 tcpip_stack_1」を確認し、tcpip_itm_manifest.xmlに「S32K388」を追加します。 S32DSは「コードの更新」後にフォルダを生成できますが、コマンドラインでは生成できません。 ありがとうございます。 BR、 ショーン・ウー Re: How to use S32DS command line to import, update code, and cleanbuild the example in TCPIP stacks こんにちは、 @seanwu さん。 mexファイルをダブルクリックしてください。「ペリフェラル」アイコンをクリックしてください。これが見えますか? tcpip_stack が表示されず、SDK コンポーネント管理ウィンドウでもスタックが表示されない場合は、このThreadS32K388 tcpip stack 4.0.0 missing lwip folder while compiling で議論されているように、tcpip_itm_manifest.xml を修正してみてください。 よろしくお願いいたします。 パベル Re: How to use S32DS command line to import, update code, and cleanbuild the example in TCPIP stacks こんにちは、 @PavelL さん。 コマンドライン(添付ファイル参照)を使用してlwip_FreeRTOS_s32k388の「コードを更新」しましたが、以下のように「FreeRTOS」 、 「RTD」 、 「stacks」フォルダとフォルダ内のファイルが生成されません(画像はS32DSを使用した「コードの更新」です)。 Re: How to use S32DS command line to import, update code, and cleanbuild the example in TCPIP stacks こんにちは、 @seanwu さん。 インストール設定は正しいようです。 「失敗した」とはどういう意味ですか?ビルドエラーか、TCP/IP機能の問題でしょうか? 私の例であるExample S32K388 GMAC0 lwIP FreeRTOS S32DS 3.6.1 RTD600をご確認ください。変更点の一覧も記載しています。 よろしくお願いいたします。 パベル
記事全体を表示
Zephyr on all cores of a iMX93 Hi, I want to run a RTOS on all cores of a iMX93. Is that possible? On the Zephyr website I see there is a project to run Zephyr on the M33 core of the FRDM-IMX93 board. And there is also a project to run Zephyr on a A55 core. But can I run them both? And can I run a separate Zephyr project on both A55 processors? How does it work with the initialization of the chip. Like the initialization of the clock and memory controller? Who will do that? If not possible, can I run a RTOS on the M33 core using MCUXPresso, which may then initialize the chip? And use Zephyr for both the A55 cores? What is the way to get a RTOS running on all cores? Re: Zephyr on all cores of a iMX93 Hi @simmania  For two zephyr projects running on 2x A55, this is not supported. The supported framework is A55 running Linux -->Jailhouse --> other A55 running zephyr, so Jailhouse should manage the hardware isolation. If not possible, can I run a RTOS on the M33 core using MCUXPresso, which may then initialize the chip? And use Zephyr for both the A55 cores? --> The i.MX93 supports low power boot which kick up M33 from bootrom. To achieve your goal, it would require rewriting too much of the SDK's code..The core issue is that who initialize DDR. Based on the documentation, retaining U-Boot is the optimal choice, as it enables U-Boot to load Zephyr for both the M33 and A55 processors simultaneously. https://docs.zephyrproject.org/latest/boards/nxp/imx93_evk/doc/index.html Best Regards, Zhiming Re: Zephyr on all cores of a iMX93 So a NXP employee says that it is possible using harpoon. And the NXP TechSupports says that it is not possible. Very confusing. Re: Zephyr on all cores of a iMX93 Both of the A core and mcore in imx93 support zephyr release, you could go to our zephyr landing page to get the MPU Zephyr use guide, if you wan tot run zephyr on both A core and m core at the same time , you could look for the harpoon release from NXP https://www.nxp.com/design/design-center/software/embedded-software/zephyr-os-for-edge-connected-devices:ZEPHYR-OS-EDGE Re: Zephyr on all cores of a iMX93 @simmania  you could run harpoon on one of A core, another Acore run Zephyr, mcore run zephyr, otherwise you could run native zephyr on A core and use bootrom running mcore zephyr  please refer to Program flash.bin to SD/eMMC with UUU — MCUXpresso SDK Documentation and copy zephyr.bin to m33_image.bin under imx-mkimage/i.MX9  in step 4 to create flash bin Get the boot images and the imx-mkimage source repository from corresponding Linux BSP release. The boot images required to be put into imx-mkimage/i.MX9 are: - u-boot-imx93evk.bin-sd (rename to u-boot.bin) - u-boot-spl.bin-imx93evk-sd (rename to u-boot-spl.bin) - bl31-imx93.bin (rename to bl31.bin) - mx93a0-ahab-container.img - lpddr4_dmem_1d_v202201.bin - lpddr4_dmem_2d_v202201.bin - lpddr4_imem_1d_v202201.bin - lpddr4_imem_2d_v202201.bin Re: Zephyr on all cores of a iMX93 In the Harpoon documentation I found this: Harpoon provides an environment for developing real-time demanding applications on an RTOS running on one (or several) Cortex-A core(s) in parallel of a Linux distribution, leveraging the 64-bit Arm architecture for higher performance. So there is still Linux needed on some cores. So it seems running Zephyr on all cores of a iMX93 is not possible. Re: Zephyr on all cores of a iMX93 @simmania  A core user guide is here  UG10199: NXP MPU Cortex-A Core Zephyr User Guide | NXP Semiconductors in Zephyr webpage has already mention 93 A core and mcore supported i.MX93 EVK — Zephyr Project Documentation  harpoon user guide UG10170: Harpoon User's Guide | NXP Semiconductors Re: Zephyr on all cores of a iMX93 Tanks for the answer. But we are not developing with iMX93 yet and for us the answer is still not clear. We are in the process of selecting hardware for a new project. The only thing we need to know now is if it is possible to run Zephyr on all cores without the need of Linux.
記事全体を表示
エントリーレベルの民生用グラフィックアプリケーション向けマイクロコントローラの選定 サポートチームの皆様、こんにちは。 民生用グラフィックアプリケーション向けのエントリーレベルのマイクロコントローラの選定について、サポートを求めています。 要件: ディスプレイ:最大320×240ピクセルの小型ディスプレイ メモリ:約1MBのフラッシュメモリと256KBのRAM 電源:できればメインストリームまたは低電力 ペリフェラル: 3つのSPIインスタンス 2つのI2Cインスタンス 2つのADCチャネル ペリフェラルは専用センサと組み合わせて使用されます。 このアプリケーションは、小型のグラフィカルインターフェースと専用のセンサ接続部を備えた消費者向け製品です。エントリーレベルのソリューションで、ディスプレイ、ペリフェラルインターフェース、および基本的なグラフィックス要件をサポートできる、コスト効率の良いマイクロコントローラを探しています。 質問: これらの要件に最も適したマイクロコントローラのファミリまたは特定の部品番号をお勧めいただけますか? 開発の出発点として利用できる既存の事例や参考プロジェクトはありますか? よろしくお願いいたします。 女源 MCX C MCX N Re: Microcontroller selection for entry-level consumer graphical application こんにちは、 @Yuza さん。 投稿ありがとうございます。 お客様のご要望に基づき、MCX N94x / N54xをお勧めいたします。 MCXN94x/54x: MCX N94、N54、N53、N52、N24マイクロコントローラ|NXPセミコンダクターズ 主な理由はメモリの適合性です。目標とする容量はフラッシュメモリ約1MB、RAM約256KBですが、MCXN546/MCXN946デバイスはフラッシュメモリ1MB、SRAM 352KB、MCXN547/MCXN947デバイスはフラッシュメモリ2MB、SRAM 512KBを搭載しており、いずれも最大150MHzで動作します。 このフォントファミリは、小型のグラフィカルインターフェースにも適しています。NXPは、MCX Nファミリをインダストリアル/民生用HMIアプリケーション向けに位置付けており、製品概要の中でディスプレイのサポートを強調している。MCX Nシリーズは、ディスプレイや高速I/O用途向けのSmartDMAを搭載しており、LCDインターフェースにはFlexIOを使用できます。 MCX N94x / N54x シリーズは、10 個の低消費電力 Flexcomm インスタンスを統合しており、これらは LPSPI、LPUART、および LPI2C 機能をカプセル化しているため、3x SPI や 2x I2C などの要件を満たすのに十分なシリアルインターフェース リソースを提供します。 ドキュメントには、MCX N シリーズ MCU でのグラフィックス向けデータ処理について説明したAN14172 、「MCX N シリーズ MCU での SmartDMA を使用したグラフィックス」が含まれており、 lvgl_demo_widgets_bmという名前の SDK サンプルが含まれています。この例では、FlexIOを使用してMCU8080インターフェースをエミュレートし、3.5インチLCDを駆動します。SmartDMAはデータをFlexIOのデータレジスタに転送します。さらに、MCX NはNXPのMCUXpresso GUIエコシステムにおいて、LVGLベースの開発をサポートするプラットフォームとしてリストアップされています。弊社のSDKにはLVGLのデモも含まれています。 また、評価用のEVKボードもご用意しております:産業用IoTソリューション向けMCXN947 FRDMボード|NXPセミコンダクターズ お役に立てば幸いです。 BR セレステ
記事全体を表示
RT1170 EVKB M4 メモリ速度 RT1170 EVKB上でM4コアのメモリアクセスに関するベンチマークテストを実施しています。これらの数値は、M4がボード上のSDRAMとOCRAMにアクセスする際に想定される値ですか?非常に動作が遅いようです。 M4のアクセス時間がAxiファブリックなどの関係で長くなるという情報をいくつか読みましたが、これは非常に遅いように思えます。設定のどこかに何か見落としがあって、必要以上に動作が遅くなっているのでしょうか? このベンチマークにはいくつかの異なるメモリソース/デスティネーションが含まれていますが、私が最も改善したいのはSDRAMとOCRAM間のEDMAです。私は、SDRAM非キャッシュからOCRAM非キャッシュへのM4セットのEDMA転送を行うマルチトラックオーディオストリーミングエンジンを実装しています。M7コアは、共有ocramからバッファを消費します。 しかし、このテストは独立して実施されるため、仲裁は発生しないか、ごくわずかしか発生しないはずです。 SDRAMとOCRAM領域は両方ともキャッシュ不可に設定されており、OCRAM領域はMPUConfigで共有可能にも設定されている、という理解で合っていますか? オーディオストリーマーのコピーベンチマーク、Cortex-M4 @ 400 MHz 操作: 再生 16 x 4096 B SDRAM_NC->OCRAM、記録 8 x 4096 B OCRAM->SDRAM_NC バイト数: 再生=65536 記録=32768 合計=98304   CPU memcpy: 再生コピー              1532202 cyc 3830.505 us レコードコピー                  530291 cyc 1325.727 us 散布図合計                2062493 cyc 5156.232 us シングル96Kバルク              2301811 cyc 5754.527 us チェックサム=239   メモリ領域コピーマトリックス(1行あたり32768バイト): リージョン src: SDRAM_C=80008000 SDRAM_NC=80818000 SHARED=202B8EC0 NCACHE=20248AA0 OCRAM_CACHE=2026E3C0 MPU/キャッシュ: CTRL=0x00000007 TYPE=0x00000800 PSCCR=0x00000003 R4=0x80000004/0x03100033 R5=0x80000005/0x0303002d EDMAは、両方のエンドポイントがキャッシュ不可/DMAセーフの場合にのみ実行されます。 SDRAM_C->OCRAM_CACHE        バイト数=32768、CPU=1201410、サイクル数=3003.525、US=10.90 MB/秒 | edma=スキップ、キャッシュ可能、チェックサム=338 SDRAM_NC->OCRAM_CACHE        バイト数=32768、CPU=1037590、サイクル数2593.975、US値12.63 MB/秒 | edma=スキップ、キャッシュ可能、チェックサム=602 SDRAM_NC->SHARED_OCRAM      バイト=32768 CPU=  781109 cyc 1952.772 us 16.78 MB/s | edma=ok  779805 cyc 1949.512 us 16.80 MB/s checksum=602/602 | edma+cache=ok  858144 cyc 2145.360 us 15.27 MB/s チェックサム=602 SDRAM_NC->NCACHE_OCRAM      バイト=32768 CPU=  777897 cyc 1944.742 us 16.84 MB/s | edma=ok  751101 cyc 1877.752 us 17.45 MB/s checksum=602/602 | edma+cache=ok  853273 cyc 2133.182 us 15.36 MB/s チェックサム=602 OCRAM_CACHE->SDRAM_NC        バイト=32768 CPU=  750396 cyc 1875.990 us 17.46 MB/s | edma=キャッシュ可能チェックサムをスキップ=1204 SHARED_OCRAM->SDRAM_NC      バイト=32768 CPU=  531143 cyc 1327.857 us 24.67 MB/s | edma=ok  570792 cyc 1426.980 us 22.96 MB/s checksum=610/610 | edma+cache=ok  670564 サイクル 1676.410 us 19.54 MB/秒 チェックサム=610 NCACHE_OCRAM->SDRAM_NC      バイト=32768 CPU=  541568 cyc 1353.920 us 24.20 MB/s | edma=ok  549911 cyc 1374.777 us 23.83 MB/s checksum=940/940 | edma+cache=ok  649852 サイクル 1624.630 us 20.16 MB/秒 チェックサム=940 SDRAM_NC->SDRAM_NC          バイト=32768 CPU=  896656 cyc 2241.640 us 14.61 MB/s | edma=ok  997686 cyc 2494.215 us 13.13 MB/s checksum=602/602 | edma+cache=ok  1130798 サイクル 2826.995 us 11.59 MB/秒 チェックサム=602 OCRAM_CACHE->OCRAM_CACHE    バイト=32768 CPU=  768904 cyc 1922.260 us 17.04 MB/s | edma=スキップ キャッシュ可能 チェックサム=1204 SHARED_OCRAM->SHARED_OCRAM  バイト=32768 CPU=  425929 cyc 1064.822 us 30.77 MB/s | edma=ok  433498 cyc 1083.745 us 30.23 MB/s checksum=610/610 | edma+cache=ok  542913 cyc 1357.282 us 24.14 MB/s チェックサム=610   EDMAスキャッター/ギャザー 24 x 4K、Nバイト=4096: ops=24 nbytes=4096 ok=1 ディスクリプタの設定+開始          58942 サイクル 147.355 米ドル 完了するまで待機/エラー        2031292 cyc 5078.230 us 合計                        2090234 cyc 5225.585 us チェックサム=239 チャネルフラグ=0x1 エラーフラグ=0x0 残りの値=0 csr=0x0088 引用元=1 ビット元=1   EDMAスキャッター/ギャザー 24 x 4K、Nバイト=32: ops=24 nbytes=32 ok=1 ディスクリプタの設定+開始          47526サイクル 118.815米ドル 完了するまで待機/エラー        2055017 cyc 5137.542 us 合計                        2102543 cyc 5256.357 us チェックサム=239 チャネルフラグ=0x1 エラーフラグ=0x0 残り=0 csr=0x0088 引用=128 ビット=128   EDMAシングル4K、NBYTES=4096: ops=1 nbytes=4096 ok=1 ディスクリプタの設定+開始          5713サイクル 14.282米国 完了するまで待機/エラー          93592 cyc 233.980 us 合計                          99305 cyc 248.262 us チェックサム=239 チャネルフラグ=0x1 エラーフラグ=0x0 残りの値=0 csr=0x0088 引用元=1 ビット元=1   EDMAシングル4K、NBYTES=32: ops=1 nbytes=32 ok=1 ディスクリプタの設定+開始          5344サイクル 13.360米ドル 完了するまで待機/エラー          94609 cyc 236.522 us 合計                          99953 cyc 249.882 us チェックサム=239 チャネルフラグ=0x1 エラーフラグ=0x0 残り=0 csr=0x0088 引用=128 ビット=128   EDMAシングル96K、NBYTES=4096: ops=1 nbytes=4096 ok=1 ディスクリプタの設定+開始          5867サイクル 14.667米ドル 完了するまで待機/エラー        2230360 cyc 5575.900 us 合計                        2236227 cyc 5590.567 us チェックサム=239 チャネルフラグ=0x1 エラーフラグ=0x0 残りの値=0 csr=0x0088 引用元=24 ビット数=24   EDMAシングル96K、NBYTES=32: ops=1 nbytes=32 ok=1 ディスクリプタの設定+開始          5713サイクル 14.282米国 完了するまで待機/エラー        2256234 cyc 5640.585 us 合計                        2261947 cyc 5654.867 us チェックサム=239 チャネルフラグ=0x1 エラーフラグ=0x0 残りの値=0 csr=0x0088 引用元=3072 ビット元=3072 DMAMUX1_CHCFG[2]=0xa0000000 DMA1_ERQ=0x80 DMA1_ES=0x0 ============================================================ 私のリンカー: /* M4/armgcc/MIMXRT1176xxxxx_cm4_flexspi_nor.ld * ITCM/DTCMホットセクションとSDRAMを備えたM4 XIP-from-FlexSPI * OCRAMパーティション(1MB @ 0x2024_0000): * - 128KB DMAセーフ / デバイス/非キャッシュ : 0x20240000..0x2025FFFF * - 128KB M4 キャッシュ可能なローカルスクラッチ: 0x20260000..0x2027FFFF * - 768KB 共有 (M4<->M7) 非キャッシュ : 0x20280000..0x2033FFFF * - SHARED の最後の 8KB は M7 専用に予約されています: 0x2033E000..0x2033FFFF (M4 リンカー領域には含まれません) * * 追加の固定カーブアウト(両方で共有される領域内、M7 DMA スライスの前): * - M4 用の 36KB 固定共有 SysView/RTT ウィンドウ : 0x20335000..0x2033DFFF * - 共有メイン(IPCなど用):0x20280000..0x20334FFF */ エントリ(リセットハンドラー) HEAP_SIZE = DEFINED(__heap_size __) ? __ heap_size__ : 0x0400; STACK_SIZE = DEFINED(__stack_size __) ? __ stack_size__ : 0x0400; SDRAM_BASE = 0x80000000; SDRAM_SIZE = 0x04000000; /* 64 MB */ SDRAM_C_SIZE = 0x00800000; /* 8 MB キャッシュ可能 */ SDRAM_NC_BASE = SDRAM_BASE + SDRAM_C_SIZE; /* 0x80800000 */ SDRAM_NC_SIZE = SDRAM_SIZE - SDRAM_C_SIZE; /* 56 MB */ M4_FLASH_BASE = 0x33600000; M4_FLASH_SIZE = 0x00A00000; /* OCRAM: 1MB */ OCRAM_BASE = 0x20240000; OCRAM_SIZE = 0x00100000; /* ローカルOCRAM合計 = DMA 128KB + キャッシュ可能なスクラッチ 128KB = 256KB */ OCRAM_LOCAL_TOTAL_SIZE = 0x00040000; /* 256KB */ /* DMAセーフな非キャッシュローカルウィンドウ(最初の128KB) */ OCRAM_DMA_NC_BASE = 0x20240000; OCRAM_DMA_NC_SIZE = 0x00020000; /* 128KB */ /* M4 キャッシュ可能なスクラッチウィンドウ (次の 128KB) */ OCRAM_LOCAL_C_BASE = 0x20260000; OCRAM_LOCAL_C_SIZE = 0x00020000; /* 128KB */ /* 共有OCRAMは0x20280000から開始します(残り768KB)*/ OCRAM_SHARED_BASE = OCRAM_BASE + OCRAM_LOCAL_TOTAL_SIZE; /* 0x20280000 */ OCRAM_SHARED_SIZE_FULL = OCRAM_SIZE - OCRAM_LOCAL_TOTAL_SIZE; /* 0x000C0000 */ /* 共有OCRAMの最後の8KBをM7専用のDMAバッファ用に予約します(M4領域は除外します) */ M7_DMA_OCRAM_BYTES = 0x00002000; /* 8KB */ OCRAM_SHARED_FOR_BOTH_SIZE = OCRAM_SHARED_SIZE_FULL - M7_DMA_OCRAM_BYTES; /* 0x000BE000 */ /* 共有領域(36KB)の末尾にあるM4用のSysView/RTTの切り出しを修正しました*/ SYSVIEW_M4_BYTES = 0x00009000; /* 36KB */ /* 共有メインサイズ(固定36KBウィンドウを除くすべて) */ OCRAM_SHARED_MAIN_SIZE = OCRAM_SHARED_FOR_BOTH_SIZE - SYSVIEW_M4_BYTES; /* 0x000B5000 */ /* SysView M4 ベース (修正済み) */ OCRAM_SYSVIEW_M4_BASE = OCRAM_SHARED_BASE + OCRAM_SHARED_MAIN_SIZE; /* 0x20335000 */ OCRAM_SYSVIEW_M4_SIZE = SYSVIEW_M4_BYTES; /* 0x00009000 */ メモリ { m_interrupts (RX) : ORIGIN = M4_FLASH_BASE、LENGTH = 0x00000400 m_text (RX) : ORIGIN = M4_FLASH_BASE + 0x400、LENGTH = M4_FLASH_SIZE - 0x00000400 m_itcm (RX) : ORIGIN = 0x1FFE0000、LENGTH = 0x00020000 m_dtcm (RW) : ORIGIN = 0x20000000、LENGTH = 0x00020000 /* OCRAMパーティション */ m_ncache_local (RW) : ORIGIN = OCRAM_DMA_NC_BASE、LENGTH = OCRAM_DMA_NC_SIZE m_ocram_cache (RW) : ORIGIN = OCRAM_LOCAL_C_BASE、LENGTH = OCRAM_LOCAL_C_SIZE m_shared_ocram_main (RW) : ORIGIN = OCRAM_SHARED_BASE、LENGTH = OCRAM_SHARED_MAIN_SIZE m_shared_sysview_m4 (RW) : ORIGIN = OCRAM_SYSVIEW_M4_BASE、LENGTH = OCRAM_SYSVIEW_M4_SIZE m_sdram_c (RW) : ORIGIN = SDRAM_BASE、LENGTH = SDRAM_C_SIZE m_sdram_nc (RW) : ORIGIN = SDRAM_NC_BASE、LENGTH = SDRAM_NC_SIZE } セクション { __NCACHE_REGION_START = OCRAM_BASE; __NCACHE_REGION_SIZE = OCRAM_SIZE; __SHARED_OCRAM_START = ORIGIN(m_shared_ocram_main); __SHARED_OCRAM_SIZE = LENGTH(m_shared_ocram_main); __SYSVIEW_M4_BASE = ORIGIN(m_shared_sysview_m4); __SYSVIEW_M4_SIZE = LENGTH(m_shared_sysview_m4); __OCRAM_CACHE_START = ORIGIN(m_ocram_cache); __OCRAM_CACHE_SIZE = LENGTH(m_ocram_cache); .shared_ocram (NOLOAD) : { . = ALIGN(32); __SHARED_OCRAM_START__ = .; *(.shared_ocram*) *(SharedOcram*) . = ALIGN(32); __SHARED_OCRAM_END__ = .; ASSERT((__SHARED_OCRAM_END __ - __ SHARED_OCRAM_START__) <= LENGTH(m_shared_ocram_main), 「shared_ocramセクションが大きすぎます」 } > m_shared_ocram_main .shared_sysview_m4 (NOLOAD) : { . = ALIGN(32); __SYSVIEW_M4_START__ = .; KEEP(*(.shared_sysview_m4)) KEEP(*(.shared_sysview_m4.*)) . = ALIGN(32); __SYSVIEW_M4_END__ = .; ASSERT((__SYSVIEW_M4_END __ - __ SYSVIEW_M4_START__) <= LENGTH(m_shared_sysview_m4), 「shared_sysview_m4 セクションが大きすぎます (最大 36KB)」 } > m_shared_sysview_m4 .ocram_cache (NOLOAD) : { . = ALIGN(32); __OCRAM_CACHE_START__ = .; *(.ocram_cache*) *(OcramCache*) . = ALIGN(32); __OCRAM_CACHE_END__ = .; ASSERT((__OCRAM_CACHE_END __ - __ OCRAM_CACHE_START__) <= LENGTH(m_ocram_cache), 「ocram_cache セクションが大きすぎます」 } > m_ocram_cache .割り込み: { __VECTOR_TABLE = .; __ベクトル = .; . = ALIGN(4); KEEP(*(.isr_vector)) . = ALIGN(4); } > m_interrupts /* ================================================================ * ITCM のホット コード (VMA=ITCM、LMA は後で計算されます) * ======================================================================= */ .itcm_text : AT(__itcm_text_load__) { . = ALIGN(32); __itcm_text_start__ = .; *(.itcm_text*) *(ITCM_TEXT*) /* あなたのホットなTU */ */DspParameterManager.cpp.obj(.text。文章。*) */audio_param_task.cpp.obj(.text。文章。*) */StepSequencer.cpp.obj(.text。文章。*) */sequencer_task.cpp.obj(.text。文章。*) /* MU ISR(複数ユニット割り込みサービスルーチン) - シンボルセクション名別 */ *(.text.MUB_IRQHandler) /* FreeRTOS のホットビット - シンボルセクション名別 */ *(.text.SVC_Handler) *(.text.PendSV_Handler) *(.text.SysTick_Handler) *(.text.vPortEnterCritical) *(.text.vPortExitCritical) *(.text.vPortValidateInterruptPriority) *(.text.xPortStartScheduler) *(.text.vPortSetupTimerInterrupt) *(.text.xTaskIncrementTick) *(.text.vTaskSwitchContext) *(.text.vTaskGenericNotifyGiveFromISR) *(.text.xTaskGenericNotify) *(.text.xQueueGenericSendFromISR) *(.text.xQueueGiveFromISR) . = ALIGN(32); __itcm_text_end__ = .; } > m_itcm /* ================================================================ * DTCMにおけるホットロードデータ(LMAは後日計算) * ======================================================================= */ .dtcm_rodata : AT(__dtcm_rodata_load__) { . = ALIGN(32); __dtcm_rodata_start__ = .; */DspParameterManager.cpp.obj(.rodata.rodata.*) */audio_param_task.cpp.obj(.rodata.rodata.*) */StepSequencer.cpp.obj(.rodata.rodata.*) */sequencer_task.cpp.obj(.rodata.rodata.*) . = ALIGN(32); __dtcm_rodata_end__ = .; } > m_dtcm /* ================================================================ * DTCMにおけるホットデータ(LMAは後日算出) * ======================================================================= */ .dtcm_data : AT(__dtcm_data_load__) { . = ALIGN(32); __dtcm_data_start__ = .; *(.dtcm_data*) *(DTCM_DATA*) . = ALIGN(32); __dtcm_data_end__ = .; } > m_dtcm /* ================================================================ * FLASH XIP TEXT/RODATA (すべて) * ======================================================================= */ 。文章 : { . = ALIGN(4); *(.text .text*) *(.rodata .rodata*) *(.glue_7) *(.glue_7t) *(.eh_frame) KEEP(*(.init)) KEEP(*(.fini)) . = ALIGN(4); } > m_text .ARM.extab : { *(.ARM.extab*.gnu.linkonce.armextab.*)} > m_text Arm : { __exidx_start = .; *(.ARM.exidx*) __exidx_end = .; } > m_text .ctors : { __CTOR_LIST__ = .; KEEP (*crtbegin.o(.ctors)) KEEP (*crtbegin?.o(.ctors)) KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o).ctors)) KEEP (*(SORT(.ctors.*))) KEEP (*(.ctors)) __CTOR_END__ = .; } > m_text .dtors : { __DTOR_LIST__ = .; KEEP (*crtbegin.o(.dtors)) KEEP (*crtbegin?.o(.dtors)) KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o).dtors)) KEEP (*(SORT(.dtors.*))) KEEP (*(.dtors)) __DTOR_END__ = .; } > m_text .preinit_array : { PROVIDE_HIDDEN (__preinit_array_start = .); KEEP (*(.preinit_array*)) PROVIDE_HIDDEN (__preinit_array_end = .); } > m_text .init_array : { PROVIDE_HIDDEN (__init_array_start = .); KEEP (*(SORT(.init_array.*))) KEEP (*(.init_array*)) PROVIDE_HIDDEN (__init_array_end = .); } > m_text .fini_array : { PROVIDE_HIDDEN (__fini_array_start = .); KEEP (*(SORT(.fini_array.*))) KEEP (*(.fini_array*)) PROVIDE_HIDDEN (__fini_array_end = .); } > m_text /* ================================================================ * 重大な修正: * 上記のすべての flash-resident セクションの後に load-images を開始してください。 * この時点で、「.」はFlashコンテンツの本当の終わりです。 * ======================================================================= */ __DATA_ROM = .; __itcm_text_load __ = __ DATA_ROM; __dtcm_rodata_load __ = __ itcm_text_load__ + SIZEOF(.itcm_text); __dtcm_data_load __ = __ dtcm_rodata_load__ + SIZEOF(.dtcm_rodata); /* NXP の起動時に .data が期待されますLMA at __etext */ __etext = __ dtcm_data_load__ + SIZEOF(.dtcm_data); .data : AT(__etext) { . = ALIGN(4); __DATA_RAM = .; __data_start__ = .; *(。データ) *(。データ*) *(データクイックアクセス) KEEP(*(.jcr*)) . = ALIGN(4); __data_end__ = .; } > m_dtcm __NDATA_ROM = __etext + (__データ終了__ - __データ開始__); .ncache.init : AT(__NDATA_ROM) { __noncachedata_start__ = .; *(NonCacheable.init) . = ALIGN(4); __noncachedata_init_end__ = .; } > m_ncache_local .ncache (NOLOAD) : { (キャッシュ不可) . = ALIGN(4); __noncachedata_end__ = .; } > m_ncache_local .bss (NOLOAD) : { . = ALIGN(4); __bss_start__ = .; *(.bss) *(.bss*) *(一般) . = ALIGN(4); __bss_end__ = .; } > m_dtcm .dtcm_bss (NOLOAD) : { . = ALIGN(32); __dtcm_bss_start__ = .; *(.dtcm_bss*) *(DTCM_BSS*) . = ALIGN(32); __dtcm_bss_end__ = .; } > m_dtcm __SDRAM_C_DATA_ROM = __NDATA_ROM + (__noncachedata_init_end __ - __ noncachedata_start__); .sdram_c_data : AT(__SDRAM_C_DATA_ROM) { . = ALIGN(32); __sdram_c_data_start__ = .; *(.sdram_c_data*) *(SDRAM_C_DATA*) . = ALIGN(32); __sdram_c_data_end__ = .; } > m_sdram_c __sdram_c_data_load __ = __ SDRAM_C_DATA_ROM; .sdram_c_bss (NOLOAD) : { . = ALIGN(32); __sdram_c_bss_start__ = .; *(.sdram_c_bss*) *(SDRAM_C_BSS*) . = ALIGN(32); __sdram_c_bss_end__ = .; } > m_sdram_c .sdram_nc_bss (NOLOAD) : { . = ALIGN(32); __sdram_nc_bss_start__ = .; *(.sdram_nc_bss*) *(SDRAM_NC_BSS*) . = ALIGN(32); __sdram_nc_bss_end__ = .; } > m_sdram_nc .heap : { . = ALIGN(8); __end__ = .; PROVIDE(end = .); __HeapBase = .; . += HEAP_SIZE; __HeapLimit = .; __heap_limit = .; } > m_dtcm .stack : { . = ALIGN(8); . += STACK_SIZE; __StackEnd = .; } > m_dtcm __StackTop = ORIGIN(m_dtcm) + LENGTH(m_dtcm); __StackLimit = __ StackTop - STACK_SIZE; PROVIDE( __stack = __ StackTop); .ARM.attributes 0 : { *(.ARM.attributes)} __SDRAM_BASE = SDRAM_BASE; __SDRAM_SIZE = SDRAM_SIZE; __SDRAM_C_BASE = SDRAM_BASE; __SDRAM_C_SIZE = SDRAM_C_SIZE; __SDRAM_NC_BASE = SDRAM_NC_BASE; __SDRAM_NC_SIZE = SDRAM_NC_SIZE; } MPU設定: /* -------------------------------------------------------------------------- */ /* CM7 MPU 設定 */ /* -------------------------------------------------------------------------- */ #if __CORTEX_M == 7 void BOARD_ConfigMPU ( void ) { #if defined ( __ICCARM__ ) || defined ( __GNUC__ ) extern uint32_t __NCACHE_REGION_START [] ; extern uint32_t __NCACHE_REGION_SIZE [] ; uint32_t nonCacheStart = ( uint32_t )__NCACHE_REGION_START; uint32_t size = ( uint32_t )__NCACHE_REGION_SIZE; #それ以外 uint32_t nonCacheStart = OCRAM_BASE_EXPECTED; uint32_t size = OCRAM_SIZE_EXPECTED; #endif ( void )nonCacheStart; ( void )size; #if defined (__ICACHE_PRESENT) && __ICACHE_PRESENT if (SCB_CCR_IC_Msk == (SCB_CCR_IC_Msk & SCB -> CCR )) { SCB_DisableICache (); } #endif #if defined (__DCACHE_PRESENT) && __DCACHE_PRESENT if (SCB_CCR_DC_Msk == (SCB_CCR_DC_Msk & SCB -> CCR )) { SCB_DisableDCache (); } #endif ARM_MPU_Disable (); /* リージョン 0: 全て拒否 (投機的プリフェッチの回避策) */ MPU -> RBAR = ARM_MPU_RBAR ( 0 , 0x00000000U ); MPU -> RASR = ARM_MPU_RASR ( 1 , ARM_MPU_AP_NONE, 0 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_4GB); /* リージョン 1: デバイス、共有不可、キャッシュ不可 */ MPU -> RBAR = ARM_MPU_RBAR ( 1 , 0x80000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_512MB); /* リージョン 2: デバイス、共有不可、キャッシュ不可 */ MPU -> RBAR = ARM_MPU_RBAR ( 2 , 0x60000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_512MB); /* リージョン 3: デバイス、共有不可、キャッシュ不可 */ MPU -> RBAR = ARM_MPU_RBAR ( 3 , 0x00000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_1GB); /* リージョン 4: ノーマル、WB */ MPU -> RBAR = ARM_MPU_RBAR ( 4 , 0x00000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 0 , 0 , 1 , 1 , 0 , ARM_MPU_REGION_SIZE_256KB); /* リージョン 5: ノーマル、WB */ MPU -> RBAR = ARM_MPU_RBAR ( 5 , 0x20000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 0 , 0 , 1 , 1 , 0 , ARM_MPU_REGION_SIZE_256KB); /* CM7 の OCRAM: 通常 + 共有可能 + キャッシュ不可 (TEX=1,S=1,C=0,B=0) */ /* 領域 6: 0x20240000..0x2027FFFF (256KB) */ MPU -> RBAR = ARM_MPU_RBAR ( 6 , 0x20240000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 1 , 1 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_256KB); /* 領域 7: 0x20280000..0x202FFFFF (512KB) */ MPU -> RBAR = ARM_MPU_RBAR ( 7 , 0x20280000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 1 , 1 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_512KB); /* 領域 10: 0x20300000..0x2033FFFF (256KB) */ MPU -> RBAR = ARM_MPU_RBAR ( 10 , 0x20300000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 1 , 1 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_256KB); #if USE_SDRAM /* 領域 11: SDRAM デフォルトの非キャッシュ可能 64MB (通常の非キャッシュ) */ MPU -> RBAR = ARM_MPU_RBAR ( 11 , 0x80000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 1 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_64MB); #if defined (CACHE_MODE_WRITE_THROUGH) && CACHE_MODE_WRITE_THROUGH /* リージョン 12: 最初の 8MB をキャッシュ可能 (WT) としてオーバーレイする */ MPU -> RBAR = ARM_MPU_RBAR ( 12 , 0x80000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 0 , 0 , 1 , 0 , 0 , ARM_MPU_REGION_SIZE_8MB); #それ以外 /* リージョン 12: 最初の 8MB をキャッシュ可能 (WB) としてオーバーレイする */ MPU -> RBAR = ARM_MPU_RBAR ( 12 , 0x80000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 0 , 0 , 1 , 1 , 0 , ARM_MPU_REGION_SIZE_8MB); #endif #endif /* USE_SDRAM */ #if defined (XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1 ) /* リージョン 8: XIP 外部フラッシュ、読み取り専用、キャッシュ可能な WB、64MB 全体をカバー */ MPU -> RBAR = ARM_MPU_RBAR ( 8 , 0x30000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_RO, 0 , 0 , 1 , 1 , 0 , ARM_MPU_REGION_SIZE_64MB); #endif /* ペリフェラル ウィンドウ */ MPU -> RBAR = ARM_MPU_RBAR ( 13 , 0x40000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_16MB); MPU -> RBAR = ARM_MPU_RBAR ( 14 , 0x41000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_2MB); MPU -> RBAR = ARM_MPU_RBAR ( 15 , 0x41400000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_1MB); ARM_MPU_Enable (MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk); #if defined (__DCACHE_PRESENT) && __DCACHE_PRESENT SCB_EnableDCache (); #endif #if defined (__ICACHE_PRESENT) && __ICACHE_PRESENT SCB_EnableICache (); #endif } #endif /* __CORTEX_M == 7 */ /* -------------------------------------------------------------------------- */ /* CM4 MPU 設定 */ /* -------------------------------------------------------------------------- */ #if __CORTEX_M == 4 void BOARD_ConfigMPU ( void ) { /* ---- コードバスキャッシュ (LMEM) を無効にする ---- */ if ( LMEM_PCCCR_ENCACHE_MASK == ( LMEM_PCCCR_ENCACHE_MASK & LMEM -> PCCCR )) { LMEM -> PCCCR |= LMEM_PCCCR_PUSHW0_MASK | LMEM_PCCCR_PUSHW1_MASK | LMEM_PCCCR_GO_MASK ; while (( LMEM -> PCCCR & LMEM_PCCCR_GO_MASK ) != 0U ) {} LMEM -> PCCCR &= ~ ( LMEM_PCCCR_PUSHW0_MASK | LMEM_PCCCR_PUSHW1_MASK ); LMEM -> PCCCR &= ~ LMEM_PCCCR_ENCACHE_MASK ; } /* ---- システムバスキャッシュ (LMEM) を無効にする ---- */ if ( LMEM_PSCCR_ENCACHE_MASK == ( LMEM_PSCCR_ENCACHE_MASK & LMEM -> PSCCR )) { LMEM -> PSCCR |= LMEM_PSCCR_PUSHW0_MASK | LMEM_PSCCR_PUSHW1_MASK | LMEM_PSCCR_GO_MASK ; while (( LMEM -> PSCCR & LMEM_PSCCR_GO_MASK ) != 0U ) {} LMEM -> PSCCR &= ~ ( LMEM_PSCCR_PUSHW0_MASK | LMEM_PSCCR_PUSHW1_MASK ); LMEM -> PSCCR &= ~ LMEM_PSCCR_ENCACHE_MASK ; } ARM_MPU_Disable (); /* 領域 0: 0x20240000..0x2025FFFF (128KB) DMA -> デバイス/非キャッシュ。 * 元の属性はここに保持します: UART/SPI/SD DMA バッファはここに存在します * ウィンドウがあり、CM4 LMEM で実証済みの非キャッシュ動作が必要です。*/ MPU -> RBAR = ARM_MPU_RBAR ( 0 , OCRAM_DMA_NC_BASE ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL , 0 、 1 、 /*共有推奨*/ 0 、 /* キャッシュ不可 */ 0 、 0 、 ARM_MPU_REGION_SIZE_128KB ); /* 領域 1: 0x20260000..0x2027FFFF (128KB) ローカルスクラッチ -> 通常の WB キャッシュ可能 */ MPU -> RBAR = ARM_MPU_RBAR ( 1 , OCRAM_LOCAL_C_BASE ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL , 0 、 /* 通常 */ 0 、 /* 共有不可 */ 1 、 /* キャッシュ可能 */ 1 、 /* バッファリング可能 (WB) */ 0 、 ARM_MPU_REGION_SIZE_128KB ); /* 領域 2: 0x20280000..0x202FFFFF (512KB) 共有 -> 元の非キャッシュ属性 */ MPU -> RBAR = ARM_MPU_RBAR ( 2 , 0x20280000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL , 0 、 1 、 /* 共有可能 */ 0 、 /* キャッシュ不可 */ 0 、 0 、 ARM_MPU_REGION_SIZE_512KB ); /* 領域 3: 0x20300000..0x2033FFFF (256KB) 共有 -> 元の非キャッシュ属性 */ MPU -> RBAR = ARM_MPU_RBAR ( 3 , 0x20300000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL , 0 、 1 、 /* 共有可能 */ 0 、 /* キャッシュ不可 */ 0 、 0 、 ARM_MPU_REGION_SIZE_256KB ); #if USE_SDRAM /* リンカー分割: * m_sdram_c = 0x80000000..0x807FFFFF (8MB) * m_sdram_nc = 0x80800000..0x83FFFFFF (56MB) * * MPUは56MBを直接表現できないため、領域4で64MB全体を構成する。 * SDRAM ウィンドウ デバイス/非キャッシュおよび領域 5 は最初の 8MB をオーバーレイします * キャッシュ可能。番号の大きいMPU領域が優先されます。*/ ( void ) SDRAM_NC_BASE ; ( void ) SDRAM_NC_SIZE ; /* 領域 4: フル SDRAM デフォルト、0x80000000..0x83FFFFFF -> デバイス/非キャッシュ */ MPU -> RBAR = ARM_MPU_RBAR ( 4 , SDRAM_BASE_EXPECTED ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL , 2 、 /* デバイス */ 0 、 /* 共有不可 */ 0 、 /* キャッシュ不可 */ 0 、 0 、 ARM_MPU_REGION_SIZE_64MB ); #if defined (CACHE_MODE_WRITE_THROUGH) && CACHE_MODE_WRITE_THROUGH /* 領域 5: リンカー m_sdram_c、0x80000000..0x807FFFFF -> 通常のライトスルー */ MPU -> RBAR = ARM_MPU_RBAR ( 5 , SDRAM_C_BASE); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 0 、 /* 通常 */ 0 、 /* 共有不可 */ 1 、 /* キャッシュ可能 */ 0 、 /* ライトスルー */ 0 、 ARM_MPU_REGION_SIZE_8MB); #それ以外 /* 領域 5: リンカー m_sdram_c、0x80000000..0x807FFFFF -> 通常のライトバック */ MPU -> RBAR = ARM_MPU_RBAR ( 5 , SDRAM_C_BASE ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL , 0 、 /* 通常 */ 0 、 /* 共有不可 */ 1 、 /* キャッシュ可能 */ 1 、 /* ライトバック */ 0 、 ARM_MPU_REGION_SIZE_8MB ); #endif #endif /* USE_SDRAM */ ARM_MPU_Enable ( MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk ); /* システムバスキャッシュ (PSCCR) を無効化および有効化します */ LMEM -> PSCCR |= LMEM_PSCCR_INVW0_MASK | LMEM_PSCCR_INVW1_MASK | LMEM_PSCCR_GO_MASK ; while (( LMEM -> PSCCR & LMEM_PSCCR_GO_MASK ) != 0U ) {} LMEM -> PSCCR &= ~ ( LMEM_PSCCR_INVW0_MASK | LMEM_PSCCR_INVW1_MASK ); LMEM -> PSCCR |= LMEM_PSCCR_ENCACHE_MASK ; /* コードバスキャッシュ(PCCCR)を無効化および有効化する */ LMEM -> PCCCR |= LMEM_PCCCR_INVW0_MASK | LMEM_PCCCR_INVW1_MASK | LMEM_PCCCR_GO_MASK ; while (( LMEM -> PCCCR & LMEM_PCCCR_GO_MASK ) != 0U ) {} LMEM -> PCCCR &= ~ ( LMEM_PCCCR_INVW0_MASK | LMEM_PCCCR_INVW1_MASK ); LMEM -> PCCCR |= LMEM_PCCCR_ENCACHE_MASK ; } #endif /* __CORTEX_M == 4 */ 私も同様の結果で試してみましたが、キャッシュ不可能なOCRAMからキャッシュ不可能なSDRAMへDMAを使用して書き込む際に、チェックサムの不一致が発生しました。 #if __CORTEX_M == 7 void BOARD_ConfigMPU ( void ) { #if defined ( __ICCARM__ ) || defined ( __GNUC__ ) extern uint32_t __NCACHE_REGION_START [] ; extern uint32_t __NCACHE_REGION_SIZE [] ; uint32_t nonCacheStart = ( uint32_t )__NCACHE_REGION_START; uint32_t size = ( uint32_t )__NCACHE_REGION_SIZE; #それ以外 uint32_t nonCacheStart = OCRAM_BASE_EXPECTED; uint32_t size = OCRAM_SIZE_EXPECTED; #endif ( void )nonCacheStart; ( void )size; #if defined (__ICACHE_PRESENT) && __ICACHE_PRESENT if (SCB_CCR_IC_Msk == (SCB_CCR_IC_Msk & SCB -> CCR )) { SCB_DisableICache (); } #endif #if defined (__DCACHE_PRESENT) && __DCACHE_PRESENT if (SCB_CCR_DC_Msk == (SCB_CCR_DC_Msk & SCB -> CCR )) { SCB_DisableDCache (); } #endif ARM_MPU_Disable (); /* リージョン 0: 全て拒否 (投機的プリフェッチの回避策) */ MPU -> RBAR = ARM_MPU_RBAR ( 0 , 0x00000000U ); MPU -> RASR = ARM_MPU_RASR ( 1 , ARM_MPU_AP_NONE, 0 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_4GB); /* リージョン 1: デバイス、共有不可、キャッシュ不可 */ MPU -> RBAR = ARM_MPU_RBAR ( 1 , 0x80000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_512MB); /* リージョン 2: デバイス、共有不可、キャッシュ不可 */ MPU -> RBAR = ARM_MPU_RBAR ( 2 , 0x60000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_512MB); /* リージョン 3: デバイス、共有不可、キャッシュ不可 */ MPU -> RBAR = ARM_MPU_RBAR ( 3 , 0x00000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_1GB); /* リージョン 4: ノーマル、WB */ MPU -> RBAR = ARM_MPU_RBAR ( 4 , 0x00000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 0 , 0 , 1 , 1 , 0 , ARM_MPU_REGION_SIZE_256KB); /* リージョン 5: ノーマル、WB */ MPU -> RBAR = ARM_MPU_RBAR ( 5 , 0x20000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 0 , 0 , 1 , 1 , 0 , ARM_MPU_REGION_SIZE_256KB); /* CM7 の OCRAM: 通常 + 共有可能 + キャッシュ不可 (TEX=1,S=1,C=0,B=0) */ /* 領域 6: 0x20240000..0x2027FFFF (256KB) */ MPU -> RBAR = ARM_MPU_RBAR ( 6 , 0x20240000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 1 , 1 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_256KB); /* 領域 7: 0x20280000..0x202FFFFF (512KB) */ MPU -> RBAR = ARM_MPU_RBAR ( 7 , 0x20280000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 1 , 1 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_512KB); /* 領域 10: 0x20300000..0x2033FFFF (256KB) */ MPU -> RBAR = ARM_MPU_RBAR ( 10 , 0x20300000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 1 , 1 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_256KB); #if USE_SDRAM /* 領域 11: SDRAM デフォルトの非キャッシュ可能 64MB (通常の非キャッシュ) */ MPU -> RBAR = ARM_MPU_RBAR ( 11 , 0x80000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 1 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_64MB); #if defined (CACHE_MODE_WRITE_THROUGH) && CACHE_MODE_WRITE_THROUGH /* リージョン 12: 最初の 8MB をキャッシュ可能 (WT) としてオーバーレイする */ MPU -> RBAR = ARM_MPU_RBAR ( 12 , 0x80000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 0 , 0 , 1 , 0 , 0 , ARM_MPU_REGION_SIZE_8MB); #それ以外 /* リージョン 12: 最初の 8MB をキャッシュ可能 (WB) としてオーバーレイする */ MPU -> RBAR = ARM_MPU_RBAR ( 12 , 0x80000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 0 , 0 , 1 , 1 , 0 , ARM_MPU_REGION_SIZE_8MB); #endif #endif /* USE_SDRAM */ #if defined (XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1 ) /* リージョン 8: XIP 外部フラッシュ、読み取り専用、キャッシュ可能な WB、64MB 全体をカバー */ MPU -> RBAR = ARM_MPU_RBAR ( 8 , 0x30000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_RO, 0 , 0 , 1 , 1 , 0 , ARM_MPU_REGION_SIZE_64MB); #endif /* ペリフェラル ウィンドウ */ MPU -> RBAR = ARM_MPU_RBAR ( 13 , 0x40000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_16MB); MPU -> RBAR = ARM_MPU_RBAR ( 14 , 0x41000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_2MB); MPU -> RBAR = ARM_MPU_RBAR ( 15 , 0x41400000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_1MB); ARM_MPU_Enable (MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk); #if defined (__DCACHE_PRESENT) && __DCACHE_PRESENT SCB_EnableDCache (); #endif #if defined (__ICACHE_PRESENT) && __ICACHE_PRESENT SCB_EnableICache (); #endif } #endif /* __CORTEX_M == 7 */ /* -------------------------------------------------------------------------- */ /* CM4 MPU 設定 */ /* -------------------------------------------------------------------------- */ #if __CORTEX_M == 4 void BOARD_ConfigMPU ( void ) { /* ---- コードバスキャッシュ (LMEM) を無効にする ---- */ if (LMEM_PCCCR_ENCACHE_MASK == (LMEM_PCCCR_ENCACHE_MASK & LMEM -> PCCCR )) { LMEM -> PCCCR |= LMEM_PCCCR_PUSHW0_MASK | LMEM_PCCCR_PUSHW1_MASK | LMEM_PCCCR_GO_MASK; while (( LMEM -> PCCCR & LMEM_PCCCR_GO_MASK) != 0U ) {} LMEM -> PCCCR &= ~ (LMEM_PCCCR_PUSHW0_MASK | LMEM_PCCCR_PUSHW1_MASK); LMEM -> PCCCR &= ~ LMEM_PCCCR_ENCACHE_MASK; } /* ---- システムバスキャッシュ (LMEM) を無効にする ---- */ if (LMEM_PSCCR_ENCACHE_MASK == (LMEM_PSCCR_ENCACHE_MASK & LMEM -> PSCCR )) { LMEM -> PSCCR |= LMEM_PSCCR_PUSHW0_MASK | LMEM_PSCCR_PUSHW1_MASK | LMEM_PSCCR_GO_MASK; while (( LMEM -> PSCCR & LMEM_PSCCR_GO_MASK) != 0U ) {} LMEM -> PSCCR &= ~ (LMEM_PSCCR_PUSHW0_MASK | LMEM_PSCCR_PUSHW1_MASK); LMEM -> PSCCR &= ~ LMEM_PSCCR_ENCACHE_MASK; } ARM_MPU_Disable (); /* 領域 0: 0x20240000..0x2025FFFF (128KB) DMA -> 通常のキャッシュ不可 */ MPU -> RBAR = ARM_MPU_RBAR ( 0 , OCRAM_DMA_NC_BASE); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 0 、 /* 通常 */ 1 、 /*共有推奨*/ 0 、 /* キャッシュ不可 */ 0 、 0 、 ARM_MPU_REGION_SIZE_128KB); /* 領域 1: 0x20260000..0x2027FFFF (128KB) ローカルスクラッチ -> 通常の WB キャッシュ可能 */ MPU -> RBAR = ARM_MPU_RBAR ( 1 , OCRAM_LOCAL_C_BASE); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 0 、 /* 通常 */ 0 、 /* 共有不可 */ 1 、 /* キャッシュ可能 */ 1 、 /* バッファリング可能 (WB) */ 0 、 ARM_MPU_REGION_SIZE_128KB); /* 領域 2: 0x20280000..0x202FFFFF (512KB) 共有 -> 通常 (共有可能) */ MPU -> RBAR = ARM_MPU_RBAR ( 2 , 0x20280000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 0 、 /* 通常 */ 1 、 /* 共有可能 */ 0 、 /* キャッシュ不可 */ 0 、 0 、 ARM_MPU_REGION_SIZE_512KB); /* 領域 3: 0x20300000..0x2033FFFF (256KB) 共有 -> 通常 (共有可能) */ MPU -> RBAR = ARM_MPU_RBAR ( 3 , 0x20300000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 0 、 /* 通常 */ 1 、 /* 共有可能 */ 0 、 /* キャッシュ不可 */ 0 、 0 、 ARM_MPU_REGION_SIZE_256KB); ARM_MPU_Enable (MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk); /* システムバスキャッシュ (PSCCR) を無効化および有効化します */ LMEM -> PSCCR |= LMEM_PSCCR_INVW0_MASK | LMEM_PSCCR_INVW1_MASK | LMEM_PSCCR_GO_MASK; while (( LMEM -> PSCCR & LMEM_PSCCR_GO_MASK) != 0U ) {} LMEM -> PSCCR &= ~ (LMEM_PSCCR_INVW0_MASK | LMEM_PSCCR_INVW1_MASK); LMEM -> PSCCR |= LMEM_PSCCR_ENCACHE_MASK; /* コードバスキャッシュ(PCCCR)を無効化および有効化する */ LMEM -> PCCCR |= LMEM_PCCCR_INVW0_MASK | LMEM_PCCCR_INVW1_MASK | LMEM_PCCCR_GO_MASK; while (( LMEM -> PCCCR & LMEM_PCCCR_GO_MASK) != 0U ) {} LMEM -> PCCCR &= ~ (LMEM_PCCCR_INVW0_MASK | LMEM_PCCCR_INVW1_MASK); LMEM -> PCCCR |= LMEM_PCCCR_ENCACHE_MASK; } #endif /* __CORTEX_M == 4 */ 評価ボード Re: RT1170 EVKB M4 memory speed こんにちは、 @cyberhelmer さん。 NXP MIMXRTシリーズにご関心をお寄せいただきありがとうございます! NXPはRT1050に基づいたテスト結果を提供した。このアプリケーションノートと関連ソフトウェアは、以下のリンクからご覧いただけます。https: //www.nxp.com/docs/en/application-note/AN12437.pdf https://www.nxp.com/products/i.MX-RT1050 簡単な比較を行ったところ、SDRAM書き込みテスト中にANSWは以下の設定を使用していることがわかりました。通常のメモリ特性、純粋な32ビットシーケンシャル書き込み、書き込み後のDSB。 該当する実験を実施する際には、このANSWを参照することをお勧めします。 よろしくお願いします、 ギャビン
記事全体を表示
Migration Guide of NXP-NCI 2.0 SPI examples with PN7160 for MCXW23 in Visual Studio Code Hi NXP, First of all, thank you to Roman @RomanVRfor providing the migration guide for frdm-mcxw71 with pn7160: NXP Community Migration Guide It would be very helpful if there could also be a guide specifically for using the NXP-NCI driver with Visual Studio Code on the MCXW23 platform. Unfortunately, the MCXW23 currently does not have support in MCUXpresso IDE, so many developers are using Visual Studio Code instead. A dedicated setup and migration guide for PN7160 SPI integration, driver configuration, SDK setup, and build/debug workflow in Visual Studio Code would greatly help developers working with visual studio code with nxp-nci 2.0 driver. Best Regards, Shakir Salam Development Board FRDM-Training Re: Migration Guide of NXP-NCI 2.0 SPI examples with PN7160 for MCXW23 in Visual Studio Code Hello @S_Salam555, hope you are doing well. Thank you for your feedback, however there is currently no guide that covers the migration on MCUXpresso for VS Code. Although, the guide done in MCUXpresso IDE should provide the overall essential steps to do the migration, the only steps that change are the ones that imply file addition and manipulation of your project, which in VS Code should be done via CMake files as stated on the following guide: Add Files to Project/ Remove Files from Project. Hope this helps! Re: Migration Guide of NXP-NCI 2.0 SPI examples with PN7160 for MCXW23 in Visual Studio Code Hello @S_Salam555. The option that you have selected is the appropriate for the port. Re: Migration Guide of NXP-NCI 2.0 SPI examples with PN7160 for MCXW23 in Visual Studio Code Hi Roman, Thank you for the feedback and the information. Regarding the Manage Component section, could you please advise which option I should choose? This is currently my project structure for reference. No Rush :)) Best regards, Shakir Salam Re: Migration Guide of NXP-NCI 2.0 SPI examples with PN7160 for MCXW23 in Visual Studio Code Hi @S_Salam555. Since this is a custom implementation, the support path would be very limited to analyze specific behaviors or issues within your implementation, therefore all of the development would have to be on your own. Providing a more specific approach to the behavior that you are observing would be very helpful to be able to provide a better support. Re: Migration Guide of NXP-NCI 2.0 SPI examples with PN7160 for MCXW23 in Visual Studio Code Hello Roman, Hope you’re doing well. Thank you for the suggestion. How does my CMake configuration look so far? Below is an overall visual illustration of my project structure for the MCXW23 build. Best regards, Shakir Salam 1. Board.h 2. hardware_init.c 3. pinmux.c 4. tml.c   5. main.c 6. CMakeLists.txt  7. Build Error Output Re: Migration Guide of NXP-NCI 2.0 SPI examples with PN7160 for MCXW23 in Visual Studio Code Hi Roman, Just wanted to share a quick progress update. I’m able to successfully build the project, and now I just need to configure the correct SPI settings. I’ve attached the latest CMakeLists.txt and the error console log for your reference. Best regards, Shakir Salam   Re: Migration Guide of NXP-NCI 2.0 SPI examples with PN7160 for MCXW23 in Visual Studio Code Hello @S_Salam555, thank you for the update. Please notice that the SPI driver name changes between the MCXW71 and MCXW23, while MCXW71 SPI driver APIs are called "LPSPI....", on MCXW23 the APIs and instances are just called "SPI....". Hope this helps! Re: Migration Guide of NXP-NCI 2.0 SPI examples with PN7160 for MCXW23 in Visual Studio Code Hi Roman, Sorry I was away a bit on other project, here is the latest screenshot. which i have difficult in compile the #include Best Regards, Shakir Salam Re: Migration Guide of NXP-NCI 2.0 SPI examples with PN7160 for MCXW23 in Visual Studio Code Hi Roman, Currently, the only remaining issue is related to the configuration flags for the MCXW23 to flash. Could you please help verify them for me? Thanks. Best regards, Shakir Salam   Re: Migration Guide of NXP-NCI 2.0 SPI examples with PN7160 for MCXW23 in Visual Studio Code Hello @S_Salam555, hope you are doing well. From the images that you shared from your project, it seems that you are trying to configure SPI with MCXW71 specific configurations which are different from the MCXW23's. Both drivers need different configuration requirements among them, for this I would suggest that you refer to any polling SPI example from the MCXW23 SDK. I would not suggest to just copy and paste the initializations nor the files from one project to another, rather, adapt the configurations to how your project is built in the TML layer to initialize the SPI peripheral and send and receive data. Hope this helps! Re: Migration Guide of NXP-NCI 2.0 SPI examples with PN7160 for MCXW23 in Visual Studio Code Hi Roman, I hope you’re doing well. I would like to give a quick update on the MCXW23 project. Could you please guide me on how to configure and use SPI and also the board.h on the MCXW23? Best regards, Shakir Salam    
記事全体を表示
iMX93 所有内核上的 Zephyr 您好, 我想在 iMX93 的所有内核上运行 RTOS。这可能吗? 我在 Zephyr 网站上看到有一个在 FRDM-IMX93 板的 M33 核心上运行 Zephyr 的项目。此外,还有一个在 A55 内核上运行 Zephyr 的项目。 但我能同时运行它们吗?我可以在两个 A55 处理器上运行单独的 Zephyr 项目吗? 芯片的初始化是如何进行的?比如时钟和内存控制器的初始化?谁会这么做? 如果不可能,能否使用 MCUXPresso 在 M33 内核上运行 RTOS,然后初始化芯片?将 Zephyr 用于两个 A55 内核? 在所有内核上运行实时操作系统的方法是什么? Re: Zephyr on all cores of a iMX93 你好@simmania 对于在 2x A55 上运行的两个 zephyr 项目,不支持这样做。支持的框架是运行 Linux 的 A55 -->Jailhouse --> 其他运行 zephyr 的 A55,因此 Jailhouse 应管理硬件隔离。 如果不可能,能否使用 MCUXPresso 在 M33 内核上运行 RTOS,然后初始化芯片?将 Zephyr 用于两个 A55 内核? -->— > i.MX93 支持低功耗启动,可从 bootrom 启动 M33。为了实现你的 目标,需要重写太多 SDK 的代码... 核心问题是谁初始化 DDR。根据文档,保留U-Boot是最佳选择,因为它使U-Boot能够同时为M33和A55处理器加载Zephyr 。 https://docs.zephyrproject.org/latest/boards/nxp/imx93_evk/doc/index.html 致敬, Zhiming Re: Zephyr on all cores of a iMX93 因此,恩智浦的一名员工说,使用 harpoon 是可能的。 而恩智浦技术支持部门说这是不可能的。 非常令人困惑。 Re: Zephyr on all cores of a iMX93 imx93 中的 A 核心和 mcore 都支持 zephyr 版本,你可以前往我们的 zephyr 登录页面获取 MPU Zephyr 使用指南,如果你想同时在 A 核心和 m 核心上运行 zephyr,你可以从恩智浦寻找鱼叉版本 https://www.nxp.com/design/design-center/software/embedded-software/zephyr-os-for-edge-connected-devices:ZEPHYR-OS-EDGE Re: Zephyr on all cores of a iMX93 谢谢您的回答。 但我们还没有使用 iMX93 进行开发,因此答案还不明确。 我们正在为一个新项目选择硬件。我们现在唯一需要知道的是,是否有可能在不使用 Linux 的情况下在所有内核上运行 Zephyr。 Re: Zephyr on all cores of a iMX93 @simmania 核心用户指南在此 UG10199:恩智浦 MPU Cortex-A Core Zephyr 用户指南 | 恩智浦半导体 在 Zephyr 网页中已经提到支持 93 A 核和 mcore i.MX93 EVK - Zephyr 项目文档 鱼叉用户指南 UG10170:鱼叉用户指南|恩智浦半导体 Re: Zephyr on all cores of a iMX93 在 Harpoon 文档中,我发现了以下内容: Harpoon 为在一个或多个 Cortex-A 内核上并行运行的 RTOS 上开发对实时要求苛刻的应用程序提供了一个环境,利用 64 位 Arm 架构来提高性能。 因此,在某些内核上仍然需要使用 Linux。这样看来,在 iMX93 的所有内核上运行 Zephyr 是不可能的。 Re: Zephyr on all cores of a iMX93 @simmania你可以在一个 A 核上运行 harpoon,在另一个 A 核上运行 Zephyr,在 mcore 上运行 zephyr,或者在 A 核上运行本地 zephyr,然后使用运行 mcore zephyr 的引导程序。 请参阅 使用 UUU 将 flash.bin 编程到 SD/eMMC - MCUXpresso SDK 文档 并将zephyr.bin 复制到步骤 4 中 imx-mkimage/i.MX9 下的 m33_image.bin,以创建闪存 bin 从相应的 Linux BSP 版本中获取启动映像和 imx-mkimage 源存储库。需要放入 imx-mkimage/i.mx9 的启动映像是: - u-boot-imx93evk.bin-sd (rename to u-boot.bin) - u-boot-spl.bin-imx93evk-sd (rename to u-boot-spl.bin) - bl31-imx93.bin (rename to bl31.bin) - mx93a0-ahab-container.img - lpddr4_dmem_1d_v202201.bin - lpddr4_dmem_2d_v202201.bin - lpddr4_imem_1d_v202201.bin - lpddr4_imem_2d_v202201.bin
記事全体を表示
在 Visual Studio Code 中使用 PN7160 为 MCXW23 编写 NXP-NCI 2.0 SPI 示例的迁移指南 你好,恩智浦、 首先,感谢 Roman@RomanVR提供 frdm-mcxw71 与 pn7160 的迁移指南: 恩智浦社区迁移指南 如果能有一份在 MCXW23 平台上通过 Visual Studio 代码使用恩智浦-NCI 驱动程序的专门指南,将非常有帮助。遗憾的是,MCUXpresso IDE 目前不支持 MCXW23,因此许多开发人员使用 Visual Studio Code 代替。 有关 Visual Studio Code 中 PN7160 SPI 集成、驱动程序配置、软件开发工具包设置和构建/调试工作流程的专用的设置和迁移指南将极大地帮助开发人员使用 nxp-nci 2.0 驱动程序使用可视工作室代码。 顺祝商祺! 沙基尔-萨拉姆 开发板 FRDM 培训 Re: Migration Guide of NXP-NCI 2.0 SPI examples with PN7160 for MCXW23 in Visual Studio Code 你好@S_Salam555,希望你一切都好。 感谢您的反馈,但目前还没有涵盖 MCUXpresso for VS Code 移植的指南。 尽管在 MCUXpresso IDE 中完成的指南提供了完成迁移的整体基本步骤,但唯一需要更改的步骤是那些意味着添加文件和操作项目的步骤,在 VS Code 中应通过 CMake 文件完成,正如以下指南所述:向项目中添加文件/从项目中删除文件。 希望对您有所帮助! Re: Migration Guide of NXP-NCI 2.0 SPI examples with PN7160 for MCXW23 in Visual Studio Code 嗨,罗曼、 感谢您的反馈和信息。 关于 “管理元器件” 部分,你能告诉我应该选择哪个选项吗?这是我目前的项目结构以供参考。不着急 :)) 致以最崇高的敬意, Shakir Salam Re: Migration Guide of NXP-NCI 2.0 SPI examples with PN7160 for MCXW23 in Visual Studio Code 你好@S_Salam555. 您选择的选项适合该端口。 Re: Migration Guide of NXP-NCI 2.0 SPI examples with PN7160 for MCXW23 in Visual Studio Code 你好,罗曼、 希望你一切都好。谢谢您的建议。 我的 CMake 配置目前看起来如何? 以下是我的 MCXW23 版本项目结构的整体可视化插图。 致以最崇高的敬意, Shakir Salam 1。Board.h 2. hardware_init.c 3. pinmux.c 4. tml.c @Smartling Language Service 5. main.c 6.CMakeLists.txt 7. 版本错误输出 Re: Migration Guide of NXP-NCI 2.0 SPI examples with PN7160 for MCXW23 in Visual Studio Code 你好@S_Salam555. 由于这是一个定制的实施方案,支持途径将非常有限,无法分析实施方案中的特定行为或问题,因此所有的开发工作都必须由您自己完成。 针对您观察到的行为提供更具体的方法,将非常有助于提供更好的支持。 Re: Migration Guide of NXP-NCI 2.0 SPI examples with PN7160 for MCXW23 in Visual Studio Code 您好@S_Salam555,感谢您提供最新信息。 请注意,MCXW71 和 MCXW23 的 SPI 驱动程序名称有所变化,MCXW71 的 SPI 驱动程序 API 称为" LPSPI...." ,而 MCXW23 的 API 和实例仅称为" SPI.... " 。 希望对您有所帮助! Re: Migration Guide of NXP-NCI 2.0 SPI examples with PN7160 for MCXW23 in Visual Studio Code 嗨,罗曼、 只是想和大家分享一下最新进展。我能够成功构建项目,现在我只需要配置正确的SPI设置即可。 我附上了最新的 CMakeLists.txt 和错误控制台日志供你参考。 致以最崇高的敬意, Shakir Salam   Re: Migration Guide of NXP-NCI 2.0 SPI examples with PN7160 for MCXW23 in Visual Studio Code 嗨,罗曼、 对不起,我因为其他项目离开了一会儿,这是最新的截图。我在编译 #include 顺祝商祺! 沙基尔-萨拉姆 Re: Migration Guide of NXP-NCI 2.0 SPI examples with PN7160 for MCXW23 in Visual Studio Code 嗨,罗曼、 目前,唯一剩下的问题与 MCXW23 闪存的配置标志有关。您能帮我核实一下吗? 谢谢。 致以最崇高的敬意, Shakir Salam   Re: Migration Guide of NXP-NCI 2.0 SPI examples with PN7160 for MCXW23 in Visual Studio Code 你好@S_Salam555,希望你一切都好。 从您分享的项目图片来看,您似乎试图用 MCXW71 的特定配置来配置 SPI,而这些配置与 MCXW23 的不同。 这两个驱动程序需要不同的配置要求,为此,我建议您参考 MCXW23 SDK 中的任何轮询 SPI 示例。我不建议只将初始化内容或文件从一个项目复制粘贴到另一个项目,而是根据你的项目在 TML 层中的构建方式调整配置,以初始化 SPI 外围设备并发送和接收数据。 希望对您有所帮助! Re: Migration Guide of NXP-NCI 2.0 SPI examples with PN7160 for MCXW23 in Visual Studio Code 嗨,罗曼、 希望你一切都好。 我想简单介绍一下 MCXW23 项目的最新情况。你能指导我如何配置和使用 SPI 以及主板吗。h在 MCXW23 上? 致以最崇高的敬意, Shakir Salam    
記事全体を表示
iMX93の全コアにZephyrを搭載 こんにちは、 iMX93 のすべてのコアで RTOS を実行したいと考えています。それは可能ですか? Zephyr の Web サイトを見ると、FRDM-IMX93 ボードの M33 コアで Zephyr を実行するプロジェクトがあるようです。また、A55 コアで Zephyr を実行するプロジェクトもあります。 しかし、両方実行することはできますか?両方の A55 プロセッサで別々の Zephyr プロジェクトを実行できますか? チップの初期化はどのように機能しますか。クロックやメモリコントローラの初期化のようなものですか?誰がそんなことをするのでしょうか? 不可能な場合は、MCUXPresso を使用して M33 コア上で RTOS を実行し、チップを初期化することはできますか?両方の A55 コアに Zephyr を使用しますか? すべてのコアで RTOS を実行する方法は何ですか? Re: Zephyr on all cores of a iMX93 こんにちは@simmania 2x A55 で実行される 2 つの Zephyr プロジェクトの場合、これはサポートされません。サポートされているフレームワークは、Linux を実行する A55 --> Jailhouse --> Zephyr を実行するその他の A55 であるため、Jailhouse がハードウェアのアイソレータを管理する必要があります。 不可能な場合は、MCUXPresso を使用して M33 コア上で RTOS を実行し、チップを初期化することはできますか?両方の A55 コアに Zephyr を使用しますか? --> i.MX93は、ブートROMからM33を起動する低消費電力ブートをサポートしています。目的を達成するには、SDKのコードを大幅に書き換える必要があります。根本的な問題は、DDRを誰が初期化するかです。ドキュメントによると、U-Bootを維持するのが最適な選択です。U-BootはM33とA55プロセッサの両方でZephyrを同時にロードできるためです。 https://docs.zephyrproject.org/latest/boards/nxp/imx93_evk/doc/index.html よろしくお願いします、 志明 Re: Zephyr on all cores of a iMX93 NXPの社員によると、銛を使えば可能だという。 NXPのテクニカルサポートは、それは不可能だと言っています。 非常に紛らわしい。 Re: Zephyr on all cores of a iMX93 iMX93のAコアとmコアの両方がZephyrリリースをサポートしています。ZephyrランディングページにアクセスしてMPU Zephyr使用ガイドを入手してください。Aコアとmコアの両方でZephyrを同時に実行したい場合は、NXPのHarpoonリリースを探してください。 https://www.nxp.com/design/design-center/software/embedded-software/zephyr-os-for-edge-connected-devices:ZEPHYR-OS-EDGE Re: Zephyr on all cores of a iMX93 Harpoonのドキュメントで、以下の記述を見つけました。 Harpoonは、Linuxディストリビューション上で並列動作する1つ(または複数)のCortex-Aコア上で動作するRTOS上で、リアルタイム処理能力が要求されるアプリケーションを開発するための環境を提供し、64ビットArmアーキテクチャを活用して高いパフォーマンスを実現します。 つまり、一部のコアではまだLinuxが必要なのです。つまり、iMX93の全コアでZephyrを実行することは不可能のようだ。 Re: Zephyr on all cores of a iMX93 @simmania コアユーザーガイドはこちら UG10199:NXP MPU Cortex-Aコア Zephyrユーザーガイド | NXPセミコンダクターズ Zephyrのウェブページには、すでに93 Aコアとmコアのサポートについて記載されています。 i.MX93 EVK — Zephyrプロジェクトドキュメント 銛ユーザーガイド UG10170:Harpoonユーザーガイド|NXPセミコンダクターズ Re: Zephyr on all cores of a iMX93 ご回答ありがとうございます。 しかし、私たちはまだiMX93を使った開発を行っておらず、私たちにとってはまだ明確な答えが出ていません。 私たちは現在、新しいプロジェクトで使用するハードウェアを選定しているところです。今私たちが知りたいのは、Linuxを必要とせずにZephyrをすべてのコアで実行できるかどうかだけです。 Re: Zephyr on all cores of a iMX93 @simmania 1 つの A コアで Harpoon を実行し、別の A コアで Zephyr を実行し、mcore で Zephyr を実行することもできます。あるいは、A コアでネイティブ Zephyr を実行し、mcore Zephyr を実行する BootROM を使用することもできます。 プログラム flash.bin を UUU を使用して SD/eMMC に書き込む — MCUXpresso SDK ドキュメントを参照してください。 ステップ4でzephyr.binをimx-mkimage/i.MX9のm33_image.binにコピーしてフラッシュbinを作成します 対応するLinux BSPリリースからブートイメージとimx-mkimageソースリポジトリを入手してください。imx-mkimage/i.MX9に配置する必要のあるブートイメージは以下のとおりです。 - u-boot-imx93evk.bin-sd (rename to u-boot.bin) - u-boot-spl.bin-imx93evk-sd (rename to u-boot-spl.bin) - bl31-imx93.bin (rename to bl31.bin) - mx93a0-ahab-container.img - lpddr4_dmem_1d_v202201.bin - lpddr4_dmem_2d_v202201.bin - lpddr4_imem_1d_v202201.bin - lpddr4_imem_2d_v202201.bin
記事全体を表示
Microcontroller selection for entry-level consumer graphical application Hi support Team, I  am looking for support in selecting an entry-level microcontroller for a consumer graphical application. Requirements: Display: small display up to 320 × 240 Memory: around 1 MB Flash and 256 KB RAM Power: preferably mainstream or low-power Peripherals: 3 SPI instances 2 I2C instances 2 ADC channels The peripherals will be used with dedicated sensors The application is a consumer product with a small graphical interface and dedicated sensor connections. I am looking for a cost-effective microcontroller that can support the display, peripheral interfaces, and basic graphics requirements in an entry-level solution. Questions: Could you recommend suitable microcontroller families or specific part numbers that best match these requirements?  Is there an existing example or reference project that could be used as a starting point for development?  Best Regards, Nuyuan MCXC MCXN Re: Microcontroller selection for entry-level consumer graphical application Hello @Yuza , Thanks for your post.  Based on your requirements, we would recommend MCX N94x / N54x. MCXN94x/54x: MCX N94, N54, N53, N52 and N24 MCUs | NXP Semiconductors The main reason is memory fit. Your target is around 1 MB Flash and 256 KB RAM , while the MCXN546 / MCXN946 devices provide 1 MB Flash and 352 KB SRAM , and the MCXN547 / MCXN947 devices provide 2 MB Flash and 512 KB SRAM , all running at up to 150 MHz. This family is also a good fit for a small graphical interface. NXP positions the MCX N family for industrial/consumer HMI applications and highlights display support in the portfolio overview. The MCX N series includes SmartDMA for display and fast I/O use cases, and FlexIO can be used for LCD interfaces. The MCX N94x / N54x series integrates 10 low-power Flexcomm instances , and these encapsulate LPSPI, LPUART, and LPI2C functions, giving sufficient serial interface resources for requirements such as 3x SPI and 2x I2C . The documentation includes AN14172, Using SmartDMA for Graphic on MCX N Series MCU , which describes graphics-oriented data handling on MCX N and includes an SDK example named lvgl_demo_widgets_bm . That example uses FlexIO to emulate an MCU8080 interface to drive a 3.5-inch LCD , with SmartDMA transferring data to the FlexIO data registers. In addition, MCX N is listed in NXP’s MCUXpresso GUI ecosystem as a supported platform for LVGL-based development. We also have LVGL demos in our SDK. We also have EVK board for your evaluation: MCXN947 FRDM Board for Industrial IoT Solutions | NXP Semiconductors Hope it helps. BR Celeste
記事全体を表示
为入门级消费类图形应用选择微控制器 您好,技术支持团队、 我希望在为消费类图形应用选择入门级微控制器时得到支持。 要求: 显示器:最大 320 × 240 的小型显示 器:大约 1 MB 闪存和 256 KB RAM 电源:最好是主流或低功耗 外围设备: 3 个 SPI 实例 2 个 I2C 实例 2 个 ADC 通道 外设将与专用传感器一起使用 该应用程序是一种消费类产品,具有小型图形界面和专用传感器连接。我正在寻找一种具有成本效益的微控制器,它能在入门级解决方案中支持显示、外设接口和基本图形要求。 问题 你能否推荐最符合这些要求的合适的微控制器系列或特定部件号? 是否有现有的示例或参考项目可以用作开发的起点? 顺祝商祺! 怒江 MCXC MCX N Re: Microcontroller selection for entry-level consumer graphical application 你好@Yuza、 谢谢您的帖子。 根据您的要求,我们推荐 MCX N94x / N54x。 mcxn94x/54x:MCX N94、N54、N53、N52 和 N24 微控制器 | 恩智浦半导体 主要原因是内存适合。您的目标是大约 1 MB 闪存和 256 KB 内存,而 MCXN546/MCXN946 设备提供 1 MB 闪存和 352 KB SRAM,MCXN547/MCXN947 设备提供 2 MB 闪存和 512 KB SRAM,均以高达 150 MHz 的频率运行。 该系列也非常适合小型图形界面。恩智浦将MCX N系列定位为工业/消费类HMI应用,并在产品组合概述中重点介绍了显示器支持。MCX N 系列包括用于显示和快速 I/O 用例的 SmartDMA,以及可用于 LCD 接口的 FlexIO。 MCX N94x/N54x 系列集成了 10 个低功耗 Flexcomm 实例,这些实例封装了 LPSPI、LPUART 和 LPI2C 功能,为 3x SPI 和 2x I2C 等需求提供了足够的串行接口资源。 文档包括AN14172《在 MCX N 系列微控制器上使用 SmartDMA 进行图形处理》,其中介绍了 MCX N 上面向图形的数据处理,并包含一个名为lvgl_demo_widgets_bm的 SDK 示例。该示例使用 FlexIO 仿真 MCU8080 接口,以驱动 3.5 英寸 LCD,SmartDMA 将数据传输到 FlexIO 数据寄存器。此外,MCX N 作为基于 LVGL 开发的支持平台,已被列入恩智浦 MCUXpresso GUI 生态系统。我们的 SDK 中还有 LVGL 演示。 我们还有 EVK 板供您评估:适用于工业物联网解决方案的 MCXN947 FRDM 板| 恩智浦半导体 希望对您有所帮助。 BR 西莱斯特
記事全体を表示
RT1170 EVKB M4 memory speed I'm doing some benchmarks for M4 core memory access on the RT1170 evkb. Are these numbers expected when the M4 accesses sdram and ocram on the board? It seems extremely slow.  I have read some information on longer access times for M4 because of the axi fabric etc but this seem very slow. Have I missed something in my configs somewhere making it slower than neccesary?  The benchmark includes a few different memory sources/destinations but what I'm most interested in improving is edma between sdram and ocram. I'm implementing a multi track audio streaming engine where M4 sets of edma transfers from sdram non cacheable to ocram non cacheable. The M7 core then consumes buffers from shared ocram.  But the test is run freestanding and there should be none or very little arbitration happeningen.  Both sdram and the ocram regions are set non cacheable, ocram region is also set sharable in MPUConfig, if I'm not misstaken?  Audio streamer copy benchmark, Cortex-M4 @ 400 MHz ops: playback 16 x 4096 B SDRAM_NC->OCRAM, record 8 x 4096 B OCRAM->SDRAM_NC bytes: playback=65536 record=32768 total=98304   CPU memcpy: playback copies               1532202 cyc 3830.505 us record copies                  530291 cyc 1325.727 us scatter total                 2062493 cyc 5156.232 us single 96K bulk               2301811 cyc 5754.527 us checksum=239   Memory region copy matrix (32768 B per row): regions src: SDRAM_C=80008000 SDRAM_NC=80818000 SHARED=202B8EC0 NCACHE=20248AA0 OCRAM_CACHE=2026E3C0 MPU/cache: CTRL=0x00000007 TYPE=0x00000800 PSCCR=0x00000003 R4=0x80000004/0x03100033 R5=0x80000005/0x0303002d EDMA is only run when both endpoints are non-cacheable/DMA-safe. SDRAM_C->OCRAM_CACHE         bytes=32768 cpu= 1201410 cyc 3003.525 us 10.90 MB/s | edma=skip cacheable checksum=338 SDRAM_NC->OCRAM_CACHE        bytes=32768 cpu= 1037590 cyc 2593.975 us 12.63 MB/s | edma=skip cacheable checksum=602 SDRAM_NC->SHARED_OCRAM       bytes=32768 cpu=  781109 cyc 1952.772 us 16.78 MB/s | edma=ok   779805 cyc 1949.512 us 16.80 MB/s checksum=602/602 | edma+cache=ok   858144 cyc 2145.360 us 15.27 MB/s checksum=602 SDRAM_NC->NCACHE_OCRAM       bytes=32768 cpu=  777897 cyc 1944.742 us 16.84 MB/s | edma=ok   751101 cyc 1877.752 us 17.45 MB/s checksum=602/602 | edma+cache=ok   853273 cyc 2133.182 us 15.36 MB/s checksum=602 OCRAM_CACHE->SDRAM_NC        bytes=32768 cpu=  750396 cyc 1875.990 us 17.46 MB/s | edma=skip cacheable checksum=1204 SHARED_OCRAM->SDRAM_NC       bytes=32768 cpu=  531143 cyc 1327.857 us 24.67 MB/s | edma=ok   570792 cyc 1426.980 us 22.96 MB/s checksum=610/610 | edma+cache=ok   670564 cyc 1676.410 us 19.54 MB/s checksum=610 NCACHE_OCRAM->SDRAM_NC       bytes=32768 cpu=  541568 cyc 1353.920 us 24.20 MB/s | edma=ok   549911 cyc 1374.777 us 23.83 MB/s checksum=940/940 | edma+cache=ok   649852 cyc 1624.630 us 20.16 MB/s checksum=940 SDRAM_NC->SDRAM_NC           bytes=32768 cpu=  896656 cyc 2241.640 us 14.61 MB/s | edma=ok   997686 cyc 2494.215 us 13.13 MB/s checksum=602/602 | edma+cache=ok  1130798 cyc 2826.995 us 11.59 MB/s checksum=602 OCRAM_CACHE->OCRAM_CACHE     bytes=32768 cpu=  768904 cyc 1922.260 us 17.04 MB/s | edma=skip cacheable checksum=1204 SHARED_OCRAM->SHARED_OCRAM   bytes=32768 cpu=  425929 cyc 1064.822 us 30.77 MB/s | edma=ok   433498 cyc 1083.745 us 30.23 MB/s checksum=610/610 | edma+cache=ok   542913 cyc 1357.282 us 24.14 MB/s checksum=610   EDMA scatter/gather 24 x 4K, NBYTES=4096: ops=24 nbytes=4096 ok=1 descriptor setup+start          58942 cyc 147.355 us wait until done/error         2031292 cyc 5078.230 us total                         2090234 cyc 5225.585 us checksum=239 channelFlags=0x1 errorFlags=0x0 remaining=0 csr=0x0088 citer=1 biter=1   EDMA scatter/gather 24 x 4K, NBYTES=32: ops=24 nbytes=32 ok=1 descriptor setup+start          47526 cyc 118.815 us wait until done/error         2055017 cyc 5137.542 us total                         2102543 cyc 5256.357 us checksum=239 channelFlags=0x1 errorFlags=0x0 remaining=0 csr=0x0088 citer=128 biter=128   EDMA single 4K, NBYTES=4096: ops=1 nbytes=4096 ok=1 descriptor setup+start           5713 cyc 14.282 us wait until done/error           93592 cyc 233.980 us total                           99305 cyc 248.262 us checksum=239 channelFlags=0x1 errorFlags=0x0 remaining=0 csr=0x0088 citer=1 biter=1   EDMA single 4K, NBYTES=32: ops=1 nbytes=32 ok=1 descriptor setup+start           5344 cyc 13.360 us wait until done/error           94609 cyc 236.522 us total                           99953 cyc 249.882 us checksum=239 channelFlags=0x1 errorFlags=0x0 remaining=0 csr=0x0088 citer=128 biter=128   EDMA single 96K, NBYTES=4096: ops=1 nbytes=4096 ok=1 descriptor setup+start           5867 cyc 14.667 us wait until done/error         2230360 cyc 5575.900 us total                         2236227 cyc 5590.567 us checksum=239 channelFlags=0x1 errorFlags=0x0 remaining=0 csr=0x0088 citer=24 biter=24   EDMA single 96K, NBYTES=32: ops=1 nbytes=32 ok=1 descriptor setup+start           5713 cyc 14.282 us wait until done/error         2256234 cyc 5640.585 us total                         2261947 cyc 5654.867 us checksum=239 channelFlags=0x1 errorFlags=0x0 remaining=0 csr=0x0088 citer=3072 biter=3072 DMAMUX1_CHCFG[2]=0xa0000000 DMA1_ERQ=0x80 DMA1_ES=0x0 ============================================================ My linker: /* M4/armgcc/MIMXRT1176xxxxx_cm4_flexspi_nor.ld * M4 XIP-from-FlexSPI with ITCM/DTCM hot sections + SDRAM * OCRAM partition (1MB @ 0x2024_0000): * - 128KB DMA-safe / Device/non-cache : 0x20240000..0x2025FFFF * - 128KB M4 cacheable local scratch : 0x20260000..0x2027FFFF * - 768KB SHARED (M4<->M7) non-cache : 0x20280000..0x2033FFFF * - LAST 8KB of SHARED reserved for M7-only : 0x2033E000..0x2033FFFF (NOT in M4 linker region) * * Additional fixed carve-out (within shared-for-both, before M7 DMA slice): * - 36KB fixed SHARED SysView/RTT window for M4 : 0x20335000..0x2033DFFF * - Shared main (for IPC etc) : 0x20280000..0x20334FFF */ ENTRY(Reset_Handler) HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0400; SDRAM_BASE = 0x80000000; SDRAM_SIZE = 0x04000000; /* 64 MB */ SDRAM_C_SIZE = 0x00800000; /* 8 MB cacheable */ SDRAM_NC_BASE = SDRAM_BASE + SDRAM_C_SIZE; /* 0x80800000 */ SDRAM_NC_SIZE = SDRAM_SIZE - SDRAM_C_SIZE; /* 56 MB */ M4_FLASH_BASE = 0x33600000; M4_FLASH_SIZE = 0x00A00000; /* OCRAM: 1MB */ OCRAM_BASE = 0x20240000; OCRAM_SIZE = 0x00100000; /* Local OCRAM total = DMA 128KB + cacheable scratch 128KB = 256KB */ OCRAM_LOCAL_TOTAL_SIZE = 0x00040000; /* 256KB */ /* DMA-safe non-cache local window (first 128KB) */ OCRAM_DMA_NC_BASE = 0x20240000; OCRAM_DMA_NC_SIZE = 0x00020000; /* 128KB */ /* M4 cacheable scratch window (next 128KB) */ OCRAM_LOCAL_C_BASE = 0x20260000; OCRAM_LOCAL_C_SIZE = 0x00020000; /* 128KB */ /* Shared OCRAM starts at 0x20280000 (rest = 768KB) */ OCRAM_SHARED_BASE = OCRAM_BASE + OCRAM_LOCAL_TOTAL_SIZE; /* 0x20280000 */ OCRAM_SHARED_SIZE_FULL = OCRAM_SIZE - OCRAM_LOCAL_TOTAL_SIZE; /* 0x000C0000 */ /* Reserve LAST 8KB of shared OCRAM for M7-only DMA buffers (exclude from M4 region) */ M7_DMA_OCRAM_BYTES = 0x00002000; /* 8KB */ OCRAM_SHARED_FOR_BOTH_SIZE = OCRAM_SHARED_SIZE_FULL - M7_DMA_OCRAM_BYTES; /* 0x000BE000 */ /* Fixed SysView/RTT carve-out for M4 at end of shared-for-both (36KB) */ SYSVIEW_M4_BYTES = 0x00009000; /* 36KB */ /* Shared main size (everything except the fixed 36KB window) */ OCRAM_SHARED_MAIN_SIZE = OCRAM_SHARED_FOR_BOTH_SIZE - SYSVIEW_M4_BYTES; /* 0x000B5000 */ /* SysView M4 base (fixed) */ OCRAM_SYSVIEW_M4_BASE = OCRAM_SHARED_BASE + OCRAM_SHARED_MAIN_SIZE; /* 0x20335000 */ OCRAM_SYSVIEW_M4_SIZE = SYSVIEW_M4_BYTES; /* 0x00009000 */ MEMORY { m_interrupts (RX) : ORIGIN = M4_FLASH_BASE, LENGTH = 0x00000400 m_text (RX) : ORIGIN = M4_FLASH_BASE + 0x400, LENGTH = M4_FLASH_SIZE - 0x00000400 m_itcm (RX) : ORIGIN = 0x1FFE0000, LENGTH = 0x00020000 m_dtcm (RW) : ORIGIN = 0x20000000, LENGTH = 0x00020000 /* OCRAM partition */ m_ncache_local (RW) : ORIGIN = OCRAM_DMA_NC_BASE, LENGTH = OCRAM_DMA_NC_SIZE m_ocram_cache (RW) : ORIGIN = OCRAM_LOCAL_C_BASE, LENGTH = OCRAM_LOCAL_C_SIZE m_shared_ocram_main (RW) : ORIGIN = OCRAM_SHARED_BASE, LENGTH = OCRAM_SHARED_MAIN_SIZE m_shared_sysview_m4 (RW) : ORIGIN = OCRAM_SYSVIEW_M4_BASE, LENGTH = OCRAM_SYSVIEW_M4_SIZE m_sdram_c (RW) : ORIGIN = SDRAM_BASE, LENGTH = SDRAM_C_SIZE m_sdram_nc (RW) : ORIGIN = SDRAM_NC_BASE, LENGTH = SDRAM_NC_SIZE } SECTIONS { __NCACHE_REGION_START = OCRAM_BASE; __NCACHE_REGION_SIZE = OCRAM_SIZE; __SHARED_OCRAM_START = ORIGIN(m_shared_ocram_main); __SHARED_OCRAM_SIZE = LENGTH(m_shared_ocram_main); __SYSVIEW_M4_BASE = ORIGIN(m_shared_sysview_m4); __SYSVIEW_M4_SIZE = LENGTH(m_shared_sysview_m4); __OCRAM_CACHE_START = ORIGIN(m_ocram_cache); __OCRAM_CACHE_SIZE = LENGTH(m_ocram_cache); .shared_ocram (NOLOAD) : { . = ALIGN(32); __SHARED_OCRAM_START__ = .; *(.shared_ocram*) *(SharedOcram*) . = ALIGN(32); __SHARED_OCRAM_END__ = .; ASSERT((__SHARED_OCRAM_END__ - __SHARED_OCRAM_START__) <= LENGTH(m_shared_ocram_main), "shared_ocram section too large"); } > m_shared_ocram_main .shared_sysview_m4 (NOLOAD) : { . = ALIGN(32); __SYSVIEW_M4_START__ = .; KEEP(*(.shared_sysview_m4)) KEEP(*(.shared_sysview_m4.*)) . = ALIGN(32); __SYSVIEW_M4_END__ = .; ASSERT((__SYSVIEW_M4_END__ - __SYSVIEW_M4_START__) <= LENGTH(m_shared_sysview_m4), "shared_sysview_m4 section too large (max 36KB)"); } > m_shared_sysview_m4 .ocram_cache (NOLOAD) : { . = ALIGN(32); __OCRAM_CACHE_START__ = .; *(.ocram_cache*) *(OcramCache*) . = ALIGN(32); __OCRAM_CACHE_END__ = .; ASSERT((__OCRAM_CACHE_END__ - __OCRAM_CACHE_START__) <= LENGTH(m_ocram_cache), "ocram_cache section too large"); } > m_ocram_cache .interrupts : { __VECTOR_TABLE = .; __Vectors = .; . = ALIGN(4); KEEP(*(.isr_vector)) . = ALIGN(4); } > m_interrupts /* ================================================================ * HOT CODE IN ITCM (VMA=ITCM, LMA computed later) * ================================================================ */ .itcm_text : AT(__itcm_text_load__) { . = ALIGN(32); __itcm_text_start__ = .; *(.itcm_text*) *(ITCM_TEXT*) /* your hot TUs */ */DspParameterManager.cpp.obj(.text .text.*) */audio_param_task.cpp.obj(.text .text.*) */StepSequencer.cpp.obj(.text .text.*) */sequencer_task.cpp.obj(.text .text.*) /* MU ISR(s) - by symbol section name */ *(.text.MUB_IRQHandler) /* FreeRTOS hot bits - by symbol section name */ *(.text.SVC_Handler) *(.text.PendSV_Handler) *(.text.SysTick_Handler) *(.text.vPortEnterCritical) *(.text.vPortExitCritical) *(.text.vPortValidateInterruptPriority) *(.text.xPortStartScheduler) *(.text.vPortSetupTimerInterrupt) *(.text.xTaskIncrementTick) *(.text.vTaskSwitchContext) *(.text.vTaskGenericNotifyGiveFromISR) *(.text.xTaskGenericNotify) *(.text.xQueueGenericSendFromISR) *(.text.xQueueGiveFromISR) . = ALIGN(32); __itcm_text_end__ = .; } > m_itcm /* ================================================================ * HOT RODATA IN DTCM (LMA computed later) * ================================================================ */ .dtcm_rodata : AT(__dtcm_rodata_load__) { . = ALIGN(32); __dtcm_rodata_start__ = .; */DspParameterManager.cpp.obj(.rodata .rodata.*) */audio_param_task.cpp.obj(.rodata .rodata.*) */StepSequencer.cpp.obj(.rodata .rodata.*) */sequencer_task.cpp.obj(.rodata .rodata.*) . = ALIGN(32); __dtcm_rodata_end__ = .; } > m_dtcm /* ================================================================ * HOT DATA IN DTCM (LMA computed later) * ================================================================ */ .dtcm_data : AT(__dtcm_data_load__) { . = ALIGN(32); __dtcm_data_start__ = .; *(.dtcm_data*) *(DTCM_DATA*) . = ALIGN(32); __dtcm_data_end__ = .; } > m_dtcm /* ================================================================ * FLASH XIP TEXT/RODATA (catch-all) * ================================================================ */ .text : { . = ALIGN(4); *(.text .text*) *(.rodata .rodata*) *(.glue_7) *(.glue_7t) *(.eh_frame) KEEP(*(.init)) KEEP(*(.fini)) . = ALIGN(4); } > m_text .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } > m_text .ARM : { __exidx_start = .; *(.ARM.exidx*) __exidx_end = .; } > m_text .ctors : { __CTOR_LIST__ = .; KEEP (*crtbegin.o(.ctors)) KEEP (*crtbegin?.o(.ctors)) KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) KEEP (*(SORT(.ctors.*))) KEEP (*(.ctors)) __CTOR_END__ = .; } > m_text .dtors : { __DTOR_LIST__ = .; KEEP (*crtbegin.o(.dtors)) KEEP (*crtbegin?.o(.dtors)) KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) KEEP (*(SORT(.dtors.*))) KEEP (*(.dtors)) __DTOR_END__ = .; } > m_text .preinit_array : { PROVIDE_HIDDEN (__preinit_array_start = .); KEEP (*(.preinit_array*)) PROVIDE_HIDDEN (__preinit_array_end = .); } > m_text .init_array : { PROVIDE_HIDDEN (__init_array_start = .); KEEP (*(SORT(.init_array.*))) KEEP (*(.init_array*)) PROVIDE_HIDDEN (__init_array_end = .); } > m_text .fini_array : { PROVIDE_HIDDEN (__fini_array_start = .); KEEP (*(SORT(.fini_array.*))) KEEP (*(.fini_array*)) PROVIDE_HIDDEN (__fini_array_end = .); } > m_text /* ================================================================ * CRITICAL FIX: * Start load-images AFTER ALL flash-resident sections above. * At this point, '.' is at the real end of flash content. * ================================================================ */ __DATA_ROM = .; __itcm_text_load__ = __DATA_ROM; __dtcm_rodata_load__ = __itcm_text_load__ + SIZEOF(.itcm_text); __dtcm_data_load__ = __dtcm_rodata_load__ + SIZEOF(.dtcm_rodata); /* NXP startup expects .data LMA at __etext */ __etext = __dtcm_data_load__ + SIZEOF(.dtcm_data); .data : AT(__etext) { . = ALIGN(4); __DATA_RAM = .; __data_start__ = .; *(.data) *(.data*) *(DataQuickAccess) KEEP(*(.jcr*)) . = ALIGN(4); __data_end__ = .; } > m_dtcm __NDATA_ROM = __etext + (__data_end__ - __data_start__); .ncache.init : AT(__NDATA_ROM) { __noncachedata_start__ = .; *(NonCacheable.init) . = ALIGN(4); __noncachedata_init_end__ = .; } > m_ncache_local .ncache (NOLOAD) : { *(NonCacheable) . = ALIGN(4); __noncachedata_end__ = .; } > m_ncache_local .bss (NOLOAD) : { . = ALIGN(4); __bss_start__ = .; *(.bss) *(.bss*) *(COMMON) . = ALIGN(4); __bss_end__ = .; } > m_dtcm .dtcm_bss (NOLOAD) : { . = ALIGN(32); __dtcm_bss_start__ = .; *(.dtcm_bss*) *(DTCM_BSS*) . = ALIGN(32); __dtcm_bss_end__ = .; } > m_dtcm __SDRAM_C_DATA_ROM = __NDATA_ROM + (__noncachedata_init_end__ - __noncachedata_start__); .sdram_c_data : AT(__SDRAM_C_DATA_ROM) { . = ALIGN(32); __sdram_c_data_start__ = .; *(.sdram_c_data*) *(SDRAM_C_DATA*) . = ALIGN(32); __sdram_c_data_end__ = .; } > m_sdram_c __sdram_c_data_load__ = __SDRAM_C_DATA_ROM; .sdram_c_bss (NOLOAD) : { . = ALIGN(32); __sdram_c_bss_start__ = .; *(.sdram_c_bss*) *(SDRAM_C_BSS*) . = ALIGN(32); __sdram_c_bss_end__ = .; } > m_sdram_c .sdram_nc_bss (NOLOAD) : { . = ALIGN(32); __sdram_nc_bss_start__ = .; *(.sdram_nc_bss*) *(SDRAM_NC_BSS*) . = ALIGN(32); __sdram_nc_bss_end__ = .; } > m_sdram_nc .heap : { . = ALIGN(8); __end__ = .; PROVIDE(end = .); __HeapBase = .; . += HEAP_SIZE; __HeapLimit = .; __heap_limit = .; } > m_dtcm .stack : { . = ALIGN(8); . += STACK_SIZE; __StackEnd = .; } > m_dtcm __StackTop = ORIGIN(m_dtcm) + LENGTH(m_dtcm); __StackLimit = __StackTop - STACK_SIZE; PROVIDE(__stack = __StackTop); .ARM.attributes 0 : { *(.ARM.attributes) } __SDRAM_BASE = SDRAM_BASE; __SDRAM_SIZE = SDRAM_SIZE; __SDRAM_C_BASE = SDRAM_BASE; __SDRAM_C_SIZE = SDRAM_C_SIZE; __SDRAM_NC_BASE = SDRAM_NC_BASE; __SDRAM_NC_SIZE = SDRAM_NC_SIZE; } MPUconfig: /* -------------------------------------------------------------------------- */ /* CM7 MPU config */ /* -------------------------------------------------------------------------- */ #if __CORTEX_M == 7 void BOARD_ConfigMPU(void) { #if defined(__ICCARM__) || defined(__GNUC__) extern uint32_t __NCACHE_REGION_START[]; extern uint32_t __NCACHE_REGION_SIZE[]; uint32_t nonCacheStart = (uint32_t)__NCACHE_REGION_START; uint32_t size = (uint32_t)__NCACHE_REGION_SIZE; #else uint32_t nonCacheStart = OCRAM_BASE_EXPECTED; uint32_t size = OCRAM_SIZE_EXPECTED; #endif (void)nonCacheStart; (void)size; #if defined(__ICACHE_PRESENT) && __ICACHE_PRESENT if (SCB_CCR_IC_Msk == (SCB_CCR_IC_Msk & SCB->CCR)) { SCB_DisableICache(); } #endif #if defined(__DCACHE_PRESENT) && __DCACHE_PRESENT if (SCB_CCR_DC_Msk == (SCB_CCR_DC_Msk & SCB->CCR)) { SCB_DisableDCache(); } #endif ARM_MPU_Disable(); /* Region 0: deny all (speculative prefetch workaround) */ MPU->RBAR = ARM_MPU_RBAR(0, 0x00000000U); MPU->RASR = ARM_MPU_RASR(1, ARM_MPU_AP_NONE, 0, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_4GB); /* Region 1: Device, non-shareable, non-cacheable */ MPU->RBAR = ARM_MPU_RBAR(1, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_512MB); /* Region 2: Device, non-shareable, non-cacheable */ MPU->RBAR = ARM_MPU_RBAR(2, 0x60000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_512MB); /* Region 3: Device, non-shareable, non-cacheable */ MPU->RBAR = ARM_MPU_RBAR(3, 0x00000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_1GB); /* Region 4: Normal, WB */ MPU->RBAR = ARM_MPU_RBAR(4, 0x00000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_256KB); /* Region 5: Normal, WB */ MPU->RBAR = ARM_MPU_RBAR(5, 0x20000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_256KB); /* OCRAM on CM7: Normal + Shareable + Non-cacheable (TEX=1,S=1,C=0,B=0) */ /* Region 6: 0x20240000..0x2027FFFF (256KB) */ MPU->RBAR = ARM_MPU_RBAR(6, 0x20240000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 1, 1, 0, 0, 0, ARM_MPU_REGION_SIZE_256KB); /* Region 7: 0x20280000..0x202FFFFF (512KB) */ MPU->RBAR = ARM_MPU_RBAR(7, 0x20280000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 1, 1, 0, 0, 0, ARM_MPU_REGION_SIZE_512KB); /* Region 10: 0x20300000..0x2033FFFF (256KB) */ MPU->RBAR = ARM_MPU_RBAR(10, 0x20300000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 1, 1, 0, 0, 0, ARM_MPU_REGION_SIZE_256KB); #if USE_SDRAM /* Region 11: SDRAM default NON-cacheable 64MB (Normal non-cache) */ MPU->RBAR = ARM_MPU_RBAR(11, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 1, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_64MB); #if defined(CACHE_MODE_WRITE_THROUGH) && CACHE_MODE_WRITE_THROUGH /* Region 12: overlay first 8MB as cacheable (WT) */ MPU->RBAR = ARM_MPU_RBAR(12, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 0, 0, ARM_MPU_REGION_SIZE_8MB); #else /* Region 12: overlay first 8MB as cacheable (WB) */ MPU->RBAR = ARM_MPU_RBAR(12, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_8MB); #endif #endif /* USE_SDRAM */ #if defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1) /* Region 8: XIP external flash, RO, cacheable WB, cover full 64MB */ MPU->RBAR = ARM_MPU_RBAR(8, 0x30000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_RO, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_64MB); #endif /* Peripheral windows */ MPU->RBAR = ARM_MPU_RBAR(13, 0x40000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_16MB); MPU->RBAR = ARM_MPU_RBAR(14, 0x41000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_2MB); MPU->RBAR = ARM_MPU_RBAR(15, 0x41400000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_1MB); ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk); #if defined(__DCACHE_PRESENT) && __DCACHE_PRESENT SCB_EnableDCache(); #endif #if defined(__ICACHE_PRESENT) && __ICACHE_PRESENT SCB_EnableICache(); #endif } #endif /* __CORTEX_M == 7 */ /* -------------------------------------------------------------------------- */ /* CM4 MPU config */ /* -------------------------------------------------------------------------- */ #if __CORTEX_M == 4 void BOARD_ConfigMPU(void) { /* ---- Disable code bus cache (LMEM) ---- */ if (LMEM_PCCCR_ENCACHE_MASK == (LMEM_PCCCR_ENCACHE_MASK & LMEM->PCCCR)) { LMEM->PCCCR |= LMEM_PCCCR_PUSHW0_MASK | LMEM_PCCCR_PUSHW1_MASK | LMEM_PCCCR_GO_MASK; while ((LMEM->PCCCR & LMEM_PCCCR_GO_MASK) != 0U) {} LMEM->PCCCR &= ~(LMEM_PCCCR_PUSHW0_MASK | LMEM_PCCCR_PUSHW1_MASK); LMEM->PCCCR &= ~LMEM_PCCCR_ENCACHE_MASK; } /* ---- Disable system bus cache (LMEM) ---- */ if (LMEM_PSCCR_ENCACHE_MASK == (LMEM_PSCCR_ENCACHE_MASK & LMEM->PSCCR)) { LMEM->PSCCR |= LMEM_PSCCR_PUSHW0_MASK | LMEM_PSCCR_PUSHW1_MASK | LMEM_PSCCR_GO_MASK; while ((LMEM->PSCCR & LMEM_PSCCR_GO_MASK) != 0U) {} LMEM->PSCCR &= ~(LMEM_PSCCR_PUSHW0_MASK | LMEM_PSCCR_PUSHW1_MASK); LMEM->PSCCR &= ~LMEM_PSCCR_ENCACHE_MASK; } ARM_MPU_Disable(); /* Region 0: 0x20240000..0x2025FFFF (128KB) DMA -> Device/non-cache. * Keep the original attributes here: UART/SPI/SD DMA buffers live in this * window and require the proven non-cache behavior with CM4 LMEM. */ MPU->RBAR = ARM_MPU_RBAR(0, OCRAM_DMA_NC_BASE); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 1, /* shareable recommended */ 0, /* non-cacheable */ 0, 0, ARM_MPU_REGION_SIZE_128KB); /* Region 1: 0x20260000..0x2027FFFF (128KB) local scratch -> Normal WB cacheable */ MPU->RBAR = ARM_MPU_RBAR(1, OCRAM_LOCAL_C_BASE); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, /* Normal */ 0, /* not shareable */ 1, /* cacheable */ 1, /* bufferable (WB) */ 0, ARM_MPU_REGION_SIZE_128KB); /* Region 2: 0x20280000..0x202FFFFF (512KB) shared -> original non-cache attrs */ MPU->RBAR = ARM_MPU_RBAR(2, 0x20280000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 1, /* shareable */ 0, /* non-cacheable */ 0, 0, ARM_MPU_REGION_SIZE_512KB); /* Region 3: 0x20300000..0x2033FFFF (256KB) shared -> original non-cache attrs */ MPU->RBAR = ARM_MPU_RBAR(3, 0x20300000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 1, /* shareable */ 0, /* non-cacheable */ 0, 0, ARM_MPU_REGION_SIZE_256KB); #if USE_SDRAM /* Linker split: * m_sdram_c = 0x80000000..0x807FFFFF (8MB) * m_sdram_nc = 0x80800000..0x83FFFFFF (56MB) * * The MPU cannot describe 56MB directly, so region 4 makes the full 64MB * SDRAM window Device/non-cache and region 5 overlays the first 8MB as * cacheable. Higher-numbered MPU regions take precedence. */ (void)SDRAM_NC_BASE; (void)SDRAM_NC_SIZE; /* Region 4: full SDRAM default, 0x80000000..0x83FFFFFF -> Device/non-cache */ MPU->RBAR = ARM_MPU_RBAR(4, SDRAM_BASE_EXPECTED); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, /* Device */ 0, /* not shareable */ 0, /* non-cacheable */ 0, 0, ARM_MPU_REGION_SIZE_64MB); #if defined(CACHE_MODE_WRITE_THROUGH) && CACHE_MODE_WRITE_THROUGH /* Region 5: linker m_sdram_c, 0x80000000..0x807FFFFF -> Normal write-through */ MPU->RBAR = ARM_MPU_RBAR(5, SDRAM_C_BASE); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, /* Normal */ 0, /* not shareable */ 1, /* cacheable */ 0, /* write-through */ 0, ARM_MPU_REGION_SIZE_8MB); #else /* Region 5: linker m_sdram_c, 0x80000000..0x807FFFFF -> Normal write-back */ MPU->RBAR = ARM_MPU_RBAR(5, SDRAM_C_BASE); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, /* Normal */ 0, /* not shareable */ 1, /* cacheable */ 1, /* write-back */ 0, ARM_MPU_REGION_SIZE_8MB); #endif #endif /* USE_SDRAM */ ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk); /* Invalidate and enable system bus cache (PSCCR) */ LMEM->PSCCR |= LMEM_PSCCR_INVW0_MASK | LMEM_PSCCR_INVW1_MASK | LMEM_PSCCR_GO_MASK; while ((LMEM->PSCCR & LMEM_PSCCR_GO_MASK) != 0U) {} LMEM->PSCCR &= ~(LMEM_PSCCR_INVW0_MASK | LMEM_PSCCR_INVW1_MASK); LMEM->PSCCR |= LMEM_PSCCR_ENCACHE_MASK; /* Invalidate and enable code bus cache (PCCCR) */ LMEM->PCCCR |= LMEM_PCCCR_INVW0_MASK | LMEM_PCCCR_INVW1_MASK | LMEM_PCCCR_GO_MASK; while ((LMEM->PCCCR & LMEM_PCCCR_GO_MASK) != 0U) {} LMEM->PCCCR &= ~(LMEM_PCCCR_INVW0_MASK | LMEM_PCCCR_INVW1_MASK); LMEM->PCCCR |= LMEM_PCCCR_ENCACHE_MASK; } #endif /* __CORTEX_M == 4 */ I also tried this with similar results but got missmatching checksums when writing from non cacheable ocram to non cacheable sdram using dma:  #if __CORTEX_M == 7 void BOARD_ConfigMPU(void) { #if defined(__ICCARM__) || defined(__GNUC__) extern uint32_t __NCACHE_REGION_START[]; extern uint32_t __NCACHE_REGION_SIZE[]; uint32_t nonCacheStart = (uint32_t)__NCACHE_REGION_START; uint32_t size = (uint32_t)__NCACHE_REGION_SIZE; #else uint32_t nonCacheStart = OCRAM_BASE_EXPECTED; uint32_t size = OCRAM_SIZE_EXPECTED; #endif (void)nonCacheStart; (void)size; #if defined(__ICACHE_PRESENT) && __ICACHE_PRESENT if (SCB_CCR_IC_Msk == (SCB_CCR_IC_Msk & SCB->CCR)) { SCB_DisableICache(); } #endif #if defined(__DCACHE_PRESENT) && __DCACHE_PRESENT if (SCB_CCR_DC_Msk == (SCB_CCR_DC_Msk & SCB->CCR)) { SCB_DisableDCache(); } #endif ARM_MPU_Disable(); /* Region 0: deny all (speculative prefetch workaround) */ MPU->RBAR = ARM_MPU_RBAR(0, 0x00000000U); MPU->RASR = ARM_MPU_RASR(1, ARM_MPU_AP_NONE, 0, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_4GB); /* Region 1: Device, non-shareable, non-cacheable */ MPU->RBAR = ARM_MPU_RBAR(1, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_512MB); /* Region 2: Device, non-shareable, non-cacheable */ MPU->RBAR = ARM_MPU_RBAR(2, 0x60000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_512MB); /* Region 3: Device, non-shareable, non-cacheable */ MPU->RBAR = ARM_MPU_RBAR(3, 0x00000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_1GB); /* Region 4: Normal, WB */ MPU->RBAR = ARM_MPU_RBAR(4, 0x00000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_256KB); /* Region 5: Normal, WB */ MPU->RBAR = ARM_MPU_RBAR(5, 0x20000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_256KB); /* OCRAM on CM7: Normal + Shareable + Non-cacheable (TEX=1,S=1,C=0,B=0) */ /* Region 6: 0x20240000..0x2027FFFF (256KB) */ MPU->RBAR = ARM_MPU_RBAR(6, 0x20240000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 1, 1, 0, 0, 0, ARM_MPU_REGION_SIZE_256KB); /* Region 7: 0x20280000..0x202FFFFF (512KB) */ MPU->RBAR = ARM_MPU_RBAR(7, 0x20280000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 1, 1, 0, 0, 0, ARM_MPU_REGION_SIZE_512KB); /* Region 10: 0x20300000..0x2033FFFF (256KB) */ MPU->RBAR = ARM_MPU_RBAR(10, 0x20300000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 1, 1, 0, 0, 0, ARM_MPU_REGION_SIZE_256KB); #if USE_SDRAM /* Region 11: SDRAM default NON-cacheable 64MB (Normal non-cache) */ MPU->RBAR = ARM_MPU_RBAR(11, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 1, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_64MB); #if defined(CACHE_MODE_WRITE_THROUGH) && CACHE_MODE_WRITE_THROUGH /* Region 12: overlay first 8MB as cacheable (WT) */ MPU->RBAR = ARM_MPU_RBAR(12, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 0, 0, ARM_MPU_REGION_SIZE_8MB); #else /* Region 12: overlay first 8MB as cacheable (WB) */ MPU->RBAR = ARM_MPU_RBAR(12, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_8MB); #endif #endif /* USE_SDRAM */ #if defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1) /* Region 8: XIP external flash, RO, cacheable WB, cover full 64MB */ MPU->RBAR = ARM_MPU_RBAR(8, 0x30000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_RO, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_64MB); #endif /* Peripheral windows */ MPU->RBAR = ARM_MPU_RBAR(13, 0x40000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_16MB); MPU->RBAR = ARM_MPU_RBAR(14, 0x41000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_2MB); MPU->RBAR = ARM_MPU_RBAR(15, 0x41400000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_1MB); ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk); #if defined(__DCACHE_PRESENT) && __DCACHE_PRESENT SCB_EnableDCache(); #endif #if defined(__ICACHE_PRESENT) && __ICACHE_PRESENT SCB_EnableICache(); #endif } #endif /* __CORTEX_M == 7 */ /* -------------------------------------------------------------------------- */ /* CM4 MPU config */ /* -------------------------------------------------------------------------- */ #if __CORTEX_M == 4 void BOARD_ConfigMPU(void) { /* ---- Disable code bus cache (LMEM) ---- */ if (LMEM_PCCCR_ENCACHE_MASK == (LMEM_PCCCR_ENCACHE_MASK & LMEM->PCCCR)) { LMEM->PCCCR |= LMEM_PCCCR_PUSHW0_MASK | LMEM_PCCCR_PUSHW1_MASK | LMEM_PCCCR_GO_MASK; while ((LMEM->PCCCR & LMEM_PCCCR_GO_MASK) != 0U) {} LMEM->PCCCR &= ~(LMEM_PCCCR_PUSHW0_MASK | LMEM_PCCCR_PUSHW1_MASK); LMEM->PCCCR &= ~LMEM_PCCCR_ENCACHE_MASK; } /* ---- Disable system bus cache (LMEM) ---- */ if (LMEM_PSCCR_ENCACHE_MASK == (LMEM_PSCCR_ENCACHE_MASK & LMEM->PSCCR)) { LMEM->PSCCR |= LMEM_PSCCR_PUSHW0_MASK | LMEM_PSCCR_PUSHW1_MASK | LMEM_PSCCR_GO_MASK; while ((LMEM->PSCCR & LMEM_PSCCR_GO_MASK) != 0U) {} LMEM->PSCCR &= ~(LMEM_PSCCR_PUSHW0_MASK | LMEM_PSCCR_PUSHW1_MASK); LMEM->PSCCR &= ~LMEM_PSCCR_ENCACHE_MASK; } ARM_MPU_Disable(); /* Region 0: 0x20240000..0x2025FFFF (128KB) DMA -> Normal non-cacheable */ MPU->RBAR = ARM_MPU_RBAR(0, OCRAM_DMA_NC_BASE); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, /* Normal */ 1, /* shareable recommended */ 0, /* non-cacheable */ 0, 0, ARM_MPU_REGION_SIZE_128KB); /* Region 1: 0x20260000..0x2027FFFF (128KB) local scratch -> Normal WB cacheable */ MPU->RBAR = ARM_MPU_RBAR(1, OCRAM_LOCAL_C_BASE); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, /* Normal */ 0, /* not shareable */ 1, /* cacheable */ 1, /* bufferable (WB) */ 0, ARM_MPU_REGION_SIZE_128KB); /* Region 2: 0x20280000..0x202FFFFF (512KB) shared -> Normal (shareable) */ MPU->RBAR = ARM_MPU_RBAR(2, 0x20280000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, /* Normal */ 1, /* shareable */ 0, /* non-cacheable */ 0, 0, ARM_MPU_REGION_SIZE_512KB); /* Region 3: 0x20300000..0x2033FFFF (256KB) shared -> Normal (shareable) */ MPU->RBAR = ARM_MPU_RBAR(3, 0x20300000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, /* Normal*/ 1, /* shareable */ 0, /* non-cacheable */ 0, 0, ARM_MPU_REGION_SIZE_256KB); ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk); /* Invalidate and enable system bus cache (PSCCR) */ LMEM->PSCCR |= LMEM_PSCCR_INVW0_MASK | LMEM_PSCCR_INVW1_MASK | LMEM_PSCCR_GO_MASK; while ((LMEM->PSCCR & LMEM_PSCCR_GO_MASK) != 0U) {} LMEM->PSCCR &= ~(LMEM_PSCCR_INVW0_MASK | LMEM_PSCCR_INVW1_MASK); LMEM->PSCCR |= LMEM_PSCCR_ENCACHE_MASK; /* Invalidate and enable code bus cache (PCCCR) */ LMEM->PCCCR |= LMEM_PCCCR_INVW0_MASK | LMEM_PCCCR_INVW1_MASK | LMEM_PCCCR_GO_MASK; while ((LMEM->PCCCR & LMEM_PCCCR_GO_MASK) != 0U) {} LMEM->PCCCR &= ~(LMEM_PCCCR_INVW0_MASK | LMEM_PCCCR_INVW1_MASK); LMEM->PCCCR |= LMEM_PCCCR_ENCACHE_MASK; } #endif /* __CORTEX_M == 4 */ Evaluation Board Re: RT1170 EVKB M4 memory speed Hi @cyberhelmer , Thanks for your interest in NXP MIMXRT series! NXP has provided test results based on the RT1050. You can view this application note and the corresponding software: https://www.nxp.com/docs/en/application-note/AN12437.pdf https://www.nxp.com/products/i.MX-RT1050 I did a quick comparison and found that during the SDRAM write test, ANSW used the following settings: Normal memory property, pure 32-bit sequential writes, and DSB after write. We recommend that you refer to this ANSW to conduct the corresponding experiment. Best regards, Gavin
記事全体を表示
RT1170 EVKB M4 内存速度 我正在对 RT1170 evkb 的 M4 内核内存访问进行一些基准测试。当 M4 访问主板上的 同步动态随机存取存储器 (SDRAM) 和 ocram 时,这些数字是预期的吗?看起来非常慢。 我读到过一些关于 M4 的访问时间较长的信息,因为有 axi 织物等,但这似乎非常慢。我是否在配置中遗漏了什么,导致速度慢于需要? 基准测试包括一些不同的内存源/目的地,但我最感兴趣的改进是 同步动态随机存取存储器(SDRAM) 和 ocram 之间的 edma。我正在实现一个多轨音频流媒体引擎,其中 M4 组 edma 从同步动态随机存取存储器(SDRAM)不可缓存传输到 ocram 不可缓存。然后,M7 内核消耗共享 ocram 的缓冲区。 但测试是独立进行的,应该没有或很少有仲裁发生。 如果我没猜错的话,同步动态随机存取存储器(SDRAM) 和 ocram 区域都设置为不可缓存,在 mpuConfig 中也将 ocram 区域设置为可共享? 音频流复制基准,Cortex-M4 @ 400 MHz 操作:回放 16 x 4096 B SDRAM_NC->OCRAM,记录 8 x 4096 B OCRAM->SDRAM_NC 字节:回放=65536 记录=32768 总计 =98304   CPU memcpy: 播放副本 1532202 Cyc 3830.505 us 记录副本 530291 cyc 1325.727 us scatter total 2062493 cyc 5156.232 us 单个 96K 散装 2301811 cyc 5754.527 us 校验和=239   内存区域复制矩阵(每行 32768 B): regions src: SDRAM_C=80008000 SDRAM_NC=80818000 SHARED=202B8EC0 NCACHE=20248AA0 OCRAM_CACHE=2026E3C0 MPU/ 缓存:CTRL=0x00000007 TYPE=0x00000800 PSCCR=0x00000003 R4=0x80000004/0x03100033 R5=0x80000005/0x0303002d 只有当两个端点都是非高速缓存/DMA 安全时,才会运行 EDMA。 SDRAM_C-> OCRAM_CACHE 字节 =32768 cpu= 1201410 cyc 3003.525 us 10.90 MB/s | edma=跳过可缓存校验和=338 SDRAM_NC-> OCRAM_CACHE 字节 =32768 cpu= 1037590 cyc 2593.975 us 12.63 MB/s | edma=跳过可缓存校验和=602 SDRAM_NC-> SHARED_OCRAM 字节=32768 cpu= 781109 cyc 1952.772 美国 16.78 MB/s | edma=ok 779805 cyc 1949.512 美国 16.80 MB/s 校验和=602/602 | edma+cache=ok 858144 cyc 2145.360 美国 15.27 MB/s checksum=602 SDRAM_NC-> NCACHE_OCRAM 字节=32768 cpu= 777897 cyc 1944.742 美国 16.84 MB/s | edma=ok 751101 cyc 1877.752 我们 17.45 MB/s checksum=602 | edma+cache=ok 853273 cyc 2133.182 美国 15.36 MB/s checksum=602 OCRAM_CACHE-> SDRAM_NC 字节=32768 cpu= 750396 cyc 1875.990 美国 17.46 MB/s | edma=跳过可缓存校验和 =1204 SHARED_OCRAM-> SDRAM_NC 字节=32768 cpu= 53 1143 cyc 1327.857 美国 24.67 MB/s | edma=ok 570792 cyc 1426.980 美国 22.96 MB/s checksum=610 | edma+cache=ok 670564 cyc 1676.410 us 19.54 Mb/s checksum=610 NCACHE_OCRAM-> SDRAM_NC 字节=32768 cpu= 541568 cyc 1353.920 美国 24.20 Mb/s | edma=ok 549911 cyc 1374.777 美国 23.83 Mb/s checksum=940 | edma+cache=ok 649852 cyc 1624.630 us 20.16 Mb/s checksum=940 SDRAM_NC-> SDRAM_NC 字节=32768 cpu= 896 656 cyc 2241.640 我们 14.61 Mb/s | edma=ok 997686 cyc 2494.215 我们 13.13 MB/s checksum=602/602 | edma+cache=ok 1130798 cyc 2826.995 美国 11.59 MB/s checksum=602 OCRAM_CACHE-> OCRAM_CACHE 字节 =32768 cpu= 768904 cyc 1922.260 us 17.04 MB/s | edma=跳过可缓存校验和 =1204 SHARED_OCRAM-> SHARED_OCRAM 字节 =32768 cpu= 425929 cyc 1064.822 美国 30.77 MB/s | edma=ok 433498 cyc 1083.745 美国 30.23 MB/s 校验和=610/610 | edma+cache=ok 542913 cyc 1357.282 us 24.14 Mb/s checksum=610   EDMA 散射/采集 24 x 4K,NBYTES=4096: ops=24 nbytes=4096 ok=1 描述符 设置+启动 58942 cyc 147.355 us 等待完成/出错 2031292 cyc 5078.230 us 共计 2090234 Cyc 5225.585 US checksum=239 channelFlags=0x1 errorFlags=0x0 remaining=0 csr=0x0088 citer=1 biter=1   EDMA 散射/采集 24 x 4K,NBYTES=32: ops=24 nbytes=32 ok=1 描述符设置+启动 47526 cyc 118.815 us 等待完成/错误 2055017 Cyc 5137.542 us 共计 2102543 Cyc 5256.357 US checksum=239 channelFlags=0x1 errorFlags=0x0 remaining=0 csr=0x0088 citer=128 biter=128   EDMA 单 4K,NBYTES=4096: ops=1 nbytes=4096 ok=1 描述符设置+启动 5713 Cyc 14.282 us 等待完成/出错 93592 Cyc 233.980 us 共计 99305 cyc 248.262 us checksum=239 channelFlags=0x1 errorFlags=0x0 remaining=0 csr=0x0088 citer=1 biter=1   EDMA 单 4K,NBYTES=32: ops=1 nbytes=32 ok=1 描述符 设置+启动 5344 Cyc 13.360 us 等待完成/出错 94609 cyc 236.522 us 共计 99953 cyc 249.882 us checksum=239 channelFlags=0x1 errorFlags=0x0 remaining=0 csr=0x0088 citer=128 biter=128   EDMA 单通道 96K,NBYTES=4096: ops=1 nbytes=4096 ok=1 描述符 设置+启动 5867 cyc 14.667 us 等待完成/出错 2230360 Cyc 5575.900 us 共计 2236227 Cyc 5590.567 US checksum=239 channelFlags=0x1 errorFlags=0x0 remaining=0 csr=0x0088 citer=24 biter=24   EDMA 单通道 96K,NBYTES=32: ops=1 nbytes=32 ok=1 描述符设置+启动 5713 Cyc 14.282 us 等待完成/错误 2256234 Cyc 5640.585 us 共计 2261947 Cyc 5654.867 US checksum=239 channelFlags=0x1 errorFlags=0x0 remaining=0 csr=0x0088 citer=3072 biter=3072 DMAMUX1_CHCFG[2]=0xa0000000 DMA1_ERQ=0x80 DMA1_ES=0x0 ============================================================ My linker: /* M4/armgcc/MIMXRT1176xxxxx_cm4_flexspi_nor.ld * 带有 ITCM/DTCM 热门部分的 M4 XIP-from-FlexSPI + 同步动态随机存取存储器(SDRAM) * OCRAM 分区(1MB @ 0x2024_0000): *-128KB DMA 安全/设备/非缓存:0x20240000.. 0x2025FFFF * 128KB M4 缓存本地抓取:0x20260000...0x2027FFFF * - 768KB 共享(M4<->M7)非高速缓存:0x20280000...0x2033FFFF * - 仅为 M7 保留的最后 8KB 共享:0x2033E000...0x2033FFFF(不在 M4 连接器区域内) * * 额外的固定分割(在 M7 DMA 分割之前的共享-双向): * M4 的 36KB 固定共享 SysView/RTT 窗口:0x20335000...0x2033DFFF * - 共享主系统(用于 IPC 等) :0x20280000..0x20334FFF */ ENTRY(Reset_Handler) HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0400; SDRAM_BASE = 0x80000000; SDRAM_SIZE = 0x04000000; /* 64 MB */ SDRAM_C_SIZE = 0x00800000; /* 8 MB 缓存 */ SDRAM_NC_BASE = SDRAM_BASE + SDRAM_C_SIZE; /* 0x80800000 */ sdram_nc_size = sdram_size - sdram_c_size; /* 56 MB */ M4_FLASH_BASE = 0x33600000; M4_FLASH_SIZE = 0x00A00000; /* OCRAM: 1MB */ OCRAM_BASE = 0x20240000; OCRAM_SIZE = 0x00100000; /* 本地 OCRAM 总容量 = DMA 128KB + 可缓存划痕 128KB = 256KB */ OCRAM_LOCAL_TOTAL_SIZE = 0x00040000; /* 256KB */ /* DMA 安全非高速缓存本地窗口(前 128KB) */ OCRAM_DMA_NC_BASE = 0x20240000; OCRAM_DMA_NC_SIZE = 0x00020000; /* 128KB */ /* M4 可缓存抓取窗口(下 128KB) */ OCRAM_LOCAL_C_BASE = 0x20260000; OCRAM_LOCAL_C_SIZE = 0x00020000; /* 128KB */ /* 共享 OCRAM 从 0x20280000 开始(其余部分 = 768KB) */ OCRAM_SHARED_BASE = OCRAM_BASE + OCRAM_LOCAL_TOTAL_SIZE; /* 0x20280000 */ OCRAM_SHARED_SIZE_FULL = OCRAM_SIZE - OCRAM_LOCAL_TOTAL_SIZE; /* 0x000C0000 */ /* 为 M7 专用 DMA 缓冲区保留最后 8KB 共享 OCRAM(不包括 M4 区域) */ M7_DMA_OCRAM_BYTES = 0x00002000; /* 8KB */ OCRAM_SHARED_FOR_BOTH_SIZE = OCRAM_SHARED_SIZE_FULL - M7_DMA_OCRAM_BYTES; /* 0x000BE000 */ /* 修正了 SysView/RTT 在双方共享(36KB)结束时对 M4 的分割 */ SYSVIEW_M4_BYTES = 0x00009000; /* 36KB */ /* 共享主大小(除固定的 36KB 窗口外的所有内容) */ OCRAM_SHARED_MAIN_SIZE = OCRAM_SHARED_FOR_BOTH_SIZE - SYSVIEW_M4_BYTES; /* 0x000B5000 */ /* SysView M4 base(固定) */ OCRAM_SYSVIEW_M4_BASE = OCRAM_SHARED_BASE + OCRAM_SHARED_MAIN_SIZE; /* 0x20335000 */ OCRAM_SYSVIEW_M4_SIZE = SYSVIEW_M4_BYTES; /* 0x00009000 */ 存储器 { m_interrupts (RX) :ORIGIN = M4_FLASH_BASE,LENGTH = 0x00000400 m_text (RX) :ORIGIN = M4_FLASH_BASE + 0x400,LENGTH = M4_FLASH_SIZE - 0x00000400 m_itcm (RX) :ORIGIN = 0x1FFE0000,LENGTH = 0x00020000 m_dtcm (RW) :ORIGIN = 0x20000000,LENGTH = 0x00020000 /* OCRAM 分区 */ m_ncache_local (RW) :origin = ocram_dma_nc_base, length = ocram_dma_nc_size m_ocram_cache (RW) :origin = ocram_local_c_base, length = ocram_local_c_size m_shared_ocram_main (RW) :origin = ocram_shared_base, length = ocram_shared_main_size m_shared_sysview_m4 (RW) :origin = ocram_sysview_m4_base, length = ocram_sysview_m4_size m_sdram_c (RW) :origin = sdram_base,length = sdram_c_size m_sdram_nc (RW) :origin = sdram_nc_base,length = sdram_nc_size } SECTIONS { __ncache_region_start = ocram_base; __ncache_region_size = ocram_size; __SHARED_OCRAM_START = ORIGIN(m_shared_ocram_main); __SHARED_OCRAM_SIZE = LENGTH(m_shared_ocram_main); __SYSVIEW_M4_BASE = ORIGIN(m_shared_sysview_m4); __SYSVIEW_M4_SIZE = LENGTH(m_shared_sysview_m4); __OCRAM_CACHE_START = ORIGIN(m_ocram_cache); __OCRAM_CACHE_SIZE = LENGTH(m_ocram_cache); .shared_ocram (NOLOAD) : { . = ALIGN(32); __shared_ocram_start__ = ..; *(.shared_ocram*) *(SharedOcram*) . = ALIGN(32); __shared_ocram_end__ = ..; ASSERT((__SHARED_OCRAM_END__ - __SHARED_OCRAM_START__)<= LENGTH(m_shared_ocram_main)、 "shared_ocram 部分过大"); }> m_shared_ocram_main .shared_sysview_m4 (NOLOAD) : { . = ALIGN(32); __sysview_m4_start__ = ..; KEEP(*(.shared_sysview_m4)) KEEP(*(.shared_sysview_m4.*)) . = ALIGN(32); __sysview_m4_end__ = ; ASSERT((__SYSVIEW_M4_END__ - __SYSVIEW_M4_START__)<= LENGTH(m_shared_sysview_m4)、 "shared_sysview_m4 部分过大 (max 36KB)"); }> m_shared_sysview_m4 .ocram_cache (NOLOAD) : { . = ALIGN(32); __ocram_cache_start__ = ..; *(.ocram_cache*) *(OcramCache*) . = ALIGN(32); __ocram_cache_end__ = ; ASSERT((__OCRAM_CACHE_END__ - __OCRAM_CACHE_START__)<= LENGTH(m_ocram_cache)、 "ocram_cache 部分过大"); }> m_ocram_cache .中断 : { __vector_table = ; __Vectors = ; . = ALIGN(4); KEEP(*(.isr_vector)) . = ALIGN(4); }> m_interrupts /* ================================================================ * ITCM 中的热代码(VMA=ITCM,LMA 稍后计算) * ================================================================ */ .itcm_text : AT(__itcm_text_load__) { . = ALIGN(32); __itcm_text_start__ = ; *(.itcm_text*) *(ITCM_TEXT*) /* 您的热 TU */ */DspParameterManager.cpp.obj(.text.text.*) */audio_param_task.cpp.obj(.text.text.*) */StepSequencer.cpp.obj(.text.text.*) */sequencer_task.cpp.obj(.text.text.*) /* MU ISR - 按符号部分名称 */ *(.text.MUB_IRQHandler) /* FreeRTOS 热位 - 按符号部分名称 */ *(.text.SVC_Handler) *(.text.PendSV_Handler) *(.text.SysTick_Handler) *(.text.vPortEnterCritical) *(.text.vPortExitCritical) *(.text.vPortValidateInterruptPriority) *(.text.xPortStartScheduler) *(.text.vPortSetupTimerInterrupt) *(.text.xTaskIncrementTick) *(.text.vTaskSwitchContext) *(.text.vTaskGenericNotifyGiveFromISR) *(.text.xTaskGenericNotify) *(.text.xQueueGenericSendFromISR) *(.text.xQueueGiveFromISR) . = ALIGN(32); __itcm_text_end__ = ; }> m_itcm /* ================================================================ * DTCM 中的热 RODATA(稍后计算 LMA) * ================================================================ */ .dtcm_rodata :AT(__dtcm_rodata_load__) { . = ALIGN(32); __dtcm_rodata_start__ = ..; */DspParameterManager.cpp.obj(.rodata.rodata.*) */audio_param_task.cpp.obj(.rodata.rodata.*) */StepSequencer.cpp.obj(.rodata.rodata.*) */sequencer_task.cpp.obj(.rodata.rodata.*) . = ALIGN(32); __dtcm_rodata_end__ = ..; }> m_dtcm /* ================================================================ * DTCM 中的热数据(稍后计算 LMA) * ================================================================ */ .dtcm_data :AT(__dtcm_data_load__) { . = ALIGN(32); __dtcm_data_start__ = ..; *(.dtcm_data*) *(DTCM_DATA*) . = ALIGN(32); __dtcm_data_end__ = ..; }> m_dtcm /* ================================================================ * 闪存 XIP 文本/RODATA(包罗万象) * ================================================================ */ .text : { . = ALIGN(4); *(.text .text*) *(.rodata .rodata*) *(.glue_7) *(.glue_7t) *(.eh_frame) KEEP(*(.init)) KEEP(*(.fini)) . = ALIGN(4); }> m_text .arm.extab: {* (.arm.extab*.gnu.linkonce.armextab.*)}> m_text Arm : { __exidx_start = ; * (.arm.exidx*) __exidx_end = ; }> m_text .ctors : { __ctor_list__ = ; KEEP (*crtbegin.o(.ctors)) KEEP (*crtbegin?.o(.ctors)) KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o)).ctors)) KEEP (*(SORT(.ctors.*)) KEEP (*(.ctors)) __ctor_end__ = ; }> m_text .dtors : { __dtor_list__ = ..; KEEP (*crtbegin.o(.dtors)) KEEP (*crtbegin?.o(.dtors)) KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o)).dtors)) KEEP (*(SORT(.dtors.*)) KEEP (*(.dtors)) __dtor_end__ = ; }> m_text .preinit_array : { PROVIDE_HIDDEN (__preinit_array_start = .); KEEP (*(.preinit_array*)) PROVIDE_HIDDEN (__preinit_array_end = .); }> m_text .init_array : { PROVIDE_HIDDEN (__init_array_start = .); KEEP (*(SORT(.init_array.*)) KEEP (*(.init_array*)) PROVIDE_HIDDEN (__init_array_end = .); }> m_text .fini_array : { PROVIDE_HIDDEN (__fini_array_start = .); KEEP (*(SORT(.fini_array.*)) KEEP (*(.fini_array*)) PROVIDE_HIDDEN (__fini_array_end = .); }> m_text /* ================================================================ * 重要修复: * 在上述所有闪存驻留部分之后开始加载图像。 * 此时,". "位于闪存内容的真正末尾。 * ================================================================ */ __data_rom = ; __itcm_text_load__ = __DATA_ROM; __dtcm_rodata_load__ = __itcm_text_load__ + SIZEOF(.itcm_text); __dtcm_data_load__ = __dtcm_rodata_load__ + SIZEOF(.dtcm_rodata); /* 恩智浦启动时希望使用 .dataLMA at __etext */ __etext = __dtcm_data_load__ + SIZEOF(.dtcm_data); .data :AT(__etext) { . = ALIGN(4); __data_ram = ; __data_start__ = ; *(.data) *(.data*) *(DataQuickAccess) KEEP(*(.jcr*)) . = ALIGN(4); __data_end__ = ; }> m_dtcm __NDATA_ROM =__etext + (__data_end__ - __data_start__); .ncache.init : AT(__NDATA_ROM) { __noncachedata_start__ = ..; *(NonCacheable.init) . = ALIGN(4); __noncachedata_init_end__ = ..; }> m_ncache_local .ncache (NOLOAD) : { *(不可缓存) . = ALIGN(4); __noncachedata_end__ = ..; }> m_ncache_local .bss (NOLOAD) : { . = ALIGN(4); __bss_start__ = ; *(.bss) *(.bss*) *(通用) . = ALIGN(4); __bss_end__ = ; }> m_dtcm .dtcm_bss (NOLOAD) : { . = ALIGN(32); __dtcm_bss_start__ = ..; *(.dtcm_bss*) *(DTCM_BSS*) . = ALIGN(32); __dtcm_bss_end__ = ; }> m_dtcm __SDRAM_C_DATA_ROM = __NDATA_ROM + (__noncachedata_init_end__ - __noncachedata_start__); .sdram_c_data :at(__sdram_c_data_rom) { . = ALIGN(32); __sdram_c_data_start__ = ..; *(.sdram_c_data*) *(sdram_c_data*) . = ALIGN(32); __sdram_c_data_end__ = ..; }> m_sdram_c __sdram_c_data_load__ = __SDRAM_C_DATA_ROM; .sdram_c_bss (NOLOAD) : { . = ALIGN(32); __sdram_c_bss_start__ = ..; *(.sdram_c_bss*) *(sdram_c_bss*) . = ALIGN(32); __sdram_c_bss_end__ = ..; }> m_sdram_c .sdram_nc_bss (NOLOAD) : { . = ALIGN(32); __sdram_nc_bss_start__ = ..; *(.sdram_nc_bss*) *(sdram_nc_bss*) . = ALIGN(32); __sdram_nc_bss_end__ = ..; }> m_sdram_nc .heap : { . = ALIGN(8); __end__ = .; PROVIDE(end = .); __HeapBase = ; .+= HEAP_SIZE; __HeapLimit = ; __heap_limit = ; }> m_dtcm .stack : { . = ALIGN(8); .+= STACK_SIZE; __StackEnd = ; }> m_dtcm __StackTop = ORIGIN(m_dtcm) + LENGTH(m_dtcm); __StackLimit = __堆栈顶 - STACK_SIZE; PROVIDE(__stack = __StackTop); .arm.Attributes 0: {* (.arm.Attributes)} __sdram_base = sdram_base; __sdram_size = sdram_size; __sdram_c_base = sdram_base; __sdram_c_size = sdram_c_size; __sdram_nc_base = sdram_nc_base; __sdram_nc_size = sdram_nc_size; } MPUconfig: /* -------------------------------------------------------------------------- */ /* CM7 MPU 配置 */ /* -------------------------------------------------------------------------- */ #if __CORTEX_M == 7 void BOARD_ConfigMPU(void) { #if 定义(__ICCARM__) || 定义(__GNUC__) 外部 uint32_t__ncache_region_start[]; 外部 uint32_t__ncache_region_size[]; uint32_tnonCacheStart =(uint32_t)__ncache_region_start; uint32_t大小 =(uint32_t)__ncache_region_size; #else uint32_tnonCacheStart =ocram_base_expected; uint32_t大小 =ocram_size_expected; #endif ()非缓存启动)nonCacheStart; (void)大小; #if 定义(__icache_present) &&__icache_present 如果(SCB_CCR_IC_Msk ==(SCB_CCR_IC_Msk & SCB->CCR)) { SCB_DisableICache(); } #endif #if 定义(__dcache_present) &&__dcache_present 如果(SCB_CCR_DC_Msk ==(SCB_CCR_DC_Msk & SCB->CCR)) { SCB_DisableDCache(); } #endif ARM_MPU_Disable(); /* 区域 0:全部拒绝(投机预取变通方法) */ MPU->RBAR = ARM_MPU_RBAR(0, 0x00000000U); MPU->RASR = ARM_MPU_RASR(1, arm_mpu_ap_none、 0, 0, 0, 0, 0, arm_mpu_region_size_4GB); /* 区域 1:设备,不可共享,不可缓存 */ MPU->RBAR = ARM_MPU_RBAR(1, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 2, 0, 0, 0, 0, arm_mpu_region_size_512mb); /* 区域 2:设备,不可共享,不可缓存 */ MPU->RBAR = ARM_MPU_RBAR(2, 0x60000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 2, 0, 0, 0, 0, arm_mpu_region_size_512mb); /* 区域 3:设备,不可共享,不可缓存 */ MPU->RBAR = ARM_MPU_RBAR(3, 0x00000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 2, 0, 0, 0, 0, arm_mpu_region_size_1GB); /* 区域 4:正常,WB */ MPU->RBAR = ARM_MPU_RBAR(4, 0x00000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 0, 0, 1, 1, 0, arm_mpu_region_size_256kb); /* 区域 5:正常,WB */ MPU->RBAR = ARM_MPU_RBAR(5, 0x20000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 0, 0, 1, 1, 0, arm_mpu_region_size_256kb); /* CM7 上的 OCRAM:正常 + 可共享 + 不可缓存(TEX=1,S=1,C=0,B=0) */ /* 区域 6:0x20240000...0x2027FFFF (256KB) */ MPU->RBAR = ARM_MPU_RBAR(6, 0x20240000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 1, 1, 0, 0, 0, arm_mpu_region_size_256kb); /* 区域 7:0x20280000...0x202FFFFF (512KB) */ MPU->RBAR = ARM_MPU_RBAR(7, 0x20280000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 1, 1, 0, 0, 0, arm_mpu_region_size_512kb); /* 区域 10:0x20300000...0x2033FFFF (256KB) */ MPU->RBAR = ARM_MPU_RBAR(10, 0x20300000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 1, 1, 0, 0, 0, arm_mpu_region_size_256kb); #ifUSE_SDRAM /* 区域 11:同步动态随机存取存储器(SDRAM) 默认不可缓存 64MB(普通非缓存)*/ MPU->RBAR = ARM_MPU_RBAR(11, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 1, 0, 0, 0, 0, arm_mpu_region_size_64mb); #if 定义(cache_mode_write_through) &&cache_mode_write_through /* 区域 12:将前 8MB 重叠为高速缓存(WT) */ MPU->RBAR = ARM_MPU_RBAR(12, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 0, 0, 1, 0, 0, arm_mpu_region_size_8mb); #else /* 第 12 区:将前 8MB 重叠为可缓存(WB)*/ MPU->RBAR = ARM_MPU_RBAR(12, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 0, 0, 1, 1, 0, arm_mpu_region_size_8mb); #endif #endif/* use_sdram */ #if 定义(xip_external_flash) &&(xip_external_flash == 1) /* 区域 8:XIP 外部闪存,RO,可缓存 WB,覆盖全 64MB */ MPU->RBAR = ARM_MPU_RBAR(8, 0x30000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_RO、 0, 0, 1, 1, 0, arm_mpu_region_size_64mb); #endif /* 外围窗口 */ MPU->RBAR = ARM_MPU_RBAR(13, 0x40000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 2, 0, 0, 0, 0, arm_mpu_region_size_16mb); MPU->RBAR = ARM_MPU_RBAR(14, 0x41000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 2, 0, 0, 0, 0, arm_mpu_region_size_2mb); MPU->RBAR = ARM_MPU_RBAR(15, 0x41400000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 2, 0, 0, 0, 0, arm_mpu_region_size_1mb); ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk |ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk); #if 定义(__dcache_present) &&__dcache_present SCB_EnableDCache(); #endif #if 定义(__icache_present) &&__icache_present SCB_EnableICache(); #endif } #endif/* __cortex_m == 7 */ /* -------------------------------------------------------------------------- */ /* CM4 MPU 配置 */ /* -------------------------------------------------------------------------- */ #if __CORTEX_M == 4 void BOARD_ConfigMPU(void) { /*----禁用代码总线缓存 (LMEM)----*/ 如果(lmem_pcccr_encache_mask ==(lmem_pcccr_encache_mask & LMEM->PCCCR)) { LMEM->PCCCR |= LMEM_PCCCR_PUSHW0_Mask | lmem_pcccr_pushw1_mask | lmem_pcccr_go_mask; 虽然((LMEM->PCCCR & LMEM_PCCCR_GO_Mask) != 0U) {} LMEM->PCCCR &= ~(lmem_pcccr_pushw0_mask | lmem_pcccr_pushw1_mask); LMEM->PCCCR &= ~lmem_pcccr_encache_mask; } /*----禁用系统总线缓存 (LMEM)----*/ 如果(lmem_psccr_encache_mask ==(lmem_psccr_encache_mask & LMEM->PSCCR)) { LMEM->PSCCR |= LMEM_PSCCR_PUSHW0_Mask | lmem_psccr_pushw1_mask | lmem_psccr_go_mask; 虽然((LMEM->PSCCR & LMEM_PSCCR_GOo_Mask) != 0U) {} LMEM->PSCCR &= ~(lmem_psccr_pushw0_mask | lmem_psccr_pushw1_mask); LMEM->PSCCR &= ~LMEM_PSCCR_encache_mask; } ARM_MPU_Disable(); /* 区域 0:0x20240000.. 0x2025FFF (128KB) DMA-> 设备/非缓存。 * 这里保留原始属性:UART/SPI/SD DMA 缓冲区位于此处 * 窗口,并要求使用 CM4 LMEM 经过验证的非缓存行为。*/ MPU->RBAR = ARM_MPU_RBAR(0, ocram_dma_nc_base); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 1,/* 建议共享 */ 0,/* 不可缓存 */ 0, 0, arm_mpu_region_size_128kb); /* 区域 1: 0x20260000..0x2027FFFF (128KB) 本地抓取 -> Normal WB cacheable */ MPU->RBAR = ARM_MPU_RBAR(1, ocram_local_c_base); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0,/* 正常 */ 0,/* 不可共享 */ 1,/* 可缓存 */ 1,/* 可缓冲 (WB) */ 0, arm_mpu_region_size_128kb); /* 区域 2:0x20280000...0x202FFFFF (512KB) 共享 -> 原始非缓存 attrs */ MPU->RBAR = ARM_MPU_RBAR(2, 0x20280000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 1,/* 可共享 */ 0,/* 不可缓存 */ 0, 0, arm_mpu_region_size_512kb); /* Region 3: 0x20300000..0x2033FFFF (256KB) shared -> original non-cache attrs */ MPU->RBAR = ARM_MPU_RBAR(3, 0x20300000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 1,/* 可共享 */ 0,/* 不可缓存 */ 0, 0, arm_mpu_region_size_256kb); #if USE_SDRAM /* 链接器分割: * m_sdram_c = 0x80000000..0x807FFFFF (8MB) * m_sdram_nc = 0x80800000..0x83FFFFFF (56MB) * * MPU 无法直接描述 56MB,因此第 4 区域可提供完整的 64MB * 同步动态随机存取存储器(SDRAM) 窗口设备/非缓存和区域 5 将前 8MB 覆盖为 * 可缓存。编号较高的 MPU 区域优先。*/ (void)SDRAM_NC_BASE; (void)SDRAM_NC_SIZE; /* 区域 4:全部 同步动态随机存取存储器(SDRAM) 默认,0x80000000... 0x83FFFFFF-> 设备/非缓存 */ MPU->RBAR = ARM_MPU_RBAR(4, sdram_base_expected); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2,/* 设备 */ 0,/* 不可共享 */ 0,/* 不可缓存 */ 0, 0, arm_mpu_region_size_64mb); #if 定义(cache_mode_write_through) &&cache_mode_write_through /* 区域 5:链接器 m_sdram_c,0x80000000...0x807FFFFF -> 正常写透 */ MPU->RBAR = ARM_MPU_RBAR(5, sdram_c_base); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 0,/* 正常 */ 0,/* 不可共享 */ 1,/* 可缓存 */ 0,/* 写入 */ 0, arm_mpu_region_size_8mb); #else /* 区域 5:链接器 m_sdram_c,0x80000000...0x807FFFFF -> 正常回写 */ MPU->RBAR = ARM_MPU_RBAR(5, SDRAM_C_BASE); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0,/* 正常 */ 0,/* 不可共享 */ 1,/* 可缓存 */ 1,/* 回写 */ 0, arm_mpu_region_size_8mb); #endif #endif/* use_sdram */ ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk); /* 失效并启用系统总线缓存 (PSCCR) */ LMEM->PSCCR |= LMEM_PSCCR_INVW0_Mask | lmem_psccr_invw1_mask | lmem_psccr_go_mask; 虽然((LMEM->PSCCR & LMEM_PSCCR_GOo_Mask) != 0U) {} LMEM->PSCCR &= ~(lmem_psccr_invw0_mask | lmem_psccr_invw1_mask); LMEM->PSCCR |= LMEM_PSCCR_encache_mask; /* 使代码总线缓存失效并启用该缓存 (PCCCR) */ LMEM->PCCCR |= LMEM_PCCCR_INVW0_Mask | lmem_pcccr_invw1_mask | lmem_pcccr_go_mask; 虽然((LMEM->PCCCR & LMEM_PCCCR_GO_Mask) != 0U) {} LMEM->PCCCR &= ~(lmem_pcccr_invw0_mask | lmem_pcccr_invw1_mask); LMEM->PCCCR |= lmem_pcccr_encache_mask; } #endif /* __CORTEX_M == 4 */ 我也尝试过这个,但是在使用 dma 从不可缓存的 ocram 写入不可缓存的 同步动态随机存取存储器(SDRAM) 时出现校验和不匹配 的情况: #if__CORTEX_M == 7 void BOARD_ConfigMPU(void) { #if 定义(__ICCARM__) || 定义(__GNUC__) 外部 uint32_t__ncache_region_start[]; 外部 uint32_t__ncache_region_size[]; uint32_tnonCacheStart =(uint32_t)__ncache_region_start; uint32_t大小 =(uint32_t)__ncache_region_size; #else uint32_tnonCacheStart =ocram_base_expected; uint32_t大小 =ocram_size_expected; #endif ()非缓存启动)nonCacheStart; (void)大小; #if 定义(__icache_present) &&__icache_present 如果(SCB_CCR_IC_Msk ==(SCB_CCR_IC_Msk & SCB->CCR)) { SCB_DisableICache(); } #endif #if 定义(__dcache_present) &&__dcache_present 如果(SCB_CCR_DC_Msk ==(SCB_CCR_DC_Msk & SCB->CCR)) { SCB_DisableDCache(); } #endif ARM_MPU_Disable(); /* 区域 0:全部拒绝(投机预取变通方法) */ MPU->RBAR = ARM_MPU_RBAR(0, 0x00000000U); MPU->RASR = ARM_MPU_RASR(1, arm_mpu_ap_none、 0, 0, 0, 0, 0, arm_mpu_region_size_4GB); /* 区域 1:设备,不可共享,不可缓存 */ MPU->RBAR = ARM_MPU_RBAR(1, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 2, 0, 0, 0, 0, arm_mpu_region_size_512mb); /* 区域 2:设备,不可共享,不可缓存 */ MPU->RBAR = ARM_MPU_RBAR(2, 0x60000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 2, 0, 0, 0, 0, arm_mpu_region_size_512mb); /* 区域 3:设备,不可共享,不可缓存 */ MPU->RBAR = ARM_MPU_RBAR(3, 0x00000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 2, 0, 0, 0, 0, arm_mpu_region_size_1GB); /* 区域 4:正常,WB */ MPU->RBAR = ARM_MPU_RBAR(4, 0x00000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 0, 0, 1, 1, 0, arm_mpu_region_size_256kb); /* 区域 5:正常,WB */ MPU->RBAR = ARM_MPU_RBAR(5, 0x20000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 0, 0, 1, 1, 0, arm_mpu_region_size_256kb); /* CM7 上的 OCRAM:正常 + 可共享 + 不可缓存(TEX=1,S=1,C=0,B=0) */ /* 区域 6:0x20240000...0x2027FFFF (256KB) */ MPU->RBAR = ARM_MPU_RBAR(6, 0x20240000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 1, 1, 0, 0, 0, arm_mpu_region_size_256kb); /* 区域 7:0x20280000...0x202FFFFF (512KB) */ MPU->RBAR = ARM_MPU_RBAR(7, 0x20280000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 1, 1, 0, 0, 0, arm_mpu_region_size_512kb); /* 区域 10:0x20300000...0x2033FFFF (256KB) */ MPU->RBAR = ARM_MPU_RBAR(10, 0x20300000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 1, 1, 0, 0, 0, arm_mpu_region_size_256kb); #ifUSE_SDRAM /* 区域 11:同步动态随机存取存储器(SDRAM) 默认不可缓存 64MB(普通非缓存)*/ MPU->RBAR = ARM_MPU_RBAR(11, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 1, 0, 0, 0, 0, arm_mpu_region_size_64mb); #if 定义(cache_mode_write_through) &&cache_mode_write_through /* 区域 12:将前 8MB 重叠为高速缓存(WT) */ MPU->RBAR = ARM_MPU_RBAR(12, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 0, 0, 1, 0, 0, arm_mpu_region_size_8mb); #else /* 第 12 区:将前 8MB 重叠为可缓存(WB)*/ MPU->RBAR = ARM_MPU_RBAR(12, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 0, 0, 1, 1, 0, arm_mpu_region_size_8mb); #endif #endif/* use_sdram */ #if 定义(xip_external_flash) &&(xip_external_flash == 1) /* 区域 8:XIP 外部闪存,RO,可缓存 WB,覆盖全 64MB */ MPU->RBAR = ARM_MPU_RBAR(8, 0x30000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_RO、 0, 0, 1, 1, 0, arm_mpu_region_size_64mb); #endif /* 外围窗口 */ MPU->RBAR = ARM_MPU_RBAR(13, 0x40000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 2, 0, 0, 0, 0, arm_mpu_region_size_16mb); MPU->RBAR = ARM_MPU_RBAR(14, 0x41000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 2, 0, 0, 0, 0, arm_mpu_region_size_2mb); MPU->RBAR = ARM_MPU_RBAR(15, 0x41400000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 2, 0, 0, 0, 0, arm_mpu_region_size_1mb); ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk |ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk); #if 定义(__dcache_present) &&__dcache_present SCB_EnableDCache(); #endif #if 定义(__icache_present) &&__icache_present SCB_EnableICache(); #endif } #endif/* __cortex_m == 7 */ /* -------------------------------------------------------------------------- */ /* CM4 MPU 配置 */ /* -------------------------------------------------------------------------- */ #if__CORTEX_M == 4 void BOARD_ConfigMPU(void) { /*----禁用代码总线缓存 (LMEM)----*/ 如果(lmem_pcccr_encache_mask ==(lmem_pcccr_encache_mask & LMEM->PCCCR)) { LMEM->PCCCR |=LMEM_PCCCR_PUSHW0_Mask |lmem_pcccr_pushw1_mask |lmem_pcccr_go_mask; 虽然((LMEM->PCCCR &LMEM_PCCCR_GO_Mask) != 0U) {} LMEM->PCCCR &= ~(LMEM_PCCCR_PUSHW0_Mask |PCCCR = ~ (lmem_pcccr_pushw0_mask | lmem_pcccr_pushw1_mask); LMEM->PCCCR &= ~lmem_pcccr_encache_mask; } /*----禁用系统总线缓存 (LMEM)----*/ 如果(lmem_psccr_encache_mask ==(lmem_psccr_encache_mask & LMEM->PSCCR)) { LMEM->PSCCR |=LMEM_PSCCR_PUSHW0_Mask |lmem_psccr_pushw1_mask |lmem_psccr_go_mask; 虽然((LMEM->PSCCR &LMEM_PSCCR_GOo_Mask) != 0U) {} LMEM->PSCCR &= ~(LMEM_PSCCR_PUSHW0_Mask |lmem_psccr_pushw1_mask); LMEM->PSCCR &= ~LMEM_PSCCR_encache_mask; } ARM_MPU_Disable(); /* 区域 0: 0x20240000..0x2025FFFF (128KB) DMA -> 正常不可缓存 */ MPU->RBAR = ARM_MPU_RBAR(0, ocram_dma_nc_base); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 0,/* 正常 */ 1,/* 建议共享 */ 0,/* 不可缓存 */ 0, 0, arm_mpu_region_size_128kb); /* 区域 1: 0x20260000..0x2027FFFF (128KB) 本地抓取 -> Normal WB cacheable */ MPU->RBAR = ARM_MPU_RBAR(1, ocram_local_c_base); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 0,/* 正常 */ 0,/* 不可共享 */ 1,/* 可缓存 */ 1,/* 可缓冲 (WB) */ 0, arm_mpu_region_size_128kb); /* 区域 2:0x20280000...0x202FFFFF (512KB) 共享 -> 正常(可共享) */ MPU->RBAR = ARM_MPU_RBAR(2, 0x20280000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 0,/* 正常 */ 1,/* 可共享 */ 0,/* 不可缓存 */ 0, 0, arm_mpu_region_size_512kb); /* 区域 3: 0x20300000..0x2033FFFF (256KB) 共享 -> 正常(可共享) */ MPU->RBAR = ARM_MPU_RBAR(3, 0x20300000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 0,/* 正常*/ 1,/* 可共享 */ 0,/* 不可缓存 */ 0, 0, arm_mpu_region_size_256kb); ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk |ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk); /* 失效并启用系统总线缓存 (PSCCR) */ LMEM->PSCCR |=LMEM_PSCCR_INVW0_Mask |lmem_psccr_invw1_mask |lmem_psccr_go_mask; 虽然((LMEM->PSCCR &LMEM_PSCCR_GOo_Mask) != 0U) {} LMEM->PSCCR &= ~(LMEM_PSCCR_INVW0_Mask |lmem_psccr_invw1_mask); LMEM->PSCCR |=lmem_psccr_encache_mask; /* 使代码总线缓存失效并启用该缓存 (PCCCR) */ LMEM->PCCCR |=LMEM_PCCCR_INVW0_Mask |lmem_pcccr_invw1_mask |lmem_pcccr_go_mask; 虽然((LMEM->PCCCR &LMEM_PCCCR_GO_Mask) != 0U) {} LMEM->PCCCR &= ~(LMEM_PCCCR_INVW0_Mask |PCCCR = ~ (lmem_pcccr_invw0_mask | lmem_pcccr_invw1_mask); LMEM->PCCCR |=lmem_pcccr_encache_mask; } #endif/* __cortex_m == 4 */ 评估板 Re: RT1170 EVKB M4 memory speed 你好@cyberhelmer、 感谢您对 NXP MIMXRT 系列的关注! 恩智浦提供了基于 RT1050 的测试结果。你可以查看这份应用笔记和相应的软件:https://www.nxp.com/docs/en/application-note/AN12437.pdf https://www.nxp.com/products/i.MX-RT1050 我进行了快速比较,发现在 同步动态随机存取存储器(SDRAM) 写入测试期间,ANSW 使用了以下设置:正常内存属性、纯 32 位顺序写入和写入后的 DSB。 我们建议您参考本 ANSW 进行相应的实验。 致以最诚挚的问候, Gavin
記事全体を表示
Visual Studio Code における PN7160 を使用した MCXW23 用 NXP-NCI 2.0 SPI サンプルの移行ガイド こんにちは、NXPさん。 まず最初に、pn7160を使用したfrdm-mcxw71の移行ガイドを提供してくれたRoman @RomanVRに感謝します。 NXPコミュニティ移行ガイド MCXW23プラットフォーム上でVisual Studio CodeとNXP-NCIドライバを使用するための具体的なガイドもあれば大変助かります。残念ながら、MCXW23は現在MCUXpresso IDEでサポートされていないため、多くの開発者は代わりにVisual Studio Codeを使用しています。 Visual Studio Code における PN7160 SPI 統合、ドライバ構成、SDK セットアップ、およびビルド/デバッグワークフローに関する専用のセットアップおよび移行ガイドは、nxp-nci 2.0 ドライバを使用して Visual Studio Code で作業する開発者にとって非常に役立ちます。 よろしくお願いいたします。 シャキール・サラム 開発ボード FRDMトレーニング Re: Migration Guide of NXP-NCI 2.0 SPI examples with PN7160 for MCXW23 in Visual Studio Code こんにちは、 @S_Salam555 さん。お元気でお過ごしでしょうか。 フィードバックありがとうございます。しかしながら、現在、MCUXpresso for VS Codeへの移行に関するガイドは提供しておりません。 ただし、MCUXpresso IDE で作成されたガイドは、移行を行うための全体的な基本手順を提供するはずですが、変更される手順は、プロジェクトへのファイルの追加と操作を伴う手順のみです。VS Code では、次のガイドに記載されているように、CMake ファイルを介してこれを行う必要があります:プロジェクトへのファイルの追加/プロジェクトからのファイルの削除。 お役に立てば幸いです! Re: Migration Guide of NXP-NCI 2.0 SPI examples with PN7160 for MCXW23 in Visual Studio Code こんにちは、ローマンさん。 ご意見と情報提供ありがとうございます。 「コンポーネントの管理」セクションに関して、どのオプションを選択すればよいか教えていただけますか?参考までに、現在の私のプロジェクト構造を以下に示します。急がなくていいですよ :)) よろしくお願いします、 シャキール・サラム Re: Migration Guide of NXP-NCI 2.0 SPI examples with PN7160 for MCXW23 in Visual Studio Code こんにちは、 @S_Salam555 さん。 お客様が選択されたオプションは、その港に適しています。 Re: Migration Guide of NXP-NCI 2.0 SPI examples with PN7160 for MCXW23 in Visual Studio Code こんにちは、@S_Salam555 さん。 これはカスタム実装であるため、サポートは実装内の特定の動作や問題を分析する範囲が非常に限られます。したがって、開発はすべてお客様自身で行う必要があります。 観察されている行動について、より具体的なアプローチを示していただけると、より良いサポートを提供できるため大変助かります。 Re: Migration Guide of NXP-NCI 2.0 SPI examples with PN7160 for MCXW23 in Visual Studio Code こんにちは、ローマンさん。 お元気でお過ごしでしょうか。ご提案ありがとうございます。 これまでのCMakeの設定はどうなっていますか? 以下は、MCXW23の製作における私のプロジェクト構造の全体像を示した図です。 よろしくお願いします、 シャキール・サラム 1. ボード.h 2. hardware_init.c 3. pinmux.c 4. tml.c   5. main.c 6. CMakeLists.txt 7. ビルドエラー出力 Re: Migration Guide of NXP-NCI 2.0 SPI examples with PN7160 for MCXW23 in Visual Studio Code こんにちは、 @S_Salam555 さん、最新情報ありがとうございます。 MCXW71とMCXW23ではSPIドライバ名が変わることに注意してください。MCXW71のSPIドライバAPIは「 LPSPI... 」と呼ばれますが、MCXW23ではAPIとインスタンスは単に「 SPI... 」と呼ばれます。 お役に立てば幸いです! Re: Migration Guide of NXP-NCI 2.0 SPI examples with PN7160 for MCXW23 in Visual Studio Code こんにちは、ローマンさん。 進捗状況を簡単にご報告したかっただけです。プロジェクトのビルドは正常に完了しました。あとは正しいSPI設定を構成するだけです。 参考までに、最新のCMakeLists.txtとエラーコンソールログを添付しました。 よろしくお願いします、 シャキール・サラム   Re: Migration Guide of NXP-NCI 2.0 SPI examples with PN7160 for MCXW23 in Visual Studio Code こんにちは、 @S_Salam555 さん。お元気でお過ごしでしょうか。 あなたが共有してくれたプロジェクトの画像から判断すると、あなたはMCXW23とは異なるMCXW71固有の設定でSPIを構成しようとしているようです。 両方のドライバはそれぞれ異なる設定要件を必要とするため、MCXW23 SDKに含まれるポーリングSPIのサンプルを参照することをお勧めします。初期化処理やファイルをあるプロジェクトから別のプロジェクトにそのままコピー&ペーストするのではなく、SPIペリフェラルを初期化し、データの送受信を行うために、TMLレイヤーでプロジェクトがどのように構築されているかに合わせて設定を調整することをお勧めします。 お役に立てば幸いです! Re: Migration Guide of NXP-NCI 2.0 SPI examples with PN7160 for MCXW23 in Visual Studio Code こんにちは、ローマンさん。 現在残っている唯一の問題は、MCXW23に書き込むための設定フラグに関するものです。それらの情報を確認していただけますか? ありがとうございます。 よろしくお願いします、 シャキール・サラム   Re: Migration Guide of NXP-NCI 2.0 SPI examples with PN7160 for MCXW23 in Visual Studio Code こんにちは、ローマンさん。 他のプロジェクトで少しの間席を外していて申し訳ありませんでした。最新のスクリーンショットはこちらです。#include の コンパイルに苦労しています よろしくお願いいたします。 シャキール・サラム Re: Migration Guide of NXP-NCI 2.0 SPI examples with PN7160 for MCXW23 in Visual Studio Code こんにちは、ローマンさん。 お元気でお過ごしでしょうか。 MCXW23プロジェクトの最新情報について簡単にご報告いたします。SPIとboard.hの設定方法と使用方法についてご教示いただけますでしょうか。MCXW23についてですか? よろしくお願いします、 シャキール・サラム    
記事全体を表示
使用 imx95 的 mx95mbcam 将帧频从 30 改为 60 时遇到的问题 我使用的是带有 mx95mbcam 摄像头模块和 gmsl maixm 服务器的 imx95。 默认工作驱动程序以 1920*1280@30 帧/秒运行,我想以 1920*1280@60 帧/秒运行。我对 0x03c10 传感器寄存器进行了更改,但最高只能达到 47fps。之后,我就无法获得视频画面了。 Maxim SerDes 是否有任何限制或其他问题? Re: Problem in changing fps from 30 to 60 fps for mx95mbcam with imx95 这可能是带宽问题。您将多少台摄像机连接到 Maxim DES?默认情况下,运行速度应为 1.5Gbps * 4 个机群。 Re: Problem in changing fps from 30 to 60 fps for mx95mbcam with imx95 连接了 4 台摄像机,但只运行 1 台摄像机。 1920*1280 分辨率。传感器输出的 16 位 PWL 原始数据。
記事全体を表示
LLCE CAN I created the sample project Can_Llce_DS_Loopback_S32G274A_M7, which is already able to communicate with the external CAN box, using LLCE CAN0. I then modified the configuration of this project to keep only the five channels of LLCE CAN that I wanted, and the configuration details are as follows: During the configuration process I only deleted the corresponding error, after the configuration is completed there is only a clock warning in the configuration screen, but this warning itself is in the version that can communicate so it is not a problem. I have uploaded my modified project, please help me to see what the problem is that I can't communicate. Re: LLCE CAN Hello @JACK_Q, Sorry for the late reply. I will write in English but you can reply in Chinese, the community will translate the message automatically for me. When you mention that the new version does not communicate, do you see any CAN signal coming out of the board? Does the program run normally or does it get stuck at some part in the execution? Thanks for the information. Re: LLCE CAN After I changed the configuration, I tried debug, single step run to send the interface can_retval = Can_43_LLCE_Write( CanHO_Config1_TX0, &CanMessage[u8CtrlIdx]); the return value of the interface is E_OK also 0 According to the description of the interface is that the write command has been completed, and the program is still polling for CAN transmission, but my CAN box on the receiving end shows no data, and I can't detect it using the baud rate detection that comes with the software of the CAN box (this baud rate detection I also tried in the original routine can be detected).                      
記事全体を表示
h264 or similar formats on mimxrt595s Hello, I am currently working on a GUI for a wearable using lvgl, zephyr and GUI-Guider. We would like to have some more complex animations in our project, which are hard to recreate from scratch with the existing widgets and for that purpose we would like to implement small videos we can just drop into the UI when needed. I already was able to create a POC by converting a video to a series of pictures, but that takes a lot of flash space, as the compression is very limited that way. The idea was to use a better format like h264 or similar. But the support for that seems to be limited to the i.MX RT1050 out of the box. Is there some way to also get this running on the mimxrt595s, or does it not make sense? My research led me to believe, that it is not possible without linking ffmpeg libraries to our lvgl implementation, which surely would take some porting effort and take too much flash and RAM from our chip to make any sense. Am I right in this last assumption or is there a way to save resources in our situation? Best regards, Kai
記事全体を表示