Multi Source Translation Content

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

Multi Source Translation Content

Discussions

Sort by:
S32K116 无法进入 STOP1 或 VLPS 模式,但 STOP2 模式可以正常工作。 你好, 为了节省电池电量,我的项目需要将 S32K116 置于睡眠模式。我使用的是 S32DS 3.6.1 和 SDK PlatformSDK_S32K1_S32M24,gcc 版本为 10.2。由于我不熟悉低功耗功能,所以我使用评估板 S32K116EVB-QSG 构建了一个小型测试项目。 我使用 Lptmr 作为唤醒源,它使用 LPO 1kHz 时钟。 在进入无限循环之前,蓝色 LED 会切换状态,以便区分 RESET 和唤醒。一旦进入循环,计数器就会增加,因此在进入睡眠模式之前,红色 LED 会闪烁 6 次。在睡眠模式下,Lptmr 超时后会唤醒 S32K116,Lptmr 中断处理程序会切换绿色 LED,以便我可以看到它正在被唤醒。 现在,这对于 STOP2 模式来说是可以正常工作的,但对于 STOP1 或 VLPS 模式则不行。出于沮丧,我禁用了所有能找到的时钟的监测,但这并没有什么效果。 对于 STOP1 和 VLPS,当 RESET 时,Power_Ip_GetResetRawValue() 返回 0x2000,表示停止确认错误 (SACKERR)。 我在互联网上找不到合适的应用程序/代码片段,所以我在这里分享我的问题,希望有人能帮我指出我遗漏了什么,例如,为什么当我要求控制器进入 STOP1 或 VLPS 时,控制器会 RESET。 我查阅了应用笔记 AN5425,但就我的观点而言,它并没有提供非常实用的建议。 我的代码: /*================================================================================================== * 项目:RTD AUTOSAR 4.7 * 平台:CORTEXM * 外设:S32K14X * 依赖项:无 * * Autosar版本:4.7.0 * Autosar版本:ASR_REL_4_7_REV_0000 * Autosar配置变体: 软件版本:3.0.0 * 构建版本:S32K1_RTD_3_0_0_QLP02_D2505_ASR_REL_4_7_REV_0000_20250530 * * 版权所有 2020-2025 NXP * * NXP 机密专有信息。本软件由恩智浦半导体(NXP)拥有或控制,且仅可由其授权使用。 * 严格按照适用的许可条款使用。明确地 * 接受此类条款或通过下载、安装、激活和/或以其他方式 使用本软件即表示您已阅读并同意以下条款: * 遵守并受此类许可条款的约束。如果您不同意, * 如果受适用许可条款的约束,则您不得保留、安装、 * 激活或以其他方式使用该软件。 =============================================================================================================*/ /** * @file main.c * * @addtogroup main_module 主模块文档 * @{ */ /* 包括必要的配置文件。*/ #include #include #include #include #include #include #include 枚举 { MODE_RUN = 0, MODE_VLPS , MODE_STOP1 , 模式停止2 }; bool wake_up = false; // 原型 void lptmr0_irq_handler ( void ); void power_mode_report_errors_callback ( Power_Ip_ReportErrorType Error, uint8 ErrorCode); void TestDelay ( uint32 delay) { 静态易失性uint32延迟定时器 = 0; while (DelayTimer { DelayTimer++; } 延迟定时器=0; } int main ( void ) { uint8_t wait_cnt = 0; Power_Ip_Init(&Power_Ip_HwIPsConfigPB); volatile Power_Ip_RawResetType reason = Power_Ip_GetResetRawValue(); Clock_Ip_Init(&Clock_Ip_aClockConfig[0]); Port_Ci_Port_Ip_Init( NUM_OF_CONFIGURED_PINS_PortContainer_0_BOARD_InitPeripherals, g_pin_mux_InitConfigArr_PortContainer_0_BOARD_InitPeripherals); Lptmr_Gpt_Ip_Init(0, &LPTMR_0_InitConfig_PB); Power_Ip_InstallNotificationsCallback(power_mode_report_errors_callback); IntCtrl_Ip_Init(&IntCtrlConfig_0); IntCtrl_Ip_InstallHandler( LPTMR0_IRQn , lptmr0_irq_handler, NULL); // 安装 IRQ 处理程序 IntCtrl_Ip_EnableIrq( LPTMR0_IRQn ); // 启用相关 IRQ Power_Ip_SetMode (&Power_Ip_aModeConfigPB[ MODE_RUN ]); // 发出冷启动信号 Gpio_Dio_Ip_WritePin(BLUE_LED_ID_PORT, BLUE_LED_ID_PIN, 1U); 测试延迟(2000000/5); Gpio_Dio_Ip_WritePin(BLUE_LED_ID_PORT, BLUE_LED_ID_PIN, 0U); 为了(;;) { Gpio_Dio_Ip_TogglePins(RED_LED_ID_PORT, 1 < RED_LED_ID_PIN); 测试延迟(1000000/5); 如果(++wait_cnt > 10) { wait_cnt = 0; // 禁用时钟监测 Clock_Ip_DisableClockMonitor( FIRC_CLK ); Clock_Ip_DisableClockMonitor( FIRC_VLP_CLK ); Clock_Ip_DisableClockMonitor( FIRC_STOP_CLK ); Clock_Ip_DisableClockMonitor( FIRCDIV1_CLK ); Clock_Ip_DisableClockMonitor( FIRCDIV2_CLK ); Clock_Ip_DisableClockMonitor( SIRC_CLK ); Clock_Ip_DisableClockMonitor( SIRC_VLP_CLK ); Clock_Ip_DisableClockMonitor( SIRC_STOP_CLK ); Clock_Ip_DisableClockMonitor( SIRCDIV1_CLK ); Clock_Ip_DisableClockMonitor( SIRCDIV2_CLK ); Clock_Ip_DisableClockMonitor( LPO_128K_CLK ); Clock_Ip_DisableClockMonitor( LPO_32K_CLK ); Clock_Ip_DisableClockMonitor( LPO_1K_CLK ); Clock_Ip_DisableClockMonitor( SCS_CLK ); Clock_Ip_DisableClockMonitor( ADC0_CLK ); Clock_Ip_DisableClockMonitor( BUS_CLK ); Clock_Ip_DisableClockMonitor( BUS_RUN_CLK ); Clock_Ip_DisableClockMonitor( BUS_VLPR_CLK ); Clock_Ip_DisableClockMonitor( CLKOUT0_CLK ); Clock_Ip_DisableClockMonitor( CMP0_CLK ); Clock_Ip_DisableClockMonitor( CMU0_CLK ); Clock_Ip_DisableClockMonitor( CMU1_CLK ); Clock_Ip_DisableClockMonitor( CORE_CLK ); Clock_Ip_DisableClockMonitor( CORE_RUN_CLK ); Clock_Ip_DisableClockMonitor( CORE_VLPR_CLK ); Clock_Ip_DisableClockMonitor( CRC0_CLK ); Clock_Ip_DisableClockMonitor( DMA0_CLK ); Clock_Ip_DisableClockMonitor( DMAMUX0_CLK ); Clock_Ip_DisableClockMonitor( EIM0_CLK ); Clock_Ip_DisableClockMonitor( ERM0_CLK ); Clock_Ip_DisableClockMonitor( FIRC_MON1_CLK ); Clock_Ip_DisableClockMonitor( FIRC_MON2_CLK ); Clock_Ip_DisableClockMonitor( FLEXCAN0_CLK ); Clock_Ip_DisableClockMonitor( FTFC_CLK ); Clock_Ip_DisableClockMonitor( FTM0_CLK ); Clock_Ip_DisableClockMonitor( FTM0_EXT_CLK ); Clock_Ip_DisableClockMonitor( FTM1_CLK ); Clock_Ip_DisableClockMonitor( FTM1_EXT_CLK ); Clock_Ip_DisableClockMonitor( FlexIO_CLK ); Clock_Ip_DisableClockMonitor( GPIO0_CLK ); Clock_Ip_DisableClockMonitor( LPI2C0_CLK ); Clock_Ip_DisableClockMonitor( LPIT0_CLK ); Clock_Ip_DisableClockMonitor( LPO_CLK ); Clock_Ip_DisableClockMonitor( LPSPI0_CLK ); Clock_Ip_DisableClockMonitor( LPTMR0_CLK ); Clock_Ip_DisableClockMonitor( LPUART0_CLK ); Clock_Ip_DisableClockMonitor( LPUART1_CLK ); Clock_Ip_DisableClockMonitor( MPU0_CLK ); Clock_Ip_DisableClockMonitor( MSCM0_CLK ); Clock_Ip_DisableClockMonitor( PDB0_CLK ); Clock_Ip_DisableClockMonitor( PORTA_CLK ); Clock_Ip_DisableClockMonitor( PORTB_CLK ); Clock_Ip_DisableClockMonitor( PORTC_CLK ); Clock_Ip_DisableClockMonitor( PORTD_CLK ); Clock_Ip_DisableClockMonitor( PORTE_CLK ); Clock_Ip_DisableClockMonitor( RTC0_CLK ); Clock_Ip_DisableClockMonitor( RTC_CLK ); Clock_Ip_DisableClockMonitor( RUN_BUS_CLK ); Clock_Ip_DisableClockMonitor( RUN_CORE_CLK ); Clock_Ip_DisableClockMonitor( RUN_FLASH_CLK ); Clock_Ip_DisableClockMonitor( RUN_PRI_DIV_SYS_CLK ); Clock_Ip_DisableClockMonitor( RUN_SYS_CLK ); Clock_Ip_DisableClockMonitor( SCG_CLKOUT_CLK ); Clock_Ip_DisableClockMonitor( SCS_RUN_CLK ); Clock_Ip_DisableClockMonitor( SCS_VLPR_CLK ); Clock_Ip_DisableClockMonitor( SLOW_CLK ); Clock_Ip_DisableClockMonitor( SLOW_RUN_CLK ); Clock_Ip_DisableClockMonitor( SLOW_VLPR_CLK ); Clock_Ip_DisableClockMonitor( THE_LAST_PRODUCER_CLK ); Clock_Ip_DisableClockMonitor( VLPR_BUS_CLK ); Clock_Ip_DisableClockMonitor( VLPR_CORE_CLK ); Clock_Ip_DisableClockMonitor( VLPR_FLASH_CLK ); Clock_Ip_DisableClockMonitor( VLPR_PRI_DIV_SYS_CLK ); Clock_Ip_DisableClockMonitor( VLPR_SYS_CLK ); // 启用定时器中断请求并启动唤醒定时器 Lptmr_Gpt_Ip_EnableInterrupt(0); Lptmr_Gpt_Ip_StartTimer(0, 5000); // 1. 禁用系统滴答(或任何周期性中断) S32_SysTick-> CSRr &= ~S32_SysTick_CSR_ENABLE_MASK; // 2. 使用 FIRC/SOSC/SPLL 禁用/取消初始化外设 //(如果不使用 PNET,则使用 LPUART、ADC、FlexCAN 等) 3. 清除所有待处理的中断标志 (尤其是 LPTMR、PORT 等) IntCtrl_Ip_ClearPending( LPTMR0_IRQn ); // 4. 进入睡眠模式 //Power_Ip_SetMode(&Power_Ip_aModeConfigPB[MODE_VLPS]); Power_Ip_SetMode (&Power_Ip_aModeConfigPB[ MODE_STOP1 ]); //Power_Ip_SetMode(&Power_Ip_aModeConfigPB[MODE_STOP2]); // --- MCU 在此处唤醒 --- // 5. 检查是否发生中止 如果((IP_SMC-> PMCTRL >> 3U) & 0x1U) { /* 处理中止 */ __asm ( "NOP" ); } // 6. 重新启用系统时钟和外设 S32_SysTick-> CSRr |= S32_SysTick_CSR_ENABLE_MASK; } } } void lptmr0_irq_handler ( void ) { IntCtrl_Ip_ClearPending( LPTMR0_IRQn ); Lptmr_Gpt_Ip_StopTimer(0); 唤醒 = true; Gpio_Dio_Ip_TogglePins(GREEN_LED_ID_PORT, 1 < GREEN_LED_ID_PIN); } void power_mode_report_errors_callback ( Power_Ip_ReportErrorType Error, uint8 ErrorCode) { volatile Power_Ip_ResetType reset_type; reset_type = Power_Ip_GetResetReason(); __asm ( "NOP" ); } /** @} */ Re: Can't get S32K116 into STOP1 or VLPS mode, STOP2 does work 你好@fruit_spinner 巧合的是,几周前我也遇到了完全相同的问题。 我发现根本原因是 S32K1 上的 S32 SCT 具有 CMU 时钟门 默认启用。这会导致进入低电源模式时出现问题——具体来说,就是 触发信号复位,复位源由 SACKERR 位设置指示。 我已审阅并测试了您提供的演示版本,并提出以下建议: 变更内容: 1.在 S32 SCT 时钟配置界面中,禁用 CMU0 和 CMU1 的时钟门。 2. 删除或注释掉以下代码,因为它是不必要的。 Re: Can't get S32K116 into STOP1 or VLPS mode, STOP2 does work 您好, 非常感谢您的回复,这解决了我的问题。现在运行正常了。 此致, 惠布
View full article
STOP1やVLPSモードにS32K116できず、STOP2は動作します こんにちは、 私のプロジェクトでは、バッテリーの消費電力を抑えるために、S32K116をスリープモードにする必要があります。私はS32DS 3.6.1とSDK PlatformSDK_S32K1_S32M24、gccバージョン10.2を使っています。低消費電力機能について詳しくないので、評価ボードS32K116EVB-QSGを使用して小さなテストプロジェクトを作成しました。 私はLptmrをウェイクアップソースとして使用しており、LPOの1kHzクロックを使用しています。 終わりのないforループに入る前に青いLEDが切り替えられ、リセットとウェイクアップを区別します。ループに入るとカウンターが増え、赤いLEDが6回点滅してからスリープモードに入ります。スリープモード中はLptmrが経過し、S32K116を起動させ、Lptmr割り込みハンドラが緑色のLEDを切り替えて起動しているのを確認します。 これはSTOP2モードでは期待どおりに動作しますが、STOP1モードやVLPSモードでは動作しません。イライラして、見つけた限りすべてのクロックのクロックモニターを無効にしましたが、効果はありません。 STOP1とVLPSの場合、リセット時にPower_Ip_GetResetRawValue()は0x2000を返します。これは停止確認エラー(SACKERR)を示します。 インターネット上で適切なアプリケーションやスニペットが見つからなかったので、ここで問題を共有します。誰かが私が見落としている点、つまりSTOP1やVLPSに切り替えようと要求するとコントローラがリセットされる理由を教えてもらえればと思います。 アプリケーションノートAN5425を参照しましたが、私の意見にあまり実用的なヒントは与えられていません。 以下にコードを示します。 /*================================================================================================== * プロジェクト:RTD AUTOSAR 4.7 * プラットフォーム:CORTEXM * ペリフェラル:S32K14X * 依存関係:なし * * Autosar バージョン:4.7.0 * Autosar リビジョン:ASR_REL_4_7_REV_0000 * AUTOSAR 会議バリアント: * ソフトウェアバージョン:3.0.0 * ビルドバージョン:S32K1_RTD_3_0_0_QLP02_D2505_ASR_REL_4_7_REV_0000_20250530 * * 著作権 2020-2025 NXP * * NXPの機密情報および専有情報。このソフトウェアはNXPが所有または管理しており、以下の通りに *適用されるライセンス条項に厳密に従って使用してください。明示的に * 当該条件に同意するか、ダウンロード、インストール、アクティベート、および/またはその他 * ソフトウェアを使用することで、あなたは読んだこと、そして同意したことになります * 当該ライセンス条項を遵守し、それに拘束される。もしあなたが同意しない場合 * 該当するライセンス条項に拘束される場合、保持、インストール、 * ソフトウェアを有効化または使用してください。 == /** * @file main.c * * @addtogroup main_module メインモジュールドキュメント * @{ */ /* 必要な設定ファイルを含めます。*/ #include #include #include #include #include #include #include 列挙型 { MODE_RUN = 0、 MODE_VLPS 、 MODE_STOP1 、 モード停止2 }; bool wake_up = false; // プロトタイプ void lptmr0_irq_handler ( void ); void power_mode_report_errors_callback ( Power_Ip_ReportErrorType Error, uint8 ErrorCode); void TestDelay ( uint32 delay) { 静的揮発性uint32 DelayTimer = 0; while (DelayTimer < delay) { DelayTimer++; } 遅延タイマー=0; } int main ( void ) { uint8_t wait_cnt = 0; Power_Ip_Init(&Power_Ip_HwIPsConfigPB); volatile Power_Ip_RawResetType reason = Power_Ip_GetResetRawValue(); Clock_Ip_Init(&Clock_Ip_aClockConfig[0]); Port_Ci_Port_Ip_Init( NUM_OF_CONFIGURED_PINS_PortContainer_0_BOARD_InitPeripherals, g_pin_mux_InitConfigArr_PortContainer_0_BOARD_InitPeripherals); Lptmr_Gpt_Ip_Init(0, &LPTMR_0_InitConfig_PB); Power_Ip_InstallNotificationsCallback(power_mode_report_errors_callback); IntCtrl_Ip_Init(&IntCtrlConfig_0); IntCtrl_Ip_InstallHandler( LPTMR0_IRQn , lptmr0_irq_handler, NULL); // IRQハンドラをインストールします IntCtrl_Ip_EnableIrq( LPTMR0_IRQn ); // 関係するIRQを有効にする Power_Ip_SetMode (&Power_Ip_aModeConfigPB[ MODE_RUN ]); // コールドスタートの合図 Gpio_Dio_Ip_WritePin(BLUE_LED_ID_PORT, BLUE_LED_ID_PIN, 1U); テスト遅延(2000000/5); Gpio_Dio_Ip_WritePin(BLUE_LED_ID_PORT, BLUE_LED_ID_PIN, 0U); のために(;;) { Gpio_Dio_Ip_TogglePins(RED_LED_ID_PORT, 1 < RED_LED_ID_PIN); テスト遅延(1000000/5); if (++wait_cnt > 10) { wait_cnt = 0; // 時計モニターを無効にする Clock_Ip_DisableClockMonitor( FIRC_CLK ); Clock_Ip_DisableClockMonitor( FIRC_VLP_CLK ); Clock_Ip_DisableClockMonitor( FIRC_STOP_CLK ); Clock_Ip_DisableClockMonitor( FIRCDIV1_CLK ); Clock_Ip_DisableClockMonitor( FIRCDIV2_CLK ); Clock_Ip_DisableClockMonitor( SIRC_CLK ); Clock_Ip_DisableClockMonitor( SIRC_VLP_CLK ); Clock_Ip_DisableClockMonitor( SIRC_STOP_CLK ); Clock_Ip_DisableClockMonitor( SIRCDIV1_CLK ); Clock_Ip_DisableClockMonitor( SIRCDIV2_CLK ); Clock_Ip_DisableClockMonitor( LPO_128K_CLK ); Clock_Ip_DisableClockMonitor( LPO_32K_CLK ); Clock_Ip_DisableClockMonitor( LPO_1K_CLK ); Clock_Ip_DisableClockMonitor( SCS_CLK ); Clock_Ip_DisableClockMonitor( ADC0_CLK ); Clock_Ip_DisableClockMonitor( BUS_CLK ); Clock_Ip_DisableClockMonitor( BUS_RUN_CLK ); Clock_Ip_DisableClockMonitor( BUS_VLPR_CLK ); Clock_Ip_DisableClockMonitor( CLKOUT0_CLK ); Clock_Ip_DisableClockMonitor( CMP0_CLK ); Clock_Ip_DisableClockMonitor( CMU0_CLK ); Clock_Ip_DisableClockMonitor( CMU1_CLK ); Clock_Ip_DisableClockMonitor( CORE_CLK ); Clock_Ip_DisableClockMonitor( CORE_RUN_CLK ); Clock_Ip_DisableClockMonitor( CORE_VLPR_CLK ); Clock_Ip_DisableClockMonitor( CRC0_CLK ); Clock_Ip_DisableClockMonitor( DMA0_CLK ); Clock_Ip_DisableClockMonitor( DMAMUX0_CLK ); Clock_Ip_DisableClockMonitor( EIM0_CLK ); Clock_Ip_DisableClockMonitor( ERM0_CLK ); Clock_Ip_DisableClockMonitor( FIRC_MON1_CLK ); Clock_Ip_DisableClockMonitor( FIRC_MON2_CLK ); Clock_Ip_DisableClockMonitor( FLEXCAN0_CLK ); Clock_Ip_DisableClockMonitor( FTFC_CLK ); Clock_Ip_DisableClockMonitor( FTM0_CLK ); Clock_Ip_DisableClockMonitor( FTM0_EXT_CLK ); Clock_Ip_DisableClockMonitor( FTM1_CLK ); Clock_Ip_DisableClockMonitor( FTM1_EXT_CLK ); Clock_Ip_DisableClockMonitor( FlexIO_CLK ); Clock_Ip_DisableClockMonitor( GPIO0_CLK ); Clock_Ip_DisableClockMonitor( LPI2C0_CLK ); Clock_Ip_DisableClockMonitor( LPIT0_CLK ); Clock_Ip_DisableClockMonitor( LPO_CLK ); Clock_Ip_DisableClockMonitor( LPSPI0_CLK ); Clock_Ip_DisableClockMonitor( LPTMR0_CLK ); Clock_Ip_DisableClockMonitor( LPUART0_CLK ); Clock_Ip_DisableClockMonitor( LPUART1_CLK ); Clock_Ip_DisableClockMonitor( MPU0_CLK ); Clock_Ip_DisableClockMonitor( MSCM0_CLK ); Clock_Ip_DisableClockMonitor( PDB0_CLK ); Clock_Ip_DisableClockMonitor( PORTA_CLK ); Clock_Ip_DisableClockMonitor( PORTB_CLK ); Clock_Ip_DisableClockMonitor( PORTC_CLK ); Clock_Ip_DisableClockMonitor( PORTD_CLK ); Clock_Ip_DisableClockMonitor( PORTE_CLK ); Clock_Ip_DisableClockMonitor( RTC0_CLK ); Clock_Ip_DisableClockMonitor( RTC_CLK ); Clock_Ip_DisableClockMonitor( RUN_BUS_CLK ); Clock_Ip_DisableClockMonitor( RUN_CORE_CLK ); Clock_Ip_DisableClockMonitor( RUN_FLASH_CLK ); Clock_Ip_DisableClockMonitor( RUN_PRI_DIV_SYS_CLK ); Clock_Ip_DisableClockMonitor( RUN_SYS_CLK ); Clock_Ip_DisableClockMonitor( SCG_CLKOUT_CLK ); Clock_Ip_DisableClockMonitor( SCS_RUN_CLK ); Clock_Ip_DisableClockMonitor( SCS_VLPR_CLK ); Clock_Ip_DisableClockMonitor( SLOW_CLK ); Clock_Ip_DisableClockMonitor( SLOW_RUN_CLK ); Clock_Ip_DisableClockMonitor( SLOW_VLPR_CLK ); Clock_Ip_DisableClockMonitor( THE_LAST_PRODUCER_CLK ); Clock_Ip_DisableClockMonitor( VLPR_BUS_CLK ); Clock_Ip_DisableClockMonitor( VLPR_CORE_CLK ); Clock_Ip_DisableClockMonitor( VLPR_FLASH_CLK ); Clock_Ip_DisableClockMonitor( VLPR_PRI_DIV_SYS_CLK ); Clock_Ip_DisableClockMonitor( VLPR_SYS_CLK ); // タイマーIRQを有効にしてウェイクアップタイマーを起動する Lptmr_Gpt_Ip_EnableInterrupt(0); Lptmr_Gpt_Ip_StartTimer(0, 5000); // 1. SysTick(またはその他の定期的な割り込み)を無効にする S32_SysTick-> CSRr &= ~S32_SysTick_CSR_ENABLE_MASK; // 2.FIRC/SOSC/SPLL を用いた無効化/非init化ペリフェラル // (LPUART、ADC、PNETを使用しない場合はFlexCANなど) // 3. 保留中の割り込みフラグをすべてクリアする // (特に LPTMR、PORT など) IntCtrl_Ip_ClearPending( LPTMR0_IRQn ); // 4. スリープモードに入る //Power_Ip_SetMode(&Power_Ip_aModeConfigPB[MODE_VLPS]); Power_Ip_SetMode (&Power_Ip_aModeConfigPB[ MODE_STOP1 ]); //Power_Ip_SetMode(&Power_Ip_aModeConfigPB[MODE_STOP2]); ---MCUはここで目覚めます--- // 5. 異常終了が発生したかどうかを確認する if ((IP_SMC-> PMCTRL >> 3U) & 0x1U) { /* 中止処理 */ __asm ( "NOP" ); } // 6.SysTickおよびペリフェラルの再有効化 S32_SysTick-> CSRr |= S32_SysTick_CSR_ENABLE_MASK; } } } void lptmr0_irq_handler ( void ) { IntCtrl_Ip_ClearPending( LPTMR0_IRQn ); Lptmr_Gpt_Ip_StopTimer(0); wake_up = true; Gpio_Dio_Ip_TogglePins(GREEN_LED_ID_PORT, 1 } void power_mode_report_errors_callback ( Power_Ip_ReportErrorType Error, uint8 ErrorCode) { volatile Power_Ip_ResetType reset_type; reset_type = Power_Ip_GetResetReason(); __asm ( "NOP" ); } /** @} */ Re: Can't get S32K116 into STOP1 or VLPS mode, STOP2 does work こんにちは、@fruit_spinner 実は私も数週間前に全く同じ問題に遭遇しました。 根本原因は、S32K1のS32 SCTにCMUクロックゲートが搭載されていることだと判明しました。 デフォルトで有効になっています。これは低電力モードに入るときに問題を引き起こします。具体的には、 リセットがトリガーされ、リセット元はSACKERRビットがセットされることで示されます。 ご提供いただいたデモをレビューおよびテストした結果、以下の点をご提案いたします。 変更点: 1.S32 SCTクロック設定インターフェースでは、CMU0およびCMU1のクロックゲートを無効にします。 2. 以下のコードは不要なので、削除またはコメントアウトしてください。 Re: Can't get S32K116 into STOP1 or VLPS mode, STOP2 does work こんにちは、 ご回答いただきありがとうございました。おかげで問題が解決しました。今は期待通りに動作しています。 よろしくお願いいたします フイブ
View full article
MX8MP ENET電圧 こんにちは、 MX8XコントローラーからMX8MPに移行しています。旧型では、ENET0とENET1は1.8V、2.5V、3.3Vの電圧をサポートしていました(RMIIは3つすべて、RGMIIは最初の2つのみ)。 MX8MPでは2.5Vのオプションは削除されましたが、1.8Vと3.3Vの選択肢は残されています。絶対最大電圧は3.8Vです。問題は、NVCC_ENETが2.5Vで動作する場合、何が起こるかということです。2.5は絶対最大値を超えません。しかし、MAC信号はどのように構成されているのか、また2.5V動作は長期的にどのような影響を与えるのか? 私が質問したのは、現在電源とVDDIOの両方が2.5Vで動作している古いPHYをアップデートせずに済むと非常に助かるからです。 ありがとうございました。 Mike 通信・制御(I3C |I2C |SPI |FlexCAN |イーサネット |FlexIO) Re: MX8MP ENET voltage ありがとう、ホルヘ。アバターが気に入りました。 🙂 Re: MX8MP ENET voltage こんにちは、 ドキュメントに記載されているように、インターフェースは1.8Vと3.3Vの2つの電圧レベルのみをサポートしています。たとえ2.5Vが全体の動作電圧範囲内であっても、2.5V信号は有効な論理レベルの指定閾値を満たさず、予測不能な挙動を引き起こす可能性があります。 このインターフェースには1.8Vか3.3Vの使用をおすすめします。 よろしくお願いいたします。
View full article
Can't get S32K116 into STOP1 or VLPS mode, STOP2 does work Hello, For my project I need to put the S32K116 into sleep mode in order to save power on the battery. I am using S32DS 3.6.1 and SDK PlatformSDK_S32K1_S32M24, gcc version 10.2. Since I'm not familiar with the low power functionality I've built a small test project using eval board S32K116EVB-QSG. I am using the Lptmr as a wake-up source and it is using the LPO 1kHz clock. Before entering a endless for loop the blue LED is toggled so I distinguish a reset from a wake-up. Once in the loop a counter is increased so we get 6 blinks of the red LED before entering sleep mode. During sleep mode the Lptmr will elapse and wake-up the S32K116, the Lptmr interrupt handler will toggle the green LED so I can see it is being woken up. Now this works as expected for STOP2 mode but not for STOP1 nor for VLPS. Out of frustration I disable clock monitor for all clocks I could find but this makes no difference. For STOP1 and VLPS, when it is resetting Power_Ip_GetResetRawValue() returns 0x2000 which indicates Stop Acknowledge Error (SACKERR). I could not find a suitable application/snippet on the internet so I am sharing my problem here hoping someone can shine a light what I am missing i.e. why the controller resets when I am demanding it to goto STOP1 or VLPS. I consulted application note AN5425 but this does not give very practical hints to my opinion. My code: /*================================================================================================== * Project : RTD AUTOSAR 4.7 * Platform : CORTEXM * Peripheral : S32K14X * Dependencies : none * * Autosar Version : 4.7.0 * Autosar Revision : ASR_REL_4_7_REV_0000 * Autosar Conf.Variant : * SW Version : 3.0.0 * Build Version : S32K1_RTD_3_0_0_QLP02_D2505_ASR_REL_4_7_REV_0000_20250530 * * Copyright 2020-2025 NXP * * NXP Confidential and Proprietary. This software is owned or controlled by NXP and may only be * used strictly in accordance with the applicable license terms. By expressly * accepting such terms or by downloading, installing, activating and/or otherwise * using the software, you are agreeing that you have read, and that you agree to * comply with and are bound by, such license terms. If you do not agree to be * bound by the applicable license terms, then you may not retain, install, * activate or otherwise use the software. ==================================================================================================*/ /** * @file main.c * * @addtogroup main_module main module documentation * @{ */ /* Including necessary configuration files. */ #include #include #include #include #include #include #include enum { MODE_RUN = 0, MODE_VLPS, MODE_STOP1, MODE_STOP2 }; bool wake_up = false; // Proto-types void lptmr0_irq_handler(void); void power_mode_report_errors_callback(Power_Ip_ReportErrorType Error, uint8 ErrorCode); void TestDelay(uint32 delay) { static volatile uint32 DelayTimer = 0; while(DelayTimer { DelayTimer++; } DelayTimer=0; } int main(void) { uint8_t wait_cnt = 0; Power_Ip_Init(&Power_Ip_HwIPsConfigPB); volatile Power_Ip_RawResetType reason = Power_Ip_GetResetRawValue(); Clock_Ip_Init(&Clock_Ip_aClockConfig[0]); Port_Ci_Port_Ip_Init( NUM_OF_CONFIGURED_PINS_PortContainer_0_BOARD_InitPeripherals, g_pin_mux_InitConfigArr_PortContainer_0_BOARD_InitPeripherals); Lptmr_Gpt_Ip_Init(0, &LPTMR_0_InitConfig_PB); Power_Ip_InstallNotificationsCallback(power_mode_report_errors_callback); IntCtrl_Ip_Init(&IntCtrlConfig_0); IntCtrl_Ip_InstallHandler(LPTMR0_IRQn, lptmr0_irq_handler, NULL); // Install IRQ handlers IntCtrl_Ip_EnableIrq(LPTMR0_IRQn); // Enable IRQ's involved Power_Ip_SetMode(&Power_Ip_aModeConfigPB[MODE_RUN]); // Signal a cold start Gpio_Dio_Ip_WritePin(BLUE_LED_ID_PORT, BLUE_LED_ID_PIN, 1U); TestDelay(2000000/5); Gpio_Dio_Ip_WritePin(BLUE_LED_ID_PORT, BLUE_LED_ID_PIN, 0U); for(;;) { Gpio_Dio_Ip_TogglePins(RED_LED_ID_PORT, 1 << RED_LED_ID_PIN); TestDelay(1000000/5); if(++wait_cnt > 10) { wait_cnt = 0; // Disable clock monitors Clock_Ip_DisableClockMonitor(FIRC_CLK); Clock_Ip_DisableClockMonitor(FIRC_VLP_CLK); Clock_Ip_DisableClockMonitor(FIRC_STOP_CLK); Clock_Ip_DisableClockMonitor(FIRCDIV1_CLK); Clock_Ip_DisableClockMonitor(FIRCDIV2_CLK); Clock_Ip_DisableClockMonitor(SIRC_CLK); Clock_Ip_DisableClockMonitor(SIRC_VLP_CLK); Clock_Ip_DisableClockMonitor(SIRC_STOP_CLK); Clock_Ip_DisableClockMonitor(SIRCDIV1_CLK); Clock_Ip_DisableClockMonitor(SIRCDIV2_CLK); Clock_Ip_DisableClockMonitor(LPO_128K_CLK); Clock_Ip_DisableClockMonitor(LPO_32K_CLK); Clock_Ip_DisableClockMonitor(LPO_1K_CLK); Clock_Ip_DisableClockMonitor(SCS_CLK); Clock_Ip_DisableClockMonitor(ADC0_CLK); Clock_Ip_DisableClockMonitor(BUS_CLK); Clock_Ip_DisableClockMonitor(BUS_RUN_CLK); Clock_Ip_DisableClockMonitor(BUS_VLPR_CLK); Clock_Ip_DisableClockMonitor(CLKOUT0_CLK); Clock_Ip_DisableClockMonitor(CMP0_CLK); Clock_Ip_DisableClockMonitor(CMU0_CLK); Clock_Ip_DisableClockMonitor(CMU1_CLK); Clock_Ip_DisableClockMonitor(CORE_CLK); Clock_Ip_DisableClockMonitor(CORE_RUN_CLK); Clock_Ip_DisableClockMonitor(CORE_VLPR_CLK); Clock_Ip_DisableClockMonitor(CRC0_CLK); Clock_Ip_DisableClockMonitor(DMA0_CLK); Clock_Ip_DisableClockMonitor(DMAMUX0_CLK); Clock_Ip_DisableClockMonitor(EIM0_CLK); Clock_Ip_DisableClockMonitor(ERM0_CLK); Clock_Ip_DisableClockMonitor(FIRC_MON1_CLK); Clock_Ip_DisableClockMonitor(FIRC_MON2_CLK); Clock_Ip_DisableClockMonitor(FLEXCAN0_CLK); Clock_Ip_DisableClockMonitor(FTFC_CLK); Clock_Ip_DisableClockMonitor(FTM0_CLK); Clock_Ip_DisableClockMonitor(FTM0_EXT_CLK); Clock_Ip_DisableClockMonitor(FTM1_CLK); Clock_Ip_DisableClockMonitor(FTM1_EXT_CLK); Clock_Ip_DisableClockMonitor(FlexIO_CLK); Clock_Ip_DisableClockMonitor(GPIO0_CLK); Clock_Ip_DisableClockMonitor(LPI2C0_CLK); Clock_Ip_DisableClockMonitor(LPIT0_CLK); Clock_Ip_DisableClockMonitor(LPO_CLK); Clock_Ip_DisableClockMonitor(LPSPI0_CLK); Clock_Ip_DisableClockMonitor(LPTMR0_CLK); Clock_Ip_DisableClockMonitor(LPUART0_CLK); Clock_Ip_DisableClockMonitor(LPUART1_CLK); Clock_Ip_DisableClockMonitor(MPU0_CLK); Clock_Ip_DisableClockMonitor(MSCM0_CLK); Clock_Ip_DisableClockMonitor(PDB0_CLK); Clock_Ip_DisableClockMonitor(PORTA_CLK); Clock_Ip_DisableClockMonitor(PORTB_CLK); Clock_Ip_DisableClockMonitor(PORTC_CLK); Clock_Ip_DisableClockMonitor(PORTD_CLK); Clock_Ip_DisableClockMonitor(PORTE_CLK); Clock_Ip_DisableClockMonitor(RTC0_CLK); Clock_Ip_DisableClockMonitor(RTC_CLK); Clock_Ip_DisableClockMonitor(RUN_BUS_CLK); Clock_Ip_DisableClockMonitor(RUN_CORE_CLK); Clock_Ip_DisableClockMonitor(RUN_FLASH_CLK); Clock_Ip_DisableClockMonitor(RUN_PRI_DIV_SYS_CLK); Clock_Ip_DisableClockMonitor(RUN_SYS_CLK); Clock_Ip_DisableClockMonitor(SCG_CLKOUT_CLK); Clock_Ip_DisableClockMonitor(SCS_RUN_CLK); Clock_Ip_DisableClockMonitor(SCS_VLPR_CLK); Clock_Ip_DisableClockMonitor(SLOW_CLK); Clock_Ip_DisableClockMonitor(SLOW_RUN_CLK); Clock_Ip_DisableClockMonitor(SLOW_VLPR_CLK); Clock_Ip_DisableClockMonitor(THE_LAST_PRODUCER_CLK); Clock_Ip_DisableClockMonitor(VLPR_BUS_CLK); Clock_Ip_DisableClockMonitor(VLPR_CORE_CLK); Clock_Ip_DisableClockMonitor(VLPR_FLASH_CLK); Clock_Ip_DisableClockMonitor(VLPR_PRI_DIV_SYS_CLK); Clock_Ip_DisableClockMonitor(VLPR_SYS_CLK); // Enable timer IRQ and spawn wake-up timer Lptmr_Gpt_Ip_EnableInterrupt(0); Lptmr_Gpt_Ip_StartTimer(0, 5000); // 1. Disable SysTick (or any periodic interrupt) S32_SysTick->CSRr &= ~S32_SysTick_CSR_ENABLE_MASK; // 2. Disable/de-init peripherals using FIRC/SOSC/SPLL // (LPUART, ADC, FlexCAN if not using PNET, etc.) // 3. Clear any pending interrupt flags // (especially LPTMR, PORT, etc.) IntCtrl_Ip_ClearPending(LPTMR0_IRQn); // 4. Enter sleep mode //Power_Ip_SetMode(&Power_Ip_aModeConfigPB[MODE_VLPS]); Power_Ip_SetMode(&Power_Ip_aModeConfigPB[MODE_STOP1]); //Power_Ip_SetMode(&Power_Ip_aModeConfigPB[MODE_STOP2]); // --- MCU wakes here --- // 5. Check if abort occurred if ((IP_SMC->PMCTRL >> 3U) & 0x1U) { /* handle abort */ __asm("NOP"); } // 6. Re-enable SysTick and peripherals S32_SysTick->CSRr |= S32_SysTick_CSR_ENABLE_MASK; } } } void lptmr0_irq_handler(void) { IntCtrl_Ip_ClearPending(LPTMR0_IRQn); Lptmr_Gpt_Ip_StopTimer(0); wake_up = true; Gpio_Dio_Ip_TogglePins(GREEN_LED_ID_PORT, 1 << GREEN_LED_ID_PIN); } void power_mode_report_errors_callback(Power_Ip_ReportErrorType Error, uint8 ErrorCode) { volatile Power_Ip_ResetType reset_type; reset_type = Power_Ip_GetResetReason(); __asm("NOP"); } /** @} */ Re: Can't get S32K116 into STOP1 or VLPS mode, STOP2 does work Hi@fruit_spinner As it happens, I encountered the exact same issue a few weeks ago. I discovered that the root cause was that the S32 SCT on the S32K1 has the CMU clock gate enabled by default. This causes problems when entering low-power modes—specifically, it triggers a reset, with the reset source indicated by the SACKERR bit being set. I have reviewed and tested the demo you provided, and I suggest the following modifications: 1. In the S32 SCT clock configuration interface, disable the clock gates of CMU0 and CMU1. 2. Remove or comment out the following code, as it is unnecessary. Re: Can't get S32K116 into STOP1 or VLPS mode, STOP2 does work Hi, Thanks a lot for your reply, this solved my problem. It works as expected now. regards, Huib
View full article
AB_SWAPファームウェアの初期インストール手順 HSE_B リファレンス・マニュアル (v2.7)では、ファームウェアのインストールが2つのセクションで扱われています。 - 3.2 FULL_MEM構成でのインストールプロセス - 3.3 AB_SWAP構成におけるインストールプロセス 工場出荷時のS32K3デバイスは、FULL_MEM構成になっています。これは、正しい手順がセクション3.2(FULL_MEM構成)で網羅されていることを示唆しています。 一方、インストールするファームウェアはAB_SWAPタイプです。これは、正しい一連の命令がセクション3.3(AB_SWAP構成)で網羅されていることを示唆しています。 工場出荷時の新品デバイスにAB_SWAPファームウェアをインストールするための手順は、マニュアルのどのセクションに記載されていますか? Re: Instructions for initial installation of AB_SWAP firmware こんにちは、 @FredrikMoller さん もしHSE_B Firmware リファレンス・マニュアルの3.3.1節に記載されているMUベースの方法ではなく、IVT方法でAB_SWAP構成でHSE FWをインストールするための指針をお探しの場合は、AN744810: HSE FW Install for S32K3xxを参照することをお勧めします。これは、デバイスの「セキュアファイル」セクションで利用できます。 また、「 Install HSE Firmware on S32K344 」では、FULL_MEMメモリ構成とAB_SWAPメモリ構成の両方に対してIVT方式でS32K344デバイスにHSE FWをインストールする方法を実演しています。 BR、VaneB
View full article
AB_SWAP固件初始安装说明 HSE_B 固件参考手册(v2.7)中,固件安装分为两个部分: - 3.2 FULL_MEM 配置下的安装过程 - 3.3 AB_SWAP 配置中的安装过程 出厂时,S32K3 设备将处于 FULL_MEM 配置。这表明第 3.2 节(FULL_MEM 配置)涵盖了正确的指令集。 另一方面,要安装的固件类型为 AB_SWAP。这表明第 3.3 节(AB_SWAP 配置)涵盖了正确的指令集。 手册的哪一部分包含了在刚从工厂交付的设备上安装 AB_SWAP 固件的相关说明? Re: Instructions for initial installation of AB_SWAP firmware 嗨@FredrikMoller 如果您正在寻找有关使用 IVT 方法在 AB_SWAP 配置中安装 HSE FW 的指导,而不是 HSE_B 固件参考手册第 3.3.1 节中描述的基于 MU 的方法,我建议您参考 AN744810:S32K3xx 的 HSE FW 安装。此功能位于设备的“安全文件”部分。 此外,在 S32K344 上安装 HSE 固件演示了如何使用 IVT 方法在 S32K344 设备上为 FULL_MEM 和 AB_SWAP 内存配置安装 HSE 固件。 BR,VaneB
View full article
Instructions for initial installation of AB_SWAP firmware In HSE_B Firmware Reference Manual (v2.7) installation of firmware is covered in two sections: - 3.2 Installation process in FULL_MEM configuration - 3.3 Installation process in AB_SWAP configuration With an S32K3 device delivered from factory, the device will be in FULL_MEM configuration. This suggests that the correct set of instructions are covered by section 3.2 (FULL_MEM configuration). On the other hand, the firmware to install is of type AB_SWAP. This suggests that the correct set of instruction are coverd by section 3.3 (AB_SWAP configuration). Which section in the manual contains the relevant instructions for installing AB_SWAP firmware on device freshly delivered from factory? Re: Instructions for initial installation of AB_SWAP firmware Hi @FredrikMoller  If you are looking for guidance on installing HSE FW in the AB_SWAP configuration using the IVT method, rather than the MU-based method described in Section 3.3.1 of the HSE_B Firmware Reference Manual, I recommend referring to AN744810: HSE FW Install for S32K3xx. This is available under the device's Secure Files section. Also, Install HSE Firmware on S32K344 demonstrates how to install HSE FW on an S32K344 device using the IVT method for both FULL_MEM and AB_SWAP memory configurations.  BR, VaneB
View full article
How to use the GPU of the NXP Layerscape LS1028A with Yocto How to use the GPU of the NXP Layerscape LS1028A with Yocto  Yocto Project Configuration The most modern and NXP-recommended method for developing with the LS1028A is the Layerscape Linux Distribution POC (LLDP) based on Yocto. Unlike the LSDK (which uses Flexbuild), LLDP uses Yocto/Bitbake and is the long-term supported path. 1 Host Requirements Requirement Details Operating System Ubuntu 20.04 LTS (Focal) — official recommendation RAM Minimum 8 GB (16 GB+ recommended) Disk Space Minimum 100 GB free CPU Minimum 4 cores (more cores = faster builds) Tools git, repo, python3, wget, curl, build-essential Install dependencies on Ubuntu: sudo apt-get update && sudo apt-get install -y  gawk wget git diffstat unzip texinfo gcc-multilib \   build-essential chrpath socat cpio python3 python3-pip  python3-pexpect xz-utils debianutils iputils-ping \   python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev  pylint xterm rsync curl locales zstd liblz4-tool \   repo ca-certificates # Configure git (required by repo) git config --global user.name "Your Name" git config --global user.email "[email protected]" 2 Download the LLDP Repository (Yocto for LS1028A) # Create working directory mkdir ~/lldp-ls1028a && cd ~/lldp-ls1028a # Initialize repo with the LLDP manifest (Kirkstone, kernel 5.15) repo init -u https://github.com/nxp-qoriq/yocto-sdk.git \           -b kirkstone \           -m ls-5.15.71-2.2.0_distro.xml # Sync all repositories (may tak             e 30-60 minutes) repo sync Note: For the latest version (LLDP L6.1.1, kernel 6.1), check the updated manifest at: https://github.com/nxp-qoriq/yocto-sdk 3 Set Up the Build Environment for LS1028A # Initialize Yocto environment for the LS1028A # (run from the lldp-ls1028a/ directory) DISTRO=fsl-qoriq-distro MACHINE=ls1028ardb source distro-setup-env # This automatically creates and enters the build directory # You are now in: ~/lldp-ls1028a/build_ls1028ardb/ 4 local.conf File — GPU Configuration The conf/local.conf file inside the build directory controls compilation options. For the LS1028A with GPU, verify or add: # Edit the configuration file nano conf/local.conf Key parameters for GPU and desktop: # Target machine MACHINE = "ls1028ardb" # Distribution with GPU and Wayland support DISTRO = "fsl-qoriq-distro" # Enable display and GPU features DISTRO_FEATURES:append = " wayland opengl" # GPU driver: use Etnaviv (open-source) for LS1028A # DO NOT use imx-gpu-viv (i.MX only, requires ARCH_MXC) PREFERRED_PROVIDER_virtual/libgl = "mesa" PREFERRED_PROVIDER_virtual/libgles1 = "mesa" PREFERRED_PROVIDER_virtual/libgles2 = "mesa" PREFERRED_PROVIDER_virtual/egl = "mesa" # Enable OpenCL support via Vivante GPU IMAGE_INSTALL:append = " clinfo" # Accept NXP proprietary licenses (required for GPU firmware) LICENSE_FLAGS_ACCEPTED = "nxp-proprietary" # Parallel build threads (adjust to your host PC) BB_NUMBER_THREADS = "8" PARALLEL_MAKE = "-j 8" # (Optional) Use ccache to speed up recompilations INHERIT += "ccache" 5 Required Yocto Layers (bblayers.conf) Verify that conf/bblayers.conf includes these layers: cat conf/bblayers.conf It must contain at least: BBLAYERS ?= " \   ${BSPDIR}/sources/poky/meta \   ${BSPDIR}/sources/poky/meta-poky \   ${BSPDIR}/sources/meta-openembedded/meta-oe \   ${BSPDIR}/sources/meta-openembedded/meta-multimedia \   ${BSPDIR}/sources/meta-openembedded/meta-python \   ${BSPDIR}/sources/meta-openembedded/meta-networking \   ${BSPDIR}/sources/meta-freescale \   ${BSPDIR}/sources/meta-qoriq \   ${BSPDIR}/sources/meta-nxp-desktop \ " The meta-nxp-desktop layer is what provides GPU support for the LS1028A with the ls-image-desktop image. 6 Build the Image with GPU Support # Recommended: Desktop image with full GPU support (LS1028A only) # Includes: GNOME desktop, Weston/Wayland, Vivante GPU drivers, OpenCL bitbake ls-image-desktop # Alternative: download all packages first before building # (useful for catching network errors before the long build) bitbake ls-image-desktop --runall fetch bitbake ls-image-desktop # Minimal: main image without desktop (no GPU by default) bitbake ls-image-main # Lite: minimal image bitbake ls-image-lite Estimated build time: Between 4 and 8 hours on the first build (depending on host hardware). Incremental builds are much faster. 7 Install the Image to the SD Card After compilation, output files are located in: tmp/deploy/images/ls1028ardb/ # Identify the SD card (verify with lsblk) lsblk # Install image using flex-installer (included in the SDK) flex-installer \   -b tmp/deploy/images/ls1028ardb/boot_ls1028ardb.tgz \   -f tmp/deploy/images/ls1028ardb/firmware_ls1028ardb_sdboot.img \   -r tmp/deploy/images/ls1028ardb/ls-image-desktop-ls1028ardb.tar.zst \   -d /dev/sdX    # replace with your SD device Practical Example: OpenCL Application on LS1028A This example shows how to compile and run a program that uses the GC7000UL GPU to add two vectors with OpenCL. 8.1 Source Code: vector_add.cl (OpenCL Kernel) Create the kernel file on the LS1028A board: # On the LS1028A (via serial or SSH) cat > /home/root/vector_add.cl << 'EOF' __kernel void vector_add(     __global const float* a,     __global const float* b,     __global float* c,     const int n) {     int gid = get_global_id(0);     if (gid < n) {         c[gid] = a[gid] + b[gid];     } } 8.2 Source Code: vector_add.c (OpenCL Host) cat > /home/root/vector_add.c << 'EOF' #include #include #include #include #define VECTOR_SIZE 1024 int main() {     cl_platform_id   platform;     cl_device_id     device;     cl_context       context;     cl_command_queue queue;     cl_program       program;     cl_kernel        kernel;     cl_mem           buf_a, buf_b, buf_c;     cl_int           err;     // 1. Get Vivante GPU platform and device     err = clGetPlatformIDs(1, &platform, NULL);     err = clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 1, &device, NULL);     // Print device name     char device_name[128];     clGetDeviceInfo(device, CL_DEVICE_NAME, sizeof(device_name), device_name, NULL);     printf("GPU detected: %s\n", device_name);     // 2. Create context and command queue     context = clCreateContext(NULL, 1, &device, NULL, NULL, &err);     queue   = clCreateCommandQueue(context, device, 0, &err);     // 3. Read kernel source from file     FILE* f = fopen("vector_add.cl", "r");     fseek(f, 0, SEEK_END);     size_t src_size = ftell(f);     rewind(f);     char* src=(char*)malloc(src_size + 1);     fread(src, 1, src_size, f);     src[src_size] = '\0';     fclose(f);     // 4. Compile OpenCL program     program = clCreateProgramWithSource(context, 1, (const char**)&src, &src_size, &err);     err = clBuildProgram(program, 1, &device, NULL, NULL, NULL);     if (err != CL_SUCCESS) {         char log[2048];         clGetProgramBuildInfo(program, device, CL_PROGRAM_BUILD_LOG,                               sizeof(log), log, NULL);         printf("Compilation error:\n%s\n", log);         return 1;     }     kernel = clCreateKernel(program, "vector_add", &err);     // 5. Prepare input data     float* h_a = (float*)malloc(VECTOR_SIZE * sizeof(float));     float* h_b = (float*)malloc(VECTOR_SIZE * sizeof(float));     float* h_c = (float*)malloc(VECTOR_SIZE * sizeof(float));     for (int i = 0; i < VECTOR_SIZE; i++) {         h_a[i] = (float)i;         h_b[i] = (float)(VECTOR_SIZE - i);     }     // 6. Create GPU buffers     buf_a = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR,                            VECTOR_SIZE * sizeof(float), h_a, &err);     buf_b = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR,                            VECTOR_SIZE * sizeof(float), h_b, &err);     buf_c = clCreateBuffer(context, CL_MEM_WRITE_ONLY,                            VECTOR_SIZE * sizeof(float), NULL, &err);     // 7. Set kernel arguments and execute on GPU     int n = VECTOR_SIZE;     clSetKernelArg(kernel, 0, sizeof(cl_mem), &buf_a);     clSetKernelArg(kernel, 1, sizeof(cl_mem), &buf_b);     clSetKernelArg(kernel, 2, sizeof(cl_mem), &buf_c);     clSetKernelArg(kernel, 3, sizeof(int), &n);     size_t global_size = VECTOR_SIZE;     err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL,                                   &global_size, NULL, 0, NULL, NULL);     clFinish(queue);     // 8. Read result     clEnqueueReadBuffer(queue, buf_c, CL_TRUE, 0,                         VECTOR_SIZE * sizeof(float), h_c, 0, NULL, NULL);     // 9. Verify result (each element should equal VECTOR_SIZE = 1024)     int ok = 1;     for (int i = 0; i < VECTOR_SIZE; i++) {         if (h_c[i] != (float)VECTOR_SIZE) { ok = 0; break; }     }     printf("Result: %s\n", ok ? "CORRECT - GPU works!" : "CALCULATION ERROR");     printf("Example: a[0]=%.0f + b[0]=%.0f = c[0]=%.0f\n",            h_a[0], h_b[0], h_c[0]);     // Free resources     clReleaseMemObject(buf_a); clReleaseMemObject(buf_b); clReleaseMemObject(buf_c);     clReleaseKernel(kernel); clReleaseProgram(program);     clReleaseCommandQueue(queue); clReleaseContext(context);     free(h_a); free(h_b); free(h_c); free(src);     return 0; } 8.3 Compile and Run on the LS1028A On the LS1028A board (connected via serial or SSH): # Install build tools and OpenCL headers apt-get install -y gcc clinfo ocl-icd-libopencl1 opencl-headers # Compile gcc -o vector_add vector_add.c -lOpenCL -I/usr/include # Run ./vector_add Expected output: GPU detected: Vivante OpenCL Device GC7000UL.6202.0000 Result: CORRECT - GPU works! Example: a[0]=0 + b[0]=1024 = c[0]=1024 12.4 Yocto Recipe to Include the Example in the Image To include the example directly in the Yocto image, create a recipe in your custom layer: mkdir -p ~/lldp-ls1028a/sources/meta-my-layer/recipes-examples/opencl-vector/files cp vector_add.c vector_add.cl \    ~/lldp-ls1028a/sources/meta-my-layer/recipes-examples/opencl-vector/files/ Recipe file opencl-vector_1.0.bb: SUMMARY = "OpenCL vector addition example for LS1028A GPU" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" SRC_URI = "file://vector_add.c \            file://vector_add.cl" DEPENDS = "virtual/opencl-icd opencl-headers" S = "${WORKDIR}" do_compile() {     ${CC} ${CFLAGS} -o vector_add vector_add.c -lOpenCL ${LDFLAGS} } do_install() {     install -d ${D}${bindir}     install -m 0755 vector_add ${D}${bindir}/     install -d ${D}/home/root     install -m 0644 vector_add.cl ${D}/home/root/ } FILES:${PN} += "/home/root/vector_add.cl" Add to local.conf and rebuild: IMAGE_INSTALL:append = " opencl-vector" bitbake ls-image-desktop Practical Example: OpenGL ES Rendering with Wayland/Weston This example shows how to render an animated triangle using OpenGL ES 2.0 with EGL on the Weston (Wayland) compositor — the standard "Hello World" of embedded graphics on the GC7000UL GPU. 9.1 Graphics Stack Diagram C Application      ↓ OpenGL ES 2.0  (libGLESv2.so — Vivante GC7000UL)      ↓ EGL 1.4        (libEGL.so — interface between GLES and Wayland)      ↓ Wayland Client (libwayland-client, libwayland-egl)      ↓ Weston Compositor (DRM/KMS + Mali-DP500)      ↓ DisplayPort → 4K Monitor 9.2 Install Dependencies On the LS1028A (with ls-image-desktop): apt-get install -y libgles2-mesa-dev libegl1-mesa-dev libwayland-dev libwayland-egl-backend-dev gcc pkg-config 9.3 Source Code: triangle_gles.c cat > /home/root/triangle_gles.c << 'EOF' /**  * OpenGL ES 2.0 + EGL + Wayland example  * Renders a colored spinning triangle on the Vivante GC7000UL GPU of the LS1028A  * Compile: gcc -o triangle_gles triangle_gles.c -lwayland-client -lwayland-egl -lEGL -lGLESv2 -lm  */ #include #include #include #include #include #include #include #include #define WIDTH  800 #define HEIGHT 600 static struct wl_display       *wl_display    = NULL; static struct wl_compositor    *wl_compositor = NULL; static struct wl_shell         *wl_shell      = NULL; static struct wl_surface       *wl_surface    = NULL; static struct wl_shell_surface *shell_surface = NULL; static struct wl_egl_window    *egl_window    = NULL; static EGLDisplay egl_display; static EGLContext egl_context; static EGLSurface egl_surface; static const char *vertex_shader_src=     "attribute vec2 a_position;          \n"     "attribute vec3 a_color;             \n"     "varying vec3 v_color;               \n"     "uniform float u_angle;              \n"     "void main() {                       \n"     "  float c = cos(u_angle);           \n"     "  float s = sin(u_angle);           \n"     "  vec2 rot = vec2(                  \n"     "    a_position.x*c - a_position.y*s,\n"     "    a_position.x*s + a_position.y*c \n"     "  );                                \n"     "  gl_Position = vec4(rot, 0.0, 1.0);\n"     "  v_color = a_color;                \n"     "}                                   \n"; static const char *fragment_shader_src=     "precision mediump float;            \n"     "varying vec3 v_color;               \n"     "void main() {                       \n"     "  gl_FragColor = vec4(v_color, 1.0);\n"     "}                                   \n"; /* Vertices: position (x,y) + color (r,g,b) */ static const float vertices[] = {      0.0f,  0.8f,  1.0f, 0.0f, 0.0f,   /* Top    - Red   */     -0.7f, -0.5f,  0.0f, 1.0f, 0.0f,   /* Left   - Green */      0.7f, -0.5f,  0.0f, 0.0f, 1.0f,   /* Right  - Blue  */ }; static void registry_global(void *data, struct wl_registry *reg,                              uint32_t name, const char *iface, uint32_t ver) {     if (strcmp(iface, "wl_compositor") == 0)         wl_compositor = wl_registry_bind(reg, name, &wl_compositor_interface, 1);     else if (strcmp(iface, "wl_shell") == 0)         wl_shell = wl_registry_bind(reg, name, &wl_shell_interface, 1); } static void registry_global_remove(void *d, struct wl_registry *r, uint32_t n) {} static const struct wl_registry_listener registry_listener = {     registry_global, registry_global_remove }; static GLuint compile_shader(GLenum type, const char *src) {     GLuint shader = glCreateShader(type);     glShaderSource(shader, 1, &src, NULL);     glCompileShader(shader);     GLint ok; glGetShaderiv(shader, GL_COMPILE_STATUS, &ok);     if (!ok) {         char log[512]; glGetShaderInfoLog(shader, 512, NULL, log);         printf("Shader error: %s\n", log); exit(1);     }     return shader; } int main() {     wl_display = wl_display_connect(NULL);     if (!wl_display) { printf("Error: could not connect to Wayland\n"); return 1; }     struct wl_registry *registry = wl_display_get_registry(wl_display);     wl_registry_add_listener(registry, &registry_listener, NULL);     wl_display_dispatch(wl_display);     wl_display_roundtrip(wl_display);     wl_surface = wl_compositor_create_surface(wl_compositor);     shell_surface = wl_shell_get_shell_surface(wl_shell, wl_surface);     wl_shell_surface_set_toplevel(shell_surface);     egl_display = eglGetDisplay((EGLNativeDisplayType)wl_display);     eglInitialize(egl_display, NULL, NULL);     eglBindAPI(EGL_OPENGL_ES_API);     EGLint config_attribs[] = {         EGL_SURFACE_TYPE,    EGL_WINDOW_BIT,         EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,         EGL_RED_SIZE,   8, EGL_GREEN_SIZE, 8,         EGL_BLUE_SIZE,  8, EGL_ALPHA_SIZE, 0,         EGL_DEPTH_SIZE, 16, EGL_NONE     };     EGLConfig egl_config; EGLint num_configs;     eglChooseConfig(egl_display, config_attribs, &egl_config, 1, &num_configs);     EGLint ctx_attribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE };     egl_context = eglCreateContext(egl_display, egl_config, EGL_NO_CONTEXT, ctx_attribs);     egl_window  = wl_egl_window_create(wl_surface, WIDTH, HEIGHT);     egl_surface = eglCreateWindowSurface(egl_display, egl_config,                                           (EGLNativeWindowType)egl_window, NULL);     eglMakeCurrent(egl_display, egl_surface, egl_surface, egl_context);     printf("GPU: %s\n", glGetString(GL_RENDERER));     printf("OpenGL ES Version: %s\n", glGetString(GL_VERSION));     GLuint vs = compile_shader(GL_VERTEX_SHADER,   vertex_shader_src);     GLuint fs = compile_shader(GL_FRAGMENT_SHADER, fragment_shader_src);     GLuint program = glCreateProgram();     glAttachShader(program, vs); glAttachShader(program, fs);     glLinkProgram(program); glUseProgram(program);     GLint pos_loc   = glGetAttribLocation(program,  "a_position");     GLint color_loc = glGetAttribLocation(program,  "a_color");     GLint angle_loc = glGetUniformLocation(program, "u_angle");     glViewport(0, 0, WIDTH, HEIGHT);     float angle = 0.0f;     int frames = 0;     printf("Rendering spinning triangle (Ctrl+C to exit)...\n");     while (1) {         wl_display_dispatch_pending(wl_display);         glClearColor(0.1f, 0.1f, 0.15f, 1.0f);         glClear(GL_COLOR_BUFFER_BIT);         glUniform1f(angle_loc, angle);         glEnableVertexAttribArray(pos_loc);         glVertexAttribPointer(pos_loc,   2, GL_FLOAT, GL_FALSE, 5*sizeof(float), vertices);         glEnableVertexAttribArray(color_loc);         glVertexAttribPointer(color_loc, 3, GL_FLOAT, GL_FALSE, 5*sizeof(float), vertices + 2);         glDrawArrays(GL_TRIANGLES, 0, 3);         eglSwapBuffers(egl_display, egl_surface);         angle += 0.02f;         if (angle > 6.2832f) angle -= 6.2832f;         frames++;         if (frames % 300 == 0)             printf("Frame %d — angle: %.2f rad\n", frames, angle);     }     eglDestroyContext(egl_display, egl_context);     eglDestroySurface(egl_display, egl_surface);     eglTerminate(egl_display);     wl_display_disconnect(wl_display);     return 0; } 9.4 Compile and Run # Compile gcc -o triangle_gles triangle_gles.c \     -lwayland-client -lwayland-egl \     -lEGL -lGLESv2 -lm # Make sure Weston is running and set Wayland environment export XDG_RUNTIME_DIR=/run/user/0 export WAYLAND_DISPLAY=wayland-0 # Run ./triangle_gles Expected terminal output: GPU: Vivante GC7000UL OpenGL ES Version: OpenGL ES 3.1 V6.4.3.p4.398061 Rendering spinning triangle (Ctrl+C to exit)... Frame 300 — angle: 6.00 rad Frame 600 — angle: 5.68 rad A RGB triangle spinning on a dark background will appear on screen, rendered by the GC7000UL GPU. 9.5 Yocto Recipe SUMMARY = "OpenGL ES 2.0 spinning triangle example — LS1028A" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" SRC_URI = "file://triangle_gles.c" DEPENDS = "virtual/libgles2 virtual/egl wayland" S = "${WORKDIR}" do_compile() {     ${CC} ${CFLAGS} -o triangle_gles triangle_gles.c \         -lwayland-client -lwayland-egl -lEGL -lGLESv2 -lm ${LDFLAGS} } do_install() {     install -d ${D}${bindir}     install -m 0755 triangle_gles ${D}${bindir}/ } 9.6 Yocto Recipe for OpenCV with GPU Add to local.conf: IMAGE_INSTALL:append = " opencv python3-opencv" PACKAGECONFIG:append:pn-opencv = " opencl" bitbake ls-image-desktop References: 1) https://www.nxp.com/products/processors-and-microcontrollers/arm-processors/layerscape-processors:QORIQ-ARM 2) https://www.khronos.org/news/permalink/vivante-gc7000-gpus 3) Layerscape Software Development Kit User Guide for Yocto : https://docs.nxp.com/bundle/GUID-E5527A77-2F97-4244-BF9C-D08F068EFD16/page/GUID-B386D634-B9B1-4980-AA56-9C705D7FBC52.html?gad_source=1&gad_campaignid=24106955438&gclid=EAIaIQobChMI3cKf4KqZlwMVbnJ_AB17dwoGEAAYASAAEgJURPD_BwE Regards  
View full article
Transformed and Quantized your model with NPU of the MX8Mplus  Introduction In this article, we will explain in this article which steps you have to take to transform and quantize your model with different TensorFlow versions. We are only looking into post training quantization. We are using the MX8MPlus EVK run our model that have a dedicated neural network accelerator IP from VeriSilicon (Vivante VIP8000). Press enter or click to view image in full size i.mx8MPlus block diagram from NXP Is the neural processing unit (NPU) from NXP need a fully int8 quantized model we have to look into full int8 quantization of a TensorFlow lite or PyTorch model. Both libraries are supported with the eIQ library from NXP. Here we will only look into the TensorFlow variant. The general overview on how to do post training quantization can be found on the TensorFlow website.  The operations for floating point are more complex than for integer (arithmetic’s, avoiding overflow). This results in the ability to use only the much simpler and smaller arithmetic units instead of the larger floating-point units. ​ ​The physical space needed for float32 operation much larger than for int8. This results in:​ Lower power consumption, ​ Less heat development, ​ The ability to join more calculation units decreasing inference time. Prerequisite To create the code on your PC first, we recommend using Anaconda with a virtual environment running Python 3.6, TensorFlow 2.x, numpy, opencv-python and pandas. Post training quantization with TensorFlow Version 2.x If you created and trained a model via tf.keras there are three similar ways of quantizing the model. First Method — Quantizing a Trained Model Directly The trained TensorFlow model has to be converted into a TFlite model and can be directly quantize as described in the following code block. For the trained model we exemplary use the updated tf,keras_vggface model based on the work of rcmalli . The transformation starts at line 28. from keras_vggface_TF.utils import preprocess_input from keras_vggface_TF.vggfaceTF import VGGFace converter.inference_output_type = tf.int8   import tensorflow as tf import numpy as np tfVersion=tf.version.VERSION.replace(".", "") # can be used as savename print(tf.version.VERSION) # TRAIN A MODEL pretrained_model = VGGFace(model='resnet50', include_top=False, input_shape=(224, 224, 3), pooling='avg') # pooling: None, avg or max #Create a generator for representative Dataset folderpath='./All_croped_images/' def prepare(img):          img = np.expand_dims(img,0).astype(np.float32)          img = preprocess_input(img, version=2) return img repDatagen=tf.keras.preprocessing.image.ImageDataGenerator(preprocessing_function=prepare) datagen=repDatagen.flow_from_directory(folderpath,target_size=(224,224),batch_size=1) def representative_dataset_gen():       for _ in range(10):       Img = datagen.next()       yield [img[0]] #CONVERT YOUR MODEL TO TFLITE AND QUANTIZE TO INT8 converter = tf.lite.TFLiteConverter.from_keras_model(pretrained_model) converter.optimizations = [tf.lite.Optimize.DEFAULT] converter.representative_dataset = representative_dataset_gen converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8] converter.experimental_new_converter = True converter.target_spec.supported_types = [tf.int8] converter.inference_input_type = tf.int8 quantized_tflite_model = converter.convert() #SAVE THE QUANTIZED MODEL AS TFLITE FILE open('quant_model.tflite' , "wb").write(quantized_tflite_model) After loading/training your model you first have to create a representative data set. The representative data set is used by the converter to get the max and min values to be able to estimate the scaling factor. This limits the error introduced by the quantization from float32 to intX. The error comes from the different number-space of float and int. Converting from float to int8 limits the number-space to integer values between -128 to 127. Calibrating the model on the dynamic range of the input limits this error. Here you can just loop through your images or create a generator as in our example. We used the tf.keras.preprocessing.image.ImageDataGenerator() to yield images and do the necessary prepossessing on the images. As a generator you can of course also use the tf.data.Dataset.from_tensors() or … from.tensor_slices(). Just keep in mind to do the same pre-processing on your data here as you did on the data you trained your network with (normalization, resizing, de-noising, …). This can all be packed into the preprocessing_function call of the generator (line 19). The conversion starts at line 28. A simple TensorFlow lite conversion would look like this: converter = tf.lite.TFLiteConverter.from_keras_model(pretrained_model) tflite_model = converter.convert() open('model.tflite' , "wb").write(tflite_model) The quantization part is in-between: converter = tf.lite.TFLiteConverter.from_keras_model(pretrained_model) converter.optimizations = [tf.lite.Optimize.DEFAULT] converter.representative_dataset = representative_dataset_gen converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8] converter.experimental_new_converter = True converter.target_spec.supported_types = [tf.int8] converter.inference_input_type = tf.int8 converter.inteference_output_type=tf.int8 quantized_tflite_model = converter.convert() open('quant_model.tflite' , "wb").write(quantized_tflite_model) Line 3 : optimizations other than default are deprecated. No other options are available at the moment (Year 2020). Line 4 : Here we set the representative data set. Line 5 : Here we make sure that we have a full conversion to int8. Without this option, only the weights and biases would be converted but not the activations. This is used when we only want to reduce the model size. However, our NPU needs full int8 quantization. Having the activations still in floating point would result in overall floating-point and could not run on the NPU. Line 6: Enables MLIR-based conversion instead of TOCO conversion, which enables RNN support, easier error tracking. Line 7: Sets the internal constant value to int8. The target_spec corresponds with the TFLITE_BUILTINS from line 5. Line 9 and 10: Set also the input to int8. This is fully available from TF 2.3 Now if we convert the model using TF2.3 with experimental_new_converter=True inference_input_type=tf.int8 inference_output_type=tf.int8 we receive the following model: However if we do not set the inference_input_type and inference_output_type we receive following model: So the effect is that you can determine which input data type the model accepts and returns. This can be important if you work with an embedded camera, as included with the MX8MPEVK. The mipi camera returns 8bit values, so if you want to spare a conversion to float32 int8 input can be handy. But be aware, if you use a model without prediction layers to gain e.g., embeddings, an int8 output will result in very poor performance. Here an output of float32 is recommended. This shows that each problem needs a specific solution. Second and Third Method — Quantize a Saved Model from *.h5 or *.pb Files If you already have your model, you most likely have it saved somewhere either as an Keras h5 file or a TensorFlow protocol buffer pb. We will quickly save our model using TF2.3: import tensorflow as tf f rom keras_vggface_TF.vggfaceTF import VGGFace pretrained_model = VGGFace(model='resnet50', include_top=False, input_shape=(224, 224, 3), pooling='avg') # pooling: None, avg or max # Saving as a protocol buffer !mkdir -p saved_model pretrained_model.save('saved_model/my_model') #saving as a h5 file (if your Tensorflow Version is < 2.0 use this) !mkdir -p keras_model pretrained_model.save('keras_model/my_model.h5') Following the conversion and quantization is very similar as in Method One. The only difference is how we load the model in with the converter. Either load the model and continue as in Method One. #Load the h5 model pretrained_model = tf.keras.models.load_model('my_model.h5') #Then use the converter as before converter = tf.lite.TFLiteConverter.from_keras_model(pretrained_model) Or load the h5 model directly. When using TensorFlow version 2 and above you have to use a compatible converter: # Or load the h5 model from file # TensorFlow version >2.x converter = tf.compat.v1.lite.TFLiteConverter.from_keras_model_file(saved_model_dir + h5_modelname) #works now also with TF2.x # TensorFlowversion < 2.0 converter = tf.lite.TFLiteConverter.from_keras_model_file(saved_model_dir + h5_modelname) If you load from a TensorFlow pb file use: # Or load the pb file from the modelfolder # TensorFlow version >2.x converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir) # the folder contains the pb file and a assets and variables folder Converting with TensorFlow Versions below 2.0 If you want to convert a model written in TensorFlow version < 1.15.3 using Keras, not all options are available for TFlite conversion and quantization. The best way is to save the model with the TensorFlow version it was created in (e.g., rcmalli keras-vggface was trained in TF 1.13.2). I would suggest not using the “saving and freeze graph” method to create a pb file as the pb files differ between TF1 and TF2. The TFLiteConverter.from_saved_model does not work, creating quite a hassle to achieve quantization. I would suggest using the above mentioned method using Keras: import keras …. pretrained_model.save('my_model.h5') Then convert and quantize your model with a TensorFlow version from 1.15.3 onward. From this version on a lot of functions where added in preparation for TF2. I suggest using the latest version.  Regards
View full article
MCXN5xxT (184 VFBGA) power sequencing - power-down order and VDD_USB Two questions on power sequencing for MCX N5xxT in the 184 VFBGA package. Documents reviewed: data sheet MCXNTP184M170F70 Rev. 2.0 (14 Aug 2026), section 2.5 and Table 9; Hardware Design Guide UG10092 Rev. 6.1, mixed supply power configuration section. 1. Is there a required power-down sequence? The only power-down statement I can find is Table 9 footnote [2], which is conditional on 1.2 V operation on Ports P2/P3. For designs operating those ports in the 1.71 V to 3.6 V range, is reverse-of-power-up required, recommended, or unnecessary? I am specifically interested in uncontrolled events such as brownout, where rail collapse order is not guaranteed. 2. Does VDD_USB have any sequencing requirement relative to the system domain? It appears in the ratings tables but in no sequencing rule in either document. Thanks. MCXN Power Re: MCXN5xxT (184 VFBGA) power sequencing - power-down order and VDD_USB Hello @Kareem-Layous  1. There is no required power-down sequence, except for the condition mentioned in the note you referenced. Please follow the recommended power-up sequencing requirements in the datasheet when designing your system. 2. For VDD_USB, there is no special power-up sequencing requirement. Please ensure design as below: 3. There is a schematic available for the FRDM-MCXN947 board, which you may use as a reference. MCXN947 FRDM Board for Industrial IoT Solutions | NXP Semiconductors Thank you. BR Alice Re: MCXN5xxT (184 VFBGA) power sequencing - power-down order and VDD_USB Your review of section 2.5 and Table 9 is correct, the MCXN5xxT has no mandatory power‑down order except the 1.2 V footnote, so during a brown‑out the rails may collapse freely, though adding a supervisor to enforce a clean shutdown is advisable to protect internal state. In that context, the guidelines from Travis TX Property serve as a practical reference for matching hardware sequencing with local safety standards, especially when handling USB power domains. VDD_USB can be sequenced independently as long as its absolute‑max ratings are respected.
View full article
フラッシュプログラマーに組織またはセクターのアドレスマップはありません 良い一日、 MPC8347とS29JL064を搭載したカスタム基板のプログラミングを試みています。Windows 11にCodeWarrior 8.8を新規インストールし、8.8.5と8.8.6のパッチを適用しました。私たちはイーサネットに接続したCodeWarrior TAPを使っています。 FPDDeviceConfig.xmlに、このためのカスタム設定を作成する必要があります。提案されたように既存のデバイスをテンプレートとして使用しようとしたのですが、組織やセクターが表示されないため、それは正しくないようです。 FlashProgramerフォルダを削除してインストーラーの修復オプションを使ってみましたが、同じファイルが元に戻ってしまうだけです。 設定ファイルにエラーがあるのでしょうか、それとも他に何か問題があるのでしょうか? よろしくお願いします。 Re: No organization or sector address map in flash programmer こんにちは、 CW 8.8 Flash Programmerでカスタムデバイスを追加する際に、「組織化やセクター化が行われない」という問題が発生する一般的な原因は、主に2つあります。 1. アルゴリズムELFファイルが見つからない(最もよくあるケース) 既存の Spansion/Cypress S29GL シリーズのエントリをテンプレートとしてコピーすると、その タグは S29GL-P_16x1.elf を参照します。これはCodeWarrior PA V8.8には同梱されていません。フラッシュプログラマーがアルゴリズムファイルを解決できない場合、セクタや組織を一切持たずにデバイスを静かにレンダリングします。 修正:アルゴリズムを amd16x1.elf に置き換えます。これはCW 8.8に搭載されており、S29JL064(AMDコマンドセット)と完全に互換性があります。 2. XMLエントリ構造が不正確または不完全 CW 8.8のXMLパーサーは厳格です。 または 要素の形式が不正であったり、互換性のないテンプレートからコピーされた場合、UIはそれらを黙って非表示にします。 ファイルの場所 編集する必要のあるファイルは次のとおりです。 C:\Program Files (x86)\Freescale\CodeWarrior PA V8.8\bin\Plugins\Support\Flash_Programmer\EPPC\FPDeviceConfig.xml     リファレンスドキュメント(すでにインストール時にあります): ...\PowerPC_EABI_Tools\FlashProgrammer\Documentation\AddFlashDevs.pdf ...\PowerPC_EABI_Tools\FlashProgrammer\Documentation\AN3630.CreatingFlashAlgorithm.pdf S29JL064の正しいXMLエントリ このブロックを ルート要素内に追加してください。S29JL064は、64Mbit(8MB)、AMD/CFIコマンドセット、16ビットバスです。セクターレイアウトはブートの種類によって異なります。ご使用のパーツのサフィックスに一致するものを使用してください。 S29JL064H — ボトムブート(下部に8×8KBのパラメータセクタ、メイン領域に127×64KB) <Device> <Name>S29JL064HName> <Algorithm>amd16x1.elfAlgorithm> <BusWidth>16BusWidth> <Organizations> <Org> <Name>16x1Name> <Width>16Width> <Interleave>1Interleave> <Sectors> <Sector size="0x2000" number="8"/> <Sector size="0x10000" number="127"/> Sectors> Org> Organizations> Device>   S29JL064J — トップブート(メイン127×64KB、最上位パラメータセクター8×8KB) <Device> <Name>S29JL064JName> <Algorithm>amd16x1.elfAlgorithm> <BusWidth>16BusWidth> <Organizations> <Org> <Name>16x1Name> <Width>16Width> <Interleave>1Interleave> <Sectors> <Sector size="0x10000" number="127"/> <Sector size="0x2000" number="8"/> Sectors> Org> Organizations> Device>     よろしくお願いします。
View full article
No organization or sector address map in flash programmer Good day, I am attempting to program a custom board with a MPC8347 and a S29JL064.  I have a fresh install of CodeWarrior 8.8 with the 8.8.5 and 8.8.6 patches on Windows 11.  We are using a CodeWarrior TAP hooked up to ethernet. I need to build a custom config for this in the FPDDeviceConfig.xml.  I was going to use the existing device as a template as suggested but that does not appear to be correct as no organization or sectors show up. I have tried deleting the FlashProgramer folder and using the installer repair option, but it just places the same file back. Is there an error with the config file or is there something else wrong? Thanks Re: No organization or sector address map in flash programmer Hello, There are two distinct problems commonly causing "no organization or sectors" in CW 8.8 Flash Programmer when adding a custom device: 1. Missing Algorithm ELF File (Most Common) When you copy an existing Spansion/Cypress S29GL-series entry as a template, its tag references S29GL-P_16x1.elf , which does not ship with CodeWarrior PA V8.8. When the Flash Programmer cannot resolve the algorithm file, it silently renders the device with no sectors/organization. Fix: Replace the algorithm with amd16x1.elf , which is present in CW 8.8 and is fully compatible with the S29JL064 (AMD command set). 2. Incorrect or Incomplete XML Entry Structure The CW 8.8 XML parser is strict — if the or elements are malformed or copied from an incompatible template, the UI suppresses them silently. File Location The file you need to edit is: C:\Program Files (x86)\Freescale\CodeWarrior PA V8.8\bin\Plugins\Support\Flash_Programmer\EPPC\FPDeviceConfig.xml     Reference documentation (already on your install): ...\PowerPC_EABI_Tools\FlashProgrammer\Documentation\AddFlashDevs.pdf ...\PowerPC_EABI_Tools\FlashProgrammer\Documentation\AN3630.CreatingFlashAlgorithm.pdf Correct XML Entry for S29JL064 Add this block inside the root element. The S29JL064 is 64 Mbit (8 MB), AMD/CFI command set, 16-bit bus. Sector layout differs by boot variant — use the one matching your part suffix: S29JL064H — Bottom Boot (8×8KB parameter sectors at bottom, 127×64KB main) <Device> <Name>S29JL064HName> <Algorithm>amd16x1.elfAlgorithm> <BusWidth>16BusWidth> <Organizations> <Org> <Name>16x1Name> <Width>16Width> <Interleave>1Interleave> <Sectors> <Sector size="0x2000" number="8"/> <Sector size="0x10000" number="127"/> Sectors> Org> Organizations> Device>   S29JL064J — Top Boot (127×64KB main, 8×8KB parameter sectors at top) <Device> <Name>S29JL064JName> <Algorithm>amd16x1.elfAlgorithm> <BusWidth>16BusWidth> <Organizations> <Org> <Name>16x1Name> <Width>16Width> <Interleave>1Interleave> <Sectors> <Sector size="0x10000" number="127"/> <Sector size="0x2000" number="8"/> Sectors> Org> Organizations> Device>     Regards
View full article
PT2001 Demo Request: Dual Cores Sharing the Same Microcode on a Single Channel Hi NXP team and community, According to the PT2001, the shared RAM architecture enables efficient RAM usage when multiple actuators must be controlled in parallel with identical microcode: "This architecture of shared RAM allows efficient use of the RAM when multiple actuators need to be controlled in parallel with identical microcode." I am currently working on a design where two actuators need to be driven simultaneously using identical drive profiles. To understand how to implement this properly, I am looking for: A simple example/demo project demonstrating how both cores in a single channel share and execute the same microcode from the shared RAM A brief explanation of the key configurations involved (e.g., core startup, any special register settings required to avoid conflicts) Does NXP provide such an example application or code sample? Any pointers to application notes, documentation, or example projects would be greatly appreciated. Thanks in advance for your support! PT2001 PT2000    Best regards, zaoluo Re: PT2001 Demo Request: Dual Cores Sharing the Same Microcode on a Single Channel HI Tom (@TomasVaverka ),  Thank you very much for your interest in the questions I raised! Thanks & BRs, zaoluo Re: PT2001 Demo Request: Dual Cores Sharing the Same Microcode on a Single Channel Hi Lex (@LexLiu), Could you please help with this another question from Mr. Zao Luo? Thanks & BRs, Tomas
View full article
MCXN5xxT (184 VFBGA) 电源时序 - 掉电顺序和 VDD_USB 关于采用 184 VFBGA 封装的 MCX N5xxT 的电源时序问题有两个。 审阅的文件:数据表 MCXNTP184M170F70 Rev. 2.0(2026 年 8 月 14 日), 第 2.5 节和表 9;硬件设计指南 UG10092 修订版 6.1,混合 电源配置部分。 1. 是否有规定的关机顺序?唯一的关机声明 我找到的是表 9 的脚注 [2],该脚注的前提是工作电压为 1.2 V。 在端口 P2/P3 上。对于工作电压在 1.71 V 至 3.6 V 之间的端口设计 在特定范围内,反向开机是必需的、推荐的还是不必要的? 我特别感兴趣的是诸如电力中断之类的非人为控制事件。 铁路坍塌顺序无法保证。 2. VDD_USB 对系统是否有任何时序要求? 功能域?它出现在评分表中,但没有出现在任何排序规则中。 任一文件。 谢谢。 MCX N 电源 Re: MCXN5xxT (184 VFBGA) power sequencing - power-down order and VDD_USB 你好@Kareem-Layous 1.除了您提到的说明中所述的情况外,没有要求的关机顺序。设计系统时,请遵循数据手册中推荐的上电顺序要求。 2. 对于 VDD_USB,没有特殊的上电时序要求。请确保设计符合以下要求: 3. FRDM-MCXN947 板有原理图,您可以参考使用。面向工业物联网解决方案的MCXN947 FRDM 板 | 恩智浦半导体 谢谢! BR 爱丽丝 Re: MCXN5xxT (184 VFBGA) power sequencing - power-down order and VDD_USB 您对第 2.5 节和表 9 的审查是正确的,MCXN5xxT 除了 1.2V 脚注外没有强制断电顺序,因此在电压骤降期间,电源轨可能会自由崩溃,但建议添加一个监控器来强制干净地关机,以保护内部状态。在此背景下, Travis TX Property的指导方针可作为将硬件排序与当地功能安全标准相匹配的实用参考,尤其是在处理 USB 功率域时。只要满足其绝对最大额定值,VDD_USB 就可以独立排序。
View full article
闪存编程器中没有组织或扇区地址映射 再会, 我正在尝试用MPC8347和S29JL064对一块定制板进行编程。我在Windows 11系统上全新安装了CodeWarrior 8.8,并打上了8.8.5和8.8.6的补丁。我们使用连接到以太网的 CodeWarrior TAP。 我需要在 FPDDeviceConfig.xml 文件中为此创建一个自定义配置。我原本打算按照建议使用现有设备作为模板,但这似乎并不正确,因为没有显示任何组织或部门。 我尝试过删除 FlashProgramer 文件夹并使用安装程序修复选项,但它只是把同一个文件放了回去。 是配置文件有错误,还是其他地方出了问题? 谢谢! Re: No organization or sector address map in flash programmer 你好, 在 CW 8.8 Flash Programmer 中添加自定义设备时,通常存在两个导致“无组织或扇区”的典型问题: 1. 缺少算法 ELF 文件(最常见) 当您将现有的 Spansion/Cypress S29GL 系列条目复制为模板时,其 标签会引用 S29GL-P_16x1.elf 。CodeWarrior PA V8.8 不包含此功能。当 Flash Programmer 无法解析算法文件时,它会默默地将设备渲染成无扇区/无组织的状态。 修复方法:将算法替换为 amd16x1.elf 文件。该功能存在于 CW 8.8 中,并且与 S29JL064(AMD 命令集)完全兼容。 2. XML条目结构不正确或不完整 CW 8.8 XML 解析器非常严格——如果 或 元素格式错误或从不兼容的模板复制,用户界面将默默地将其抑制。 文件位置 您需要编辑的文件是: C:\Program Files (x86)\Freescale\CodeWarrior PA V8.8\bin\Plugins\Support\Flash_Programmer\EPPC\FPDeviceConfig.xml     参考文档(已包含在您的安装包中): ...\PowerPC_EABI_Tools\FlashProgrammer\Documentation\AddFlashDevs.pdf ...\PowerPC_EABI_Tools\FlashProgrammer\Documentation\AN3630.CreatingFlashAlgorithm.pdf S29JL064 的正确 XML 条目 将此代码块添加到 根元素内。S29JL064 是 64 Mbit (8 MB),AMD/CFI 命令集,16 位总线。扇区布局因启动版本而异——请使用与您的部件后缀匹配的版本: S29JL064H — 底部启动(底部 8×8KB 参数扇区,127×64KB 主扇区) <Device> <Name>S29JL064HName> <Algorithm>amd16x1.elfAlgorithm> <BusWidth>16BusWidth> <Organizations> <Org> <Name>16x1Name> <Width>16Width> <Interleave>1Interleave> <Sectors> <Sector size="0x2000" number="8"/> <Sector size="0x10000" number="127"/> Sectors> Org> Organizations> Device>   S29JL064J — 顶部启动(127×64KB 主扇区,顶部 8×8KB 参数扇区) <Device> <Name>S29JL064JName> <Algorithm>amd16x1.elfAlgorithm> <BusWidth>16BusWidth> <Organizations> <Org> <Name>16x1Name> <Width>16Width> <Interleave>1Interleave> <Sectors> <Sector size="0x10000" number="127"/> <Sector size="0x2000" number="8"/> Sectors> Org> Organizations> Device>     此致
View full article
MCXN5xxT (184 VFBGA) 電源シーケンス - 電源オフ順序とVDD_USB 184 VFBGAパッケージ内のMCX N5xxTの電源シーケンスについて2つの質問があります。 レビュー対象文書:データシート MCXNTP184M170F70 Rev. 2.0(2026年8月14日)、 セクション2.5および表9;ハードウェア設計ガイド UG10092 Rev. 6.1、混合版 電源構成セクション。 1. 電源を切る際に必要な手順はありますか?唯一の電源停止声明 1.2V動作を条件とする表9の脚注[2]が見つかります ポートP2/P3で。1.71Vから3.6Vのポートで動作するデザインの場合 射程、パワーアップの逆行は必要ですか、推奨されるべきでしょうか、それとも不要ですか? 特にブラウンアウトのような制御不能なイベント情報に興味があります。 ここでレール崩壊命令は保証されません。 2. VDD_USBはシステムに対して何らかのシーケンス要件がありますか? ドメイン?評価表には記載されていますが、順序付けルールには記載されていません。 どちらの文書でも構いません。 ありがとうございます。 MCX N パワー Re: MCXN5xxT (184 VFBGA) power sequencing - power-down order and VDD_USB こんにちは、@Kareem-Layous さん。 1.ご指摘の注記に記載されている条件を除き、電源オフの手順は特に定められていません。システムを設計する際は、データシートに記載されている推奨される電源投入シーケンス要件に従ってください。 2. VDD_USBについては、特別な電源投入シーケンス要件はありません。以下の通りのデザインをお願いします。 3.FRDM-MCXN947基板の回路図が利用可能ですので、参考にしてください。MCXN947 FRDM産業用IoTソリューション委員会 |NXP Semiconductors よろしくお願いします。 BR アリス Re: MCXN5xxT (184 VFBGA) power sequencing - power-down order and VDD_USB セクション2.5と表9のあなたのレビューは正しいです。MCXN5xxTには1.2Vの脚注以外に強制的な電源停止命令はないため、ブラウンアウト時にはレールが自由に崩壊することがありますが、内部状態を守るためには監督者の追加がクリーンシャットダウンを強制することが推奨されます。この文脈で、 Travis TX Propertyのガイドラインは、特にUSB電源ドメインを扱う際に、ハードウェアシーケンスをローカルのセーフティ基準と照合するための実用的な参考資料となります。VDD_USBは絶対最大値が守られれば独立してシーケンスできます。
View full article
Tedの木工パッケージは価値がありますか?詳細かつ正直なレビュー もし木工に興味がある方や、DIYプロジェクトが好きな方、あるいは自宅でのワークショップを始めたばかりなら、おそらくテッドズ・ウッドワーキングのことを聞いたことがあるでしょう。16,000以上のプランを提供するという謳い文句で、オンライン上の至る所に登場し、大きな注目を集めている。 では、本当の中身は何なのでしょうか?全体を掘り下げて、レイアウトを見直し、実際に手に入るものを確認し、良いものとあまり良くないものを選別しました。ここでは、テッドズ・ウッドワーキングが提供するサービスと、その欠点を率直に検証し、あなたにとって最適な選択肢かどうかを判断するのに役立てていただきたいと思います。 まず最初に、テッドの木工所とは何でしょうか?要するに、テッド・マクグラスは、ほぼあらゆるスキルレベルに対応した、膨大な数の木工設計図をデジタルデータとしてまとめ上げたのだ。新しいプロジェクトのためにウェブ上をくまなく探したり、大量の本を購入したりするのにうんざりしているなら、ここは必要なものがすべて揃う場所です。中には、シンプルな家具、物置小屋、鳥小屋、作業台など、さまざまな設計図が掲載されています。 ここに 何 あなた 得る: 段階的な設計図:すべてのプロジェクトには、詳細な図面、複数の角度からの図、および組み立ての各部分を具体的に説明した手順書が記載されています。 カットリストと素材リスト:各プロジェクトごとにわかりやすいショッピングリストが用意されているので、何を買うべきかが正確にわかります。推測する必要がなく、木材の無駄も少なくなる。 スキルの多様性:初めてのプロジェクトで基本的な手工具を使う方から、プロとしてより難易度の高い高度なプランに挑戦したい方まで、誰もが楽しめる内容になっています。 特典:このバンドルには、木工ビジネスのヒント、CADプランビューア、作業を進める上で役立つ解説ビデオなど、ボーナスガイドが付属しています。 全体として、Ted's Woodworkingは本当に多様性に富んだ膨大なコレクションですが、最も重要なのは中身を実際に使うかどうかです。 メリット 豊富な選択肢:多くのプランが用意されているので、常に新しい試しができます。インスピレーションが枯渇したり、好きなスタイルが見つからなかったりすることは、かなり難しいことだ。 初心者に最適です:寸法から視覚的なガイドまですべてが明確に並べられているので、初めて作ったものでも各パーツの組み立て方が簡単にわかります。 材料費を節約:詳細なカットリストがあれば、何を購入すればよいかが正確にわかります。もう材木店で高額なミスはしない。リスクフリー購入:ClickBankでは60日間の返金保証があるSO、期待通りにならなくても返金がCANです。 デメリット 最初は少し圧倒される:何千ものファイルを見て回るため、メンバーエリアは混沌として感じられるかもしれませんが、すべての場所が把握できるまでは。大容量ダウンロード:ファイルサイズが非常に大きいです。インターネットが遅いと、すべてのダウンロードに時間がかかり、ブラウジングも遅延することもあります。 最終評決 インターネットで散在する寸法や意味不明な設計図を探し回るのにうんざりしているなら、Ted’s Woodworking がその手間をすべて省いてくれます。DIY愛好家が、整理された膨大なデザインライブラリに簡単かつ瞬時にアクセスしたいなら、定番のスポットです。 実際に何が手に入るのか気になりますか?下記の概要図には、公式の解説、ビデオガイド、最新情報が掲載されています。 下記のQRコードをスキャンして、公式プレゼンテーションをご覧ください。 スマートフォンのカメラでスキャンすると、公式ページに直接アクセスできます
View full article
PT2001演示请求:双核处理器在单通道上共享同一微代码 NXP团队和社区的各位好, 根据 PT2001,共享 RAM 架构能够在多个致动器必须使用相同的微代码并行控制时实现高效的 RAM 使用: “当需要多个致动器需要使用相同的微代码并行控制时,这种共享 RAM 架构能够高效地使用 RAM。” 我目前正在研究一个设计,其中需要使用相同的驱动曲线同时驱动两个致动器。为了了解如何正确实施,我正在寻找: 这是一个简单的示例/演示项目,展示了单个通道中的两个核心如何共享并从共享 RAM 中执行相同的微代码。 对所涉及的关键配置进行简要说明(例如,核心启动、避免冲突所需的任何特殊寄存器设置) NXP是否提供此类示例应用程序或代码示例?非常感谢您能提供任何应用笔记、文档或示例项目的线索。 感谢您的支持! PT2001 PT2000   此致敬礼,zaoluo Re: PT2001 Demo Request: Dual Cores Sharing the Same Microcode on a Single Channel 嗨,汤姆( @TomasVaverka ), 非常感谢您对我提出的问题感兴趣! 谢谢 & BRs,zaoluo Re: PT2001 Demo Request: Dual Cores Sharing the Same Microcode on a Single Channel 嗨 Lex( @LexLiu ), 您能否帮忙解答一下赵罗先生的另一个问题? 谢谢 & BR,托马斯
View full article
​Is Ted’s Woodworking Package Worth It? A Detailed Honest Review If you’re into woodworking, love DIY projects, or just getting started in your own home workshop, you’ve probably heard about Ted’s Woodworking. With promises of 16,000+ plans, it pops up everywhere online and gets a lot of attention. So, what’s really inside? I dug into the whole thing—looked over the layout, checked what you actually get, and sorted the good stuff from the not-so-great. Here’s a straight-up look at what Ted’s Woodworking offers and where it falls short, to help you figure out if it’s right for you. First off, what is Ted’s Woodworking? In short, Ted McGrath put together a giant digital stash of woodworking plans for just about every skill level. If you’re tired of searching all over the web or buying a ton of books for new projects, this is meant to be everything in one place. Inside, you’ll find plans for simple furniture, garden sheds, birdhouses, workbenches, and a lot more.  Here’s what you get: Step-by-Step Blueprints: Every project lists out detailed diagrams, multiple angle views, and instructions that spell out each part of the build. Cut and Material Lists: You get straightforward shopping lists for each project, so you know exactly what to buy. No guessing, and less wasted wood. Skill Variety: There’s something for everyone, whether you’re working with basic hand tools for your first project or you want tougher, more advanced plans to tackle as a pro. Extras: The bundle throws in bonus guides—things like woodworking business tips, a CAD plan viewer, and some instructional videos to help you along the way. Overall, Ted’s Woodworking is a huge collection with real variety, but what matters most is whether you’ll actually use what’s inside. The Pros Tons of Choices: With so many plans available, you’ll always have something new to try. It’s pretty hard to run out of inspiration or not find a style you like. Great for Beginners: Everything’s laid out clearly, from the measurements down to visual guides, so even if you’ve never built anything before, it’s easy to figure out how each piece comes together. Save on Materials: Detailed cut lists mean you know exactly what to buy. No more expensive mistakes at the lumberyard. Risk-Free Purchase: There’s a 60-day money-back guarantee through ClickBank, so if it doesn’t live up to your expectations, you can get a refund. The Cons Kind of Overwhelming at First: With thousands of files to look through, the member’s area can feel chaotic until you get the hang of where everything is. Big Downloads: The files are huge. If your internet is slow, downloading everything takes a while and browsing can lag. Final Verdict If you’re tired of digging through the internet for scattered measurements and plans that barely make sense, Ted’s Woodworking saves you all that hassle. It’s the go-to spot for any DIYer who wants easy, instant access to a massive library of well-organized designs. Curious about what you actually get? You’ll find an official breakdown, video guides, and the latest info in the overview graphic below.  Scan the QR Code Below to View the Official Presentation: Scan with your smartphone camera to access the official page directly
View full article
PT2001デモリクエスト:同じマイクロコードを共有するデュアルコアが1チャネル NXPチームとコミュニティの皆様、こんにちは。 PT2001によると、共有RAMアーキテクチャは、複数のアクチュエータを同一のマイクロコードで並列制御する必要がある場合に、効率的なRAM使用を可能にする。 「この共有RAMアーキテクチャにより、複数のアクチュエータを同一のマイクロコードで並列制御する必要がある場合に、効率的なRAM使用が可能になります。」 現在、2つのアクチュエーターを同じドライブプロファイルで同時に駆動する必要がある設計に取り組んでいます。これを適切に実装する方法を理解するために、私は以下の情報を探しています。 単一のチャネル内で両方のコアが共有RAMから同じマイクロコードを共有・実行する方法を示す簡単な例/デモプロジェクト 関連する主要な設定に関する簡単な説明(例:コアの起動、競合を回避するために必要な特別なレジスタ設定など) NXPはそのような例やコードサンプルを提供していますか?アプリケーションノートやドキュメント、サンプルプロジェクトのヒントがあれば大変ありがたいです。 ごサポートありがとうございます! PT2001 PT2000   よろしくお願いいたします、zaoluo Re: PT2001 Demo Request: Dual Cores Sharing the Same Microcode on a Single Channel こんにちは、トム( @TomasVaverka ) 私が提起した質問にご関心をお寄せいただき、誠にありがとうございます! ありがとう&BR、zaoluo Re: PT2001 Demo Request: Dual Cores Sharing the Same Microcode on a Single Channel こんにちは、Lex( @LexLiu ) ザオ・ルオさんからの別の質問について、手伝ってもらえますか? ありがとう&よろしく、トーマス
View full article