Multi Source Translation Content

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

Multi Source Translation Content

ディスカッション

ソート順:
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
記事全体を表示
LS1012A 无法自动启动 你好,我使用的 ls1012a 板很好。 启动不像前一阵子的照片那样。 我想知道问题出在哪里。
記事全体を表示
#S32K144 キャッシュ書き込みテスト ##S32K144はキャッシュ値の変更をサポートしますか?なぜ値を変更した後でも、同じアドレスを読み取っても元の値が返されるのでしょうか?さらに、キャッシュのパリティビットをテストすることは可能でしょうか?ありがとうございます。 Re: #S32K144 Cache write Test こんにちは、@joshua9264 さん。 技術的には、LMENレジスタを介してキャッシュ値を変更することは可能です。 簡単なテストプロジェクトを作成してみましょう。 BR、ダニエル Re: #S32K144 Cache write Test こんにちは、@joshua9264 さん。 この例を見てください。 https://community.nxp.com/t5/S32K-Knowledge-Base/Example-S32K142-LMEM-Cache-v1-0-S32DS3-6-RTD300/ta-p/2368498 よろしくお願いいたします。 ダニエル
記事全体を表示
S32K144 与 UJA1169 SBC 的 SPI 通信 您好,NXP团队: 我正在使用恩智浦 S32K144 主板并尝试通过 SPI 通信与 UJA1169 SBC 通信。我的目标是从 SBC 读取制造商 ID 寄存器。 为此,我编写了SPI通信代码,并在下面附上以供参考。根据原理图,我选择了具有以下引脚配置的 LPSPI1 实例: PTB14 → SCK PTB15 → SIN PTB16 → SOUT PTB17 → PCS3 我还附上了 MEX 文件中配置的 SPI 驱动程序设置截图。 但是,我无法从 UJA1169 SBC 收到任何有效数据。产生了 SPI 时钟,但 SBC 端没有正确接收数据。 谁能帮我找出 SPI 配置或通信顺序中可能出错的地方? 以下是我的代码供参考: /* * Copyright 2020 NXP * * NXP Confidential.本软件由恩智浦拥有或控制,只能严格按照适用的许可条款使用 *。 。 */ #ifdef __cplusplus extern"C" { #endif /*================================================================================================== * INCLUDE FILES ==================================================================================================*/ #include"Mcu.h" #include"Port.h" #include"Spi.h" #include"Platform.h" #include"spi_cfg.h" /*================================================================================================== * 本地变量 ==================================================================================================*/ #define UJA1169_ID_REGISTER (0x7EU) #define UJA1169_READ_COMMAND(reg) ((uint8)(((reg)<< 1U))| 0x01U)) /* S32K144EVB 原理图使用 UJA1169TK/F,其标识值为 0xEF。*/ #define UJA1169_EXPECTED_ID (0xEFU) /* SPI 传输完成标志 */ volatile boolean SpiTransferDone = FALSE; /* 保持结果的全局性,以便于在调试器中检查。*/ volatile uint8 Uja1169DeviceId = 0U; /*================================================================================================== * 全局函数 ==================================================================================================*/ /* SPI 传输完成回调 */ void SpiJobEndNotification(void) { SpiTransferDone = TRUE; } static Std_ReturnType Uja1169_ReadRegister(uint8 RegisterAddress, uint8 * RegisterValue) { Std_ReturnType Status; uint8 TxBuffer[4] = {0U, 0U, 0U, 0U}; uint8 RxBuffer[4] = {0U, 0U, 0U, 0U}; 如果 (NULL_PTR == RegisterValue) { return E_NOT_OK; } /* * UJA1169A SPI 命令字节:地址 [7:1] + 读取位 [0]。 * 寄存器 0x7E READ命令为 0xFD。之所以使用四个字节,是因为 * 当前 spicHannel_SBC 配置是 32 位;SBC 支持 32 位 SPI。 */ txBuffer [0] = UJA1169_READ_COMMAND(注册地址); SpiTransferDone = FALSE; Status = Spi_SetupEB(SpiConf_SpiChannel_SpiChannel_SBC, TxBuffer, RxBuffer, 4U); if (E_OK != Status) { return Status; } Status = Spi_AsyncTransmit(SpiConf_SpiSequence_SpiSequence_1); if (E_OK != Status) { return Status; } while(FALSE == SpiTransferDone) { } /* 选定的寄存器值在第一个数据字节期间返回。*/ *RegisterValue = RxBuffer[1]; return E_OK; } /** * @brief Main function */ int main(void) { Std_ReturnType Status; uint8 DeviceId = 0U; /* 初始化 MCU */ #if (MCU_PRECOMPILE_SUPPORT == STD_ON) Mcu_Init(NULL_PTR); #elif (MCU_PRECOMPILE_SUPPORT == STD_OFF) Mcu_Init(&Mcu_Config_VS_0); #endif /* 初始化时钟 */ Mcu_InitClock(McuClockSettingConfig_0); #if (MCU_NO_PLL == STD_OFF) while (MCU_PLL_LOCKED != Mcu_GetPllStatus()) { /* 等待 PLL 锁定 */ } Mcu_DistributePllClock(); #endif Mcu_SetMode(McuModeSettingConf_0); /* 初始化端口 */ Port_Init(NULL_PTR); /* 初始化平台 */ Platform_Init(NULL_PTR); /* 初始化 SPI */ Spi_Init(NULL_PTR); /* 设置 SPI 中断模式 */ Status = Spi_SetAsyncMode(SPI_INTERRUPT_MODE); if (E_OK != Status) { while(1) { } } Status = Uja1169_ReadRegister(UJA1169_ID_REGISTER,&DeviceId); Uja1169DeviceId = DeviceId; if ((E_OK != Status) || (UJA1169_EXPECTED_ID != Uja1169DeviceId)) { while(1) { } } while(1) { } return (0U); } #ifdef __cplusplus } #endif 如果您能帮助我找出问题所在,我将不胜感激。如果需要我这边提供任何其他信息、屏幕截图或逻辑分析器捕获,请告诉我。 期待您尽快回复。 谢谢。 S32K144 Schematic Diagram PinsS32K144 Schematic Diagram PinsS32K144 Schematic Diagram PinsS32K144 Schematic Diagram PinsS32K144 Schematic Diagram PinsS32K144 Schematic Diagram Pins S32K144原理图 引脚 SPI Clock SettingSPI Clock SettingSPI Clock SettingSPI Clock SettingSPI Clock SettingSPI Clock SettingSPI 时钟设置 Pin mappingPin mappingPin mappingPin mappingPin mappingPin mapping引脚映射 Port setting Pic1Port setting Pic1Port setting Pic1Port setting Pic1Port setting Pic1Port setting Pic1端口设置 Pic1 Port setting Pic2Port setting Pic2Port setting Pic2Port setting Pic2Port setting Pic2Port setting Pic2端口设置 Pic2 Port setting Pic3Port setting Pic3Port setting Pic3Port setting Pic3Port setting Pic3Port setting Pic3端口设置 Pic3 Port setting Pic4Port setting Pic4Port setting Pic4Port setting Pic4Port setting Pic4Port setting Pic4端口设置 Pic4 SPI driver Config Pic1SPI driver Config Pic1SPI driver Config Pic1SPI driver Config Pic1SPI driver Config Pic1SPI driver Config Pic1SPI 驱动程序配置 Pic1 SPI driver Config Pic2SPI driver Config Pic2SPI driver Config Pic2SPI driver Config Pic2SPI driver Config Pic2SPI driver Config Pic2SPI驱动程序 配置 Pic2 SPI driver Config Pic3SPI driver Config Pic3SPI driver Config Pic3SPI driver Config Pic3SPI driver Config Pic3SPI driver Config Pic3SPI 驱动程序 配置 Pic3 SPI driver Config Pic4SPI driver Config Pic4SPI driver Config Pic4SPI driver Config Pic4SPI driver Config Pic4SPI driver Config Pic4SPI 驱动程序 配置 Pic4 SPI driver Config Pic5SPI driver Config Pic5SPI driver Config Pic5SPI driver Config Pic5SPI driver Config Pic5SPI driver Config Pic5SPI 驱动程序 配置 Pic5 SPI driver Config Pic6SPI driver Config Pic6SPI driver Config Pic6SPI driver Config Pic6SPI driver Config Pic6SPI driver Config Pic6SPI 驱动程序 配置 Pic6 Re: S32K144 SPI Communication with UJA1169 SBC HI 能否将测试项目单独发送给我进行测试? 这样,我就可以在 S32K144EVB-Q100 上使用逻辑分析仪检查 SPI 通信是否正确。 顺便说一下,我在 S32DS v3.5 中安装了"S32K1xx_SBC_UJA116xA_R21-11_0.8.0_CD01_DS_updatesite_D2401.zip" 和"SW32K1_S32M24X_RTD_4.4_R21-11_2.0.0_D2308_DS_Updatesite.zip" 。你也安装了这个版本吗? 安装后,将出现一些 UJA116x 示例。您是否已经参考过它的配置? 祝好, Robin ------------------------------------------------------------------------------- 注: - 如果本帖回答了您的问题,请点击"ACCEPT AS SOLUTION" 按钮。谢谢! - 我们会在最后一次发帖后的 7 周内跟踪主题,之后的回复将被忽略 如果您以后有相关问题,请另开新主题,并参考已关闭的主题。 ------------------------------------------------------------------------------- Re: S32K144 SPI Communication with UJA1169 SBC 嗨,罗宾、 感谢您的反馈, 我没有安装Uja116x示例包,也没有参考过附带的示例配置: S32K1xx_SBC_UJA116xA_R21-11_0.8.0_CD01_DS_updatesite_D2401.zip SW32K1_S32M24x_RTD_4.4_R21-11_2.0.0_D2308_DS_Updatesite.zip 目前,我正在使用自己的 SPI 实现与 UJA1169 SBC 通信。 按照要求,我单独附上了我的测试项目,以供测试。 您可以在 S32K144EVB-Q100 板上使用它,并使用逻辑分析器验证 SPI 信号。 如果您需要更多信息或对项目进行修改,请告诉我。 敬上, Vamshi Re: S32K144 SPI Communication with UJA1169 SBC 下面红框中的定义需要修改: 以下是需要在S32 配置工具中修改的部分: 请注意,我只是简单检查和修改了您的项目。我强烈建议您安装S32K1xx_SBC_UJA116xA_R21-11_0.8.0_CD01_DS_updatesite_D2401.zip,并参考其中的示例Sbc_uja116xa_example_S32K148。 Re: S32K144 SPI Communication with UJA1169 SBC 嗨,罗宾、 感谢您的反馈, 我找不到示例项目 “sbc_uja116xa_example_s32k148” 和相关的软件包 “s32k1xx_sbc_uja116xa_r21-11_0.8.0_cd01_ds_updatesite_d2401.zip”。 你能分享参考项目和相关文件吗? 谢谢! 致以最崇高的敬意 瓦姆希 Re: S32K144 SPI Communication with UJA1169 SBC 我刚刚安装了S32K1 RTD 2.0.0 P04,现在可以正确打开您的S32 配置工具了。 对不起,我看到您定义了Uja1169_Transfer、Uja1169_ReadDeviceId 等。 但是,我发现了不止一个S32CT和代码错误,而且我还没有时间把它们全部修复。 我仍然建议您安装S32K1xx_SBC_UJA116xA_R21-11_0.8.0_CD01_DS_updatesite_D2401.zip,然后使用官方 API,如Sbc_43_uja116xa_ReadRegister(sbc_uja116xa_identif,ReceivedData);
記事全体を表示
Integration of UDS Bootloader and J1939 Stack on CAN   Description: Hi Team, I am working on S32K344 using S32DS 3.6.5 with RTD 3.0.0 Current implementation: FlexCAN CAN communication UDS bootloader over ISO-TP J1939 application communication GCC compiler AUTOSAR RTD drivers I need guidance regarding coexistence of: UDS diagnostics (ISO14229) ISO-TP transport layer J1939 communication stack ensure CAN termination resistor configuration shall be select through software in S32k344 and How to do ? explain how CAN termination will designed in transceiver and MCU  Questions: What is the recommended architecture for running UDS and J1939 simultaneously on same CAN controller? Is it recommended to use separate CAN message buffers for UDS and J1939? How should CAN ID filtering be configured? Are there any NXP reference examples for: UDS bootloader J1939 stack Shared FlexCAN usage Any known limitations in RTD 3.0 for this use case? Controller: S32K344 RTD 3.0 S32DS 3.5 Thanks. 
記事全体を表示
Jellytide 是合法尝试吗?2026 年回顾 Jellytide 正在成为 2026 年最受关注的备灾系统之一 ,因为它专注于现实的停电生存策略,而不是好莱坞式的恐惧策略。该计划由退伍军人丹尼尔斯创建,结合了实用指南、分步视频和受军事启发的规划,以帮助家庭为长期停电、网络威胁和紧急情况做好准备。Jellytide 准备就绪 它的与众不同之处在于其方便初学者使用的方法。 该系统不是推销昂贵的掩体或复杂的救生装备,而是专注于经济实惠的实际行动,例如储水、备用电源、粮食安全、EMP 保护和家居准备。许多用户赞赏该指南将所有内容分解成简单的周末项目,普通家庭也能真正实施。 2026 年, 随着人们对电网不稳定、恶劣天气和供应链中断的担忧与日俱增,备灾已从一个小众爱好转变为主流话题。Jellytide直接利用了这一趋势,为那些想要安心而又不想成为极端 “末日准备者” 的家庭提供结构化的生存路线图。 值得购买吗? 对于正在寻找实用备灾蓝图的人们来说,答案似乎是肯定的。其价值来自于系统的组织性、简洁性和对现实世界的关注。不过,指南只有在用户实际应用这些策略时才能发挥作用。它最适合那些愿意采取循序渐进的行动来提高家庭复原力和应急准备的人。 查看更多https://tinyurl.com/2epyz5wu
記事全体を表示
imx95でmx95mbcamのfpsを30から60fpsに変更する際の問題 私は、GMSL MAIXM SERDESを搭載したmx95mbcamカメラモジュールを備えたimx95を使用しています。 デフォルトの動作ドライバは1920*1280@30fpsで動作しますが、1920*1280@60fpsで動作させたいです。0x03c10センサーレジスタに変更を加えましたが、達成できた最大フレームレートは47fpsでした。その後、映像を受信できなくなりました。 Maxim SerDesには何か制限事項や問題点がありますか? Re: Problem in changing fps from 30 to 60 fps for mx95mbcam with imx95 カメラを4台接続したが、稼働しているのは1台のみ。 解像度1920×1280。センサーからの生の16ビットPWL出力。 Re: Problem in changing fps from 30 to 60 fps for mx95mbcam with imx95 これは帯域幅の問題かもしれません。Maxim DESには何台のカメラを接続しますか?デフォルトでは、1.5Gbps × 4レーンで動作するはずです。
記事全体を表示
Regarding power estimation tool for S32K328 MCU I'm using S32K328 as functional MCU and S32K341 as safety MCU in my application. I want to know if there is any power estimation tool available for these ICs. If yes kindly let me know where i can find it for my use case. Thanks. Re: Regarding power estimation tool for S32K328 MCU Hello @Abhinavv_007, For now, you can refer to the S32K Power Estimation Tool (PET). It includes a limited number of devices, but it may prove useful. I've also sent you a private message here in community regarding some preliminary information for S32K3X8 devices. Lastly, kindly refer to chapter 6.7 (Supply Currents) from the S32K3XX's Data Sheet document, where the STANDBY, Low speed RUN, and RUN supply currents are noted. This may prove useful as reference information. Best regards, Julián
記事全体を表示
如何在 imx6sx 中处理浮点数值 各位专家好, 我正在使用 imx6sx 将现有程序移植到自定义主板上。 此前,它使用的是 P1011 CPU。 环境是 Yocto BSP 5.15.52-2.1.0。 问题是,在将通过通信接收到的浮点数值存储到结构中时,会出现信号错误。 我问了 gemini,发现如果对齐不正确,可能会发生这种情况, 但是由于我使用的是外部库(我收到的是二进制库), 我想知道如何在不修改源代码的情况下解决这个问题。 我问过人工智能,得到了一些提示,但没有成功 衷心感谢 i.MX6SoloX i.MX7 双核
記事全体を表示
Time Drift in PCF85063TP/1Z RTC We are using the PCF85063TP/1Z RTC in our temperature logger product for maintaining time stamps during temperature data logging. During testing, we observed time drift issues across multiple boards, where each board shows a different amount of drift over time. In our current hardware design, we are using a 12.5 pF load capacitance crystal. Based on this, we updated the RTC register setting by configuring the CAP_SEL bit to ‘1’ to match the crystal load capacitance requirement. After making this configuration change, we are still observing approximately 2 seconds of drift in real-time operation. We would like to understand: Whether this level of drift is expected for the PCF85063TP/1Z. If there are any recommended register configurations or calibration methods to improve RTC accuracy. Whether PCB layout, crystal selection, or other hardware considerations could contribute to the observed variation between boards. Kindly provide your recommendations and guidance for improving RTC timing accuracy in this application. Re: Time Drift in PCF85063TP/1Z RTC Hello, Please see application note AN11247 Improved timekeeping accuracy with PCF85063, PCF8523 and PCF2123 using an external temperature sensor Hope this helps!
記事全体を表示
S32K344の消費電力評価について これは、デフォルトで2つのコアを使用した場合の消費電力の推定値ですか?また、各周辺機器を選択した後、内部で追加の電流要件が発生します。これはどういう意味ですか?また、自分で評価する必要がありますか?現在選択されている周辺機器は使用する必要があるものですが、内部での追加電流要件は設定されていません。この消費電力の推定値162.13mA/535.03mWは信頼できるものですか? 回复: 关于S32K344功耗评估问题 こんにちは、ノースストリートのオールドドライバーポテンシャルキング データシートには、テスト対象の周辺機器の状態を一覧にした表も掲載されています。 回复: 关于S32K344功耗评估问题 ご回答ありがとうございます。2点目についてですが、この表には、クロック速度160MHz、デュアルコアとシングルコア、一部の周辺機器がオフになっていない状態での消費電力が記載されています。これは、一部の周辺機器がオフになっていないことを意味します。どの周辺機器がオフになっていないか教えていただけますか?それとも、すべての周辺機器がオンになっている状態での消費電流でしょうか?私の質問は、S32K344がRUNモードで、EMAC、LPI2C、QuadSPI、TempSense、eDMA、eMIOSが有効になっている場合、この消費電流の基準値はどの程度意味があるのでしょうか?PETの消費電力に基づくと、少し低いように思えますが、いかがでしょうか? Re: 关于S32K344功耗评估问题 こんにちは、ノースストリートのオールドドライバーポテンシャルキング この消費電力評価ツールはメンテナンスされておらず、一部の消費電力データは最新のデータシートと異なる場合があります。 最新のデータシートを参照することをお勧めします。 Revを使用しました。2025年11月13日~12日、最新バージョンはRev.14です。 1. この表では、クロック速度160MHz、デュアルコア、シングルコア、周辺機器オフ時の消費電力を確認できます。 2. この表では、クロック速度160MHz、デュアルコア、シングルコアの場合の消費電力、および一部の周辺機器がオフになっていない場合の消費電力を確認できます。
記事全体を表示
Sch of RDA8420TEIS0 Hi there, I am Hong in Australia.  I am going to design a BMS with EIS, and going to use BMA7418, 6402, 8420 etc.  but in terms of generating AC excitation signal, I could not figure out.  can you tell me how this board RDA8420TEIS0 generates AC excitation signals.  can  you post the schematic ?  how those parts Q1, Q2, D2, D3, the inductor and the  cap work ?  I can't figure out, can you please help ? cheers H-Bridge Driver Re: Sch of RDA8420TEIS0 HI  You can try to download this board from below link for reference. https://www.nxp.com/design/design-center/development-boards-and-designs/EVBMA8420T
記事全体を表示