Multi Source Translation Content

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

Multi Source Translation Content

讨论

排序依据:
问答:当前 i.MX6 BSP 是否支持 eMMC 4.5? <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 问:i.MX 6Dual/6Quad 应用处理器参考手册 Rev. D 说 i.MX6 支持 eMMC 4.5。但是当前的 BSP(L3.0.35_12.08.00)是否支持 eMMC 4.5?如果没有,飞思卡尔的发布计划中是否有它? 答:i.MX 6Dual/6Quad RM和数据表声明 uSDHC 模块“完全符合多媒体卡系统规范 v4.2/4.3/4.4/4.41 中定义的 MMC 命令/响应集和物理层,包括高容量(> 2 GB)HC MMC 卡。”因此,如果您的 eMMC4.5 卡向后兼容 eMMC4.4,你可以在eMMC4.4中使用它模式启用eMMC4.4i.MX6 平台上的功能和性能。 例如,当前的 i.MX6 Linux BSP (L3.0.35_4.1.0)已添加代码以与 eMMC4.5 卡接口,从而作为 eMMC4.4 运行卡片。请参阅 drivers/mmc/core/mmc.c 中的以下代码: 卡->ext_csd.rev = ext_csd[EXT_CSD_REV]; /* 解决方法:支持 emmc 4.5 卡在 emmc 4.4 模式下工作 */ 如果(card->ext_csd.rev>6){ printk(KERN_ERR "%s: 无法识别的 EXT_CSD 修订版本 %d\n", mmc_hostname(卡->主机),卡->ext_csd.rev);                 err = -EINVAL; 出去;         }
查看全文
i.MX RTでのemWinアプリケーションのカスタマイズ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> はじめに 要件 ユーティリティの使用量 インテグレーション 機能デモ     1. イントロダクション   このドキュメントでは、MCUXpresso SDK に含まれている emwin_temperature_control デモと emWin ユーティリティを参照として使用して、emWin アプリケーションを作成する方法について説明します。この例のカスタム アプリケーションは Tic-Tac-Toe ゲームで、emWin GUI をユーザー入力として使用し、emWin で生成されたコードにゲーム実装の適切なロジックを追加し、MIMXRT1060-EVK ボード上で実行します。 2. 応募資格   このデモのデモには、次の資料が必要です。 RK043FN02H-CT 4.3インチLCDパネル を搭載した MIMXRT1060-EVKボード 。 MCUXpresso IDE v11.0. EMWinミドルウェアを含むEVK-MIMXRT1060用のMCUXpresso SDK v2.6.2。 Segger emWin 5.38b ライブラリとユーティリティ。 emWin 5.30 のドキュメント。 3. ユーティリティの使用   このデモでは、GUIBuilderユーティリティのみを使用し、このユーティリティから、ウィンドウ、テキスト、ボタン、画像の4つのウィジェット要素のみがアプリケーションに実装されます。 最初に、1 つのウィンドウが追加され、その xSize と ySize が画面の解像度と一致する 480 x 272 に構成されます。 このウィンドウの上には、他のすべての要素が配置されます。各ウィジェットには、右クリックメニューで追加/変更できるプロパティがあります。 使用されているウィジェット要素の総数は次のとおりです。 3 つのテキスト ウィジェット (1 つはタイトル用、もう 1 つは次のターンを示す)、3 つ目は空のウィジェット (ゲームの勝者を示す (または引き分けを示す) を示すために動的に更新されるため)。 BPMファイルがロードされ、定数配列に変換される2つの画像ウィジェットには、ゲームの現在のターンを示すクロス/サークルアイコンがあります。 10個のボタンウィジェット(1つはゲームを再初期化するためのウィジェット、残りの9つはゲームに使用される3x3配列の構築用)。 完全なアプリケーション・レイアウトを次の図に示します。 次に、「File」->「Save」メニューをクリックし、「WindowDLG.c」という名前のファイルをクリックします。ファイルは、GUIBuilderユーティリティが配置されているのと同じフォルダに作成する必要があります。「WindowDLG.c」このデモのファイル、および十字/円アイコンのBMPファイルは、このドキュメントの添付ファイルにあります。さらに、「File->Open」をクリックして、ダウンロードした「WindowDLG.c」を開くこともできますファイルを作成し、自分で変更します。 4. 統合   1) まず、MCUXpresso SDK for MIMXRT1060-EVK ボードに含まれる "emwin_temperature_control" デモをインポートする必要があります。 SDK サンプルのインポート -> evkmimxrt1060 -> emwin_examples -> emwin_temperature_control 2) デモをインポートした直後に、便宜上、プロジェクトの名前と "source->emwin_temperature_control.c" を "evkmimxrt1060_emwin_tictactoe" と "emwin_tictactoe.c" に変更しました (右クリックで -> の名前を変更)。 これらの変更を適用すると、デモをエラーなしでコンパイルおよびダウンロードでき、問題なく実行できるはずです。 3)次に、「WindowDLG.c」を開きますGUIBuilderによって生成されたファイルを作成し、「Defines」セクションを見つけます。それらすべてをコピーし、「emwin_tictactoe.c」にすでに含まれているウィジェットIDの定義を置き換えますファイル。 4) 「emwin_tictactoe.c」の「Some dimension defines」セクションと「Colors」セクションも削除します。ファイル、および「Structures」、「Static data」の内容。同じファイルから、 "_aGradient"、 "_GetSelectedRoom"、 "_SetFanButtonState"、 "_cbButton"、 "_cbButtonFan"、 "_cbKnob"、 "_DrawKnob"、 "_OnRelease"のセクションも削除します。 5) 「WindowDLG.c」から「_acImage_0」配列と「_acImage_1」配列を追加します。ファイルを "emwin_tictactoe.c" の "Static data" セクションに格納します。ファイル。 6) 「emwin_tictactoe.c」の「_aDialogCreate」配列のすべての要素を置き換えます。「WindowDLG.c」のものを使用ファイル。 7) 関数「_GetImageById」を追加し、「WindowDLG.c」ファイルの「_cbDialog」関数を「emwin_tictactoe.c」ファイルに置き換えます。 😎 ここまでは、アプリケーションは問題なくコンパイルおよびダウンロードする必要がありますが、試合を実行する機能は含まれていません。ダウンロードしたレイアウトを次の画像に示します。 9)さて、ゲーム自体の実装のために、次の変数が「emwin_tictactoe.c」の「静的データ」セクションに追加されますファイル。 「player_turn」は、移動中の現在のプレーヤー(「X」または「O」)を示します。 「slots_free」は、空きスロットがいくつ残っているかを知るためのカウンターです。 「winner_player」は、誰が勝者であるか、またはゲームが引き分けであるかどうかを示します。 「slot_status」配列は、各スロットの現在のステータスを保存するために担当します U8 i, player_turn=0, slots_free=9, winner_player=0; const U32 player_colors[] = {GUI_RED, GUI_BLUE}; 列挙型 {SLOT_FREE, SLOT_X, SLOT_O, SLOT_LOCK}; U8 slot_status[] = {SLOT_FREE, SLOT_FREE, SLOT_FREE, SLOT_FREE、SLOT_FREE、SLOT_FREE、 SLOT_FREE、SLOT_FREE、SLOT_FREE}; 10) また、すべての可能なスロットの組み合わせをチェックして、勝者を定義するか、試合が引き分けかを定義する機能も実装されました。それは機能「CheckWinner」であり、「emwin_tictactoe.c」でckechされる可能性があります添付ファイルのファイルには、Tic-Tac-Toe デモを実行するために必要なすべての変更がすでに含まれています。また、その関数プロトタイプを「emwin_tictactoe.c」の「プロトタイプ」セクションに追加する必要がありますファイル。 11) 基本的に、ほとんどすべてのゲームの仕組みは、9x9 Buttons ウィジェットの "WM_NOTIFICATION_CLICKED" イベントによって定義されるため、"_cbDialog" 関数内に実装されます。以下に "ID_BUTTON_0" のコードを示します。赤い ハイライト は、各ボタンイベントで何が変わるかを示しています。 case ID_BUTTON_0: // 'Button' から送信される通知 スイッチ(NCode) { ケースWM_NOTIFICATION_CLICKED: USER START(オプションで通知メッセージに反応するコードを挿入) if (slot_status[0] == SLOT_FREE){ hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0); BUTTON_SetTextColor(hItem, 0, player_colors[player_turn]); if (!player_turn){ BUTTON_SetText(hItem, "X"); slot_status[0] = SLOT_X; } それ以外の場合{ BUTTON_SetText(hItem, "O"); slot_status[0] = SLOT_O; } player_turn ^= 1; slots_free--; } ユーザーエンド 壊す; 12)再起動ボタンの場合、実装されたロジックは、すべてのスロットステータスを「空き」に戻したり、すべてのスロットの内容を消去したり、空きスロットのカウンターを9に再起動したりする役割を果たします。 13) すべてのGUIウィジェットイベントをポーリングした後、「CheckWinner」関数が呼び出され、勝者が定義され、元々空だった「Text_Winner」ウィジェット(画面の左上隅)に示されます。 14) また、移動中のプレーヤーが誰であるかに応じて、Cross/Circle アイコンの周囲に緑色の長方形を直接描画する機能 (emWin Draw 関数を使用) も実装されています (最後に "_cbDialog" 関数内にも実装されています)。 移動中のプレイヤーを示す緑色の長方形を描画します if (!player_turn) { GUI_SetColor(GUI_GREEN); GUI_DrawRoundedFrame(6、106、83、183、0、4); GUI_SetColor(GUI_BLACK); GUI_DrawRoundedFrame(6、186、83、263、0、4); } 然も無くば { GUI_SetColor(GUI_GREEN); GUI_DrawRoundedFrame(6、186、83、263、0、4); GUI_SetColor(GUI_BLACK); GUI_DrawRoundedFrame(6、106、83、183、0、4); } 15) 最後に、GUIを初期化する直前に、ウェルカムメッセージ付きのprintfが「main」 機能に追加されました。 PRINTF("三目並べのデモ i.MXRT1060.\r\n"); 5. 機能デモンストレーション   以下は、実行中のアプリケーションのキャプチャ、Cross が勝ったとき、Circle が勝ったとき、および試合が引き分けになったときのキャプチャを示しています。  
查看全文
CTE on S32R274 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi コードを MPC5775K から S32R274 に移行します。 S32R274 EVB with S32 Design Studio for Power Architecture Version 2.1でテスト済み。     Unzip password: nxp 乾杯 オリバー
查看全文
LPC804: PLU Hands-on Lab Guide <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> コミュニティの皆さん、こんにちは! このドキュメントは、ハンズオンラボガイドとして提供されています。このラボの目的は、SDK サンプルと PLU モジュール ドライバを使用して、MCUXpresso IDE で LPCXpresso804 ボードをプログラムする方法を示すことです。 PLU コンフィギュレーション ツールを使用して、PLU にプログラムされる新しい回路図デザインを作成します。 セットアップ ラボを完了するには、次の項目をコンピューターにインストールする必要があります。 ソフトウェア: •    SDK_2.4.1_LPCXpresso804: - リンクをブラウザにコピー: https://mcuxpresso.nxp.com/en/select?device=LPCXpresso804 - [ツールチェーンIDE]ドロップダウンで[MCUXpresso IDE]または[すべてのツールチェーン]を選択します - 「Download SDK」を選択します。 • MCUXpresso IDE バージョン 10.2.1: - 次のリンクからインストールできます: https://www.nxp.com/mcuxpresso/ide • PLU 設定ツール - 次のリンクからインストールできます: https://www.nxp.com/products/processors-and-microcontrollers/arm-based-processors-and-mcus/i.mx-applications-processors/i.mx-rt-series/i.mx-rt1060-crossover-processor-with-arm-cortex-m7-core:i.MX-RT1060?tab=Design_Tools_Tab   ハードウェア: •  LPCXpresso804開発ボード(OM40001): https://www.nxp.com/support/developer-resources/evaluation-and-development-boards/lpcxpresso-boards/lpcxpresso804-for-the-lpc804-family-of-mcus:OM40001?tab=Design_Tools_Tab • PLUシールドボード •1マイクロUSBケーブル このガイドがお役に立てば幸いです。どんなコメントでも大歓迎です。 よろしくお願いいたします カルロス・メンドーサ テクニカルサポートエンジニア LPC800 ペリフェラル
查看全文
i.MX6 Android R13.4.1に基づくPORリブートのリカバリモードをサポートする方法 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Overview このドキュメントの目的は、MX6 Android R13.4.1に基づくPORリブートイベントのリカバリモードをサポートする方法を紹介することです。 バックグラウンド Android R13.4.1をMX6 SabreSDボードで起動した場合、再起動の理由はWatchdogです。ただし、再起動の理由がウォッチドッグからPORに変更された場合、工場出荷時のリセット後にリカバリモードに入るのに失敗します。 R13.4.1 では、SRC_GPR10 のビット 8 がリカバリ モードの永続ビットとして使用されます。このビットは、U-boot がこのビットを使用してどのモードに入るべきかを区別できるように、再起動後も保持されることが期待されます。ただし、すべての SRC レジスタは、i.MX6DQRM セクション 59.4.1.2.3 IPP_RESET_B (POR) に従って POR シーケンスでリセットされます。したがって、再起動の理由が POR の場合、ソフトウェアが再起動前に設定した場合でも、リカバリ モードの永続ビットはクリアされます。これにより、ブートローダーは再起動後にリカバリモードに入らなくなります。 ソフトウェアの変更 i.MX6DQRMによると、SNVS_LP汎用レジスタは32ビットのリードライトレジスタを提供し、パワーダウンモード中に32ビットデータを保持するために任意のアプリケーションで使用できます。したがって、POR イベントのリカバリ モードをサポートするために、SNVS_LP レジスタを使用してリカバリ モードの永続ビットを格納できます。適用するには、以下の変更が必要です(patches.tar.gz参照) Ubootパッチbootable/bootloader/uboot-imx/0001-ENGR00235817-mx6-use-SNVS-LPGPR-register-to-store-bo.patchを申請してください。 差分 --git a/cpu/arm_cortexa8/mx6/generic.cb/cpu/arm_cortexa8/mx6/generic.c インデックス257c930..BD47130 100644 --- a/cpu/arm_cortexa8/mx6/generic.c +++ b/cpu/arm_cortexa8/mx6/generic.c @@ -1146,14 +1146,14 @@ int check_and_clean_recovery_flag(ボイド) {   int flag_set = 0;   u32 reg; - reg = readl(SRC_BASE_ADDR + SRC_GPR10); + reg = readl(SNVS_BASE_ADDR + SNVS_LPGPR); flag_set=!!(reg & ANDROID_RECOVERY_BOOT); /* ここで無限にループする場合に備えて清掃してください.... */ if(flag_set){ reg &= ~ANDROID_RECOVERY_BOOT; - writel(reg, SRC_BASE_ADDR + SRC_GPR10); + writel(reg, SNVS_BASE_ADDR + SNVS_LPGPR);   } flag_setを返します。 @@ -1168,14 +1168,15 @@ int fastboot_check_and_clean_flag(無効) {   int flag_set = 0;   u32 reg; - reg = readl(SRC_BASE_ADDR + SRC_GPR10); + + reg = readl(SNVS_BASE_ADDR + SNVS_LPGPR);   flag_set = !!(reg & ANDROID_FASTBOOT_BOOT); /* ここで無限にループする場合に備えて清掃してください.... */ if(flag_set){    reg &= ~ANDROID_FASTBOOT_BOOT; - writel(reg, SRC_BASE_ADDR + SRC_GPR10); + writel(reg, SNVS_BASE_ADDR + SNVS_LPGPR);   } flag_setを返します。 差分 --git a/include/asm-arm/arch-mx6/mx6.hb/include/asm-arm/arch-mx6/mx6.h index efb90c2..45381e2 100644 --- a/include/asm-arm/arch-mx6/mx6.h +++ b/include/asm-arm/arch-mx6/mx6.h @@ -732,6 +732,8 @@ #define SRC_GPR9 0x40 #define SRC_GPR10 0x44 +#define SNVS_LPGPR 0x68 + /* ボードIDを取得 */ #define board_is_rev(system_rev, rev) (((system_rev & 0x0F00) == rev) ? 1 : 0) #define chip_is_type(system_rev、rev)\ カーネルパッチ kernel_imx/0001-ENGR00235817-mx6-use-SNVS-LPGPR-register-to-store-bo.patch の適用 差分 --git a/arch/arm/mach-mx6/system.cb/アーチ/arm/mach-MX6/system.c インデックス6d24f22..61649c5 100644 --- a/arch/arm/mach-MX6/system.c +++ b/arch/arm/mach-MX6/system.c @@ -563,7 +563,7 @@ void mxc_clear_mfgmode(void) #endif #ifdef CONFIG_MXC_REBOOT_ANDROID_CMD -/* この機能は、入力するSRC_GPR10[7-8]ビットにビットを設定します +/* この機能は、入力するSNVS_LPGPR[7-8]ビットにビットを設定します *特別なブートモード。これらのビットはウォッチドッグリセットではクリアされないため、 * ブートローダーで確認して、別のモードに入ることを選択できます。 @@ -574,18 +574,18 @@ ボイド do_switch_recovery(ボイド) {   u32 reg; - reg = __raw_readl(SRC_BASE_ADDR + SRC_GPR10); + reg = __raw_readl(MX6Q_SNVS_BASE_ADDR + SNVS_LPGPR); reg |= ANDROID_RECOVERY_BOOT; - __raw_writel(reg、SRC_BASE_ADDR + SRC_GPR10); + __raw_writel(reg, MX6Q_SNVS_BASE_ADDR + SNVS_LPGPR); } ボイドdo_switch_fastboot(ボイド) {   u32 reg; - reg = __raw_readl(SRC_BASE_ADDR + SRC_GPR10); + reg = __raw_readl(MX6Q_SNVS_BASE_ADDR + SNVS_LPGPR);   reg |= ANDROID_FASTBOOT_BOOT; - __raw_writel(reg、SRC_BASE_ADDR + SRC_GPR10); + __raw_writel(reg, MX6Q_SNVS_BASE_ADDR + SNVS_LPGPR); } #endif 差分 --git a/arch/arm/plat-mxc/include/mach/mx6.hb /アーチ/アーム/プラット-mxc /インクルード/マッハ/mx6.h index 48b04b1..bb22de0 100644 --- a/arch/arm/plat-mxc/include/mach/mx6.h +++ b/arch/arm/plat-mxc/include/mach/mx6.h @@ -302,6 +302,8 @@ #define SRC_GPR9 0x40 #define SRC_GPR10 0x44 +#define SNVS_LPGPR 0x68 + /* GPCオフセット */ #define MXC_GPC_CNTR_OFFSET 0x0 Android i.MX6_All
查看全文
Hands-On i.MX 8M Mini Lab Guide <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 从 i.MX 8M Mini EVK 开始实践,我们将介绍开箱即用的支持,包括软件、工具、硬件设计指南和演示软件。参加者在完成本课程后应该能够自信地使用 i.MX 8M Mini 开始自己的设计。 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 从 i.MX 8M Mini EVK 开始实践,我们将介绍开箱即用的支持,包括软件、工具、硬件设计指南和演示软件。参加者在完成本课程后应该能够自信地使用 i.MX 8M Mini 开始自己的设计。 i.MX 应用处理器
查看全文
Wandboard - フリースケールi.MX6 Cortex-A9プロセッサを搭載した超低消費電力、高性能、低コストの開発ボード <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Wandboardは 、新しい近日発売予定のFreescale i.MX6 Cortex-A9プロセッサをベースにした高性能マルチメディア機能を備えた超低電力の完全なコンピュータで、まばゆいばかりの1GHzプロセッサ、HDMIディスプレイインターフェイス、ギガビットイーサネットが付属しています。Wandboard(Wandboard DUAL)のデュアルコアバージョンは、1GBのメモリを搭載するだけでなく、Wi-FiとBluetoothも搭載しています。     Wandboard Solo Wandboard Dual プロセッサ フリースケールi.MX6 Solo フリースケールi.MX6 Duallite Cores Cortex-A9シングルコア Cortex-A9デュアルコア メモリ 512 MB DDR3 1 GB DDR3 オーディオ • • オプティカル S/PDIF • • HDMI • • カメラ・インターフェース • • microSDカード・スロット 2 2 シリアルポート • • 拡張ヘッダー • • USB • • USB OTG • • SATAコネクタ 入力されていません 入力されていません Gigabit LAN • • WI-FI(802.11n) • Bluetooth • 69米ドル 89米ドル   www.wandboard.org 担当者 : [email protected] 全般 Re:Wandboard - フリースケールi.MX6 Cortex-A9プロセッサを搭載した超低電力高性能低コスト開発ボード <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> こんにちは、Wanboard Quad BoardにはいくつのPCBレイヤーがあるのか知りたいのですが?私はただ将来のカスタム開発に関連して興味がありますか?どなたかこの情報を持っていただけると幸いです。 Re:Wandboard - フリースケールi.MX6 Cortex-A9プロセッサを搭載した超低電力高性能低コスト開発ボード <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> hi, 私はこのボードをTenet Technetronics.itsから入手しました.それはうまく動作し、Jelly BeanとUbuntuはこのボード上でスムーズに実行されています。
查看全文
コネクティビティソフトウェア: FreeRTOS でティックレスモードを実装 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> FreeRTOS は、ティックをカウントすることで、システム内の経過時間を追跡します。ティック・カウントは、ホストMCUで使用可能なタイマーの1つによって生成される定期的な割り込みルーチン内で増加します。FreeRTOS がアイドルタスクフックを実行している場合、マイクロコントローラを低電力モードにすることができます。低電力モードに応じて、1つ以上の周辺機器を無効にして、可能な限り最大限のエネルギーを節約できます。FreeRTOS ティックレスアイドルモードでは、アイドル期間中のティック中断を停止できます。ティック割込みを停止すると、ウェイクアップ・イベントが発生するまで、マイクロコントローラは大幅な省電力状態を維持できます。 アプリケーションは、次のFreeRTOSタスクを実行する前にマイクロコントローラをウェイクアップするモジュール(タイマー、ADCなど)を構成する必要があります。そのため、tickless idleが有効な場合にFreeRTOSが呼び出す関数であるvPortSuppressTicksAndSleepの実行中に、ウェイクアップモジュールを適切に設定するために、MCUがスリープ状態を維持できる最大時間を入力パラメータとして渡します。MCUがウェイクアップし、FreeRTOSのティック割り込みが再開されると、MCUがスリープ状態の間に失われたティックカウントの数を元に戻す必要があります。 ティックレスモードは、接続ソフトウェア FreeRTOS デモではデフォルトでは有効になっていません。この投稿では、有効にする方法 説明します。この例では、QN9080x を使用して実装を示します。 低電力 FreeRTOS ティックレス ダニ無し 変更は、次のファイルに実装されています。 \フレームワーク\LowPower\ソース\QN908XC\PWR.c \framework\LowPower\Interface\QN908XC\PWR_Interface.h \フリートス\fsl_tickless_generic.h \ソース\共通\ApplMain.c 次のファイルがプロジェクトから削除されました fsl_tickless_qn_rtc.c PWRです。C および PWR_Interface.h このファイルの変更は、RTC タイマーを使用して QN9080 をウェイクアップするための準備を目的としています。MKW41Z などの他のパーツは、この目的のために他のモジュール (LPTMR など) を有効にする場合があり、このファイルを変更する必要がない場合があります。 *** PWR.c *** RTC用のドライバを追加します。これは、QN908xをウェイクアップするために使用するタイマーです /*Tickless: Add RTC driver for tickless support */ #include "fsl_rtc.h"‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ ローカル変数の追加 uint64_t mLpmTotalSleepDuration;        //Tickless uint8_t mPWR_DeepSleepTimeUpdated = 0;  //Tickless: Coexistence with TMR manager‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ プライベート機能を追加する uint32_t PWR_RTCGetMsTimeUntilNextTick (void);         //Tickless void PWR_RTCSetWakeupTimeMs (uint32_t wakeupTimeMs);   //Tickless void PWR_RTCWakeupStart (void);                        //Tickless‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ PWR.C.で次の変更を行います。必要なすべての変更は、変更の開始位置で "Start" と、変更の終了位置で "End" というコメントとしてマークされます #if (cPWR_UsePowerDownMode && (cPWR_EnableDeepSleepMode_1 || cPWR_EnableDeepSleepMode_2 || cPWR_EnableDeepSleepMode_3 || cPWR_EnableDeepSleepMode_4)) static void PWR_HandleDeepSleepMode_1_2_3_4(void) { #if cPWR_BLE_LL_Enable     uint8_t   power_down_mode = 0xff;     bool_t    enterLowPower = TRUE;     __disable_irq(); /****************START***********************************/     /*Tickless: Configure wakeup timer */     if(mPWR_DeepSleepTimeUpdated){       PWR_RTCSetWakeupTimeMs(mPWR_DeepSleepTimeMs);       mPWR_DeepSleepTimeUpdated = FALSE;        // Coexistence with TMR Manager     }         PWR_RTCWakeupStart(); /*****************END**************************************/     PWRLib_ClearWakeupReason();     //Try to put BLE in deep sleep mode     power_down_mode = BLE_sleep();     if (power_down_mode < kPmPowerDown0)     {         enterLowPower = false; // BLE doesn't allow deep sleep     }     //no else - enterLowPower is already true     if(enterLowPower)     { /****************START**************************/         uint32_t freeRunningRtcPriority; /****************END****************************/         NVIC_ClearPendingIRQ(OSC_INT_LOW_IRQn);         NVIC_EnableIRQ(OSC_INT_LOW_IRQn);         while (SYSCON_SYS_STAT_OSC_EN_MASK & SYSCON->SYS_STAT) //wait for BLE to enter sleep         {             POWER_EnterSleep();         }         NVIC_DisableIRQ(OSC_INT_LOW_IRQn);         if(gpfPWR_LowPowerEnterCb != NULL)         {             gpfPWR_LowPowerEnterCb();         } /* Disable SysTick counter and interrupt */         sysTickCtrl = SysTick->CTRL & (SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk);         SysTick->CTRL &= ~(SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk);         ICSR |= (1 << 25); // clear PendSysTick bit in ICSR, if set /************************START***********************************/         NVIC_ClearPendingIRQ(RTC_FR_IRQn);         freeRunningRtcPriority = NVIC_GetPriority(RTC_FR_IRQn);         NVIC_SetPriority(RTC_FR_IRQn,0); /***********************END***************************************/         POWER_EnterPowerDown(0); //Nighty night! /************************START**********************************/         NVIC_SetPriority(RTC_FR_IRQn,freeRunningRtcPriority); /************************END************************************/         if(gpfPWR_LowPowerExitCb != NULL)         {             gpfPWR_LowPowerExitCb();         }         /* Restore the state of SysTick */         SysTick->CTRL |= sysTickCtrl;         PWRLib_UpdateWakeupReason();     }     __enable_irq(); #else     PWRLib_ClearWakeupReason(); #endif /* cPWR_BLE_LL_Enable */ } #endif /* (cPWR_UsePowerDownMode && cPWR_EnableDeepSleepMode_1) */ ‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ void PWR_SetDeepSleepTimeInMs(uint32_t deepSleepTimeMs) { #if (cPWR_UsePowerDownMode)     if(deepSleepTimeMs == 0)     {         return;     }     mPWR_DeepSleepTimeMs = deepSleepTimeMs; /****************START******************/     mPWR_DeepSleepTimeUpdated = TRUE; /****************END*********************/ #else     (void) deepSleepTimeMs; #endif /* (cPWR_UsePowerDownMode) */ }‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ ファイルの最後にある次の関数定義を追加/置換します /*--------------------------------------------------------------------------- * Name: PWR_GetTotalSleepDurationMS * Description: - * Parameters: - * Return: - *---------------------------------------------------------------------------*/ uint32_t PWR_GetTotalSleepDurationMS(void) {     uint32_t time;     uint32_t currentSleepTime;     OSA_InterruptDisable();     currentSleepTime = RTC_GetFreeRunningInterruptThreshold(RTC);     if(currentSleepTime >= mLpmTotalSleepDuration){     time = (currentSleepTime-mLpmTotalSleepDuration)*1000/CLOCK_GetFreq(kCLOCK_32KClk);     }     else{     time = ((0x100000000-mLpmTotalSleepDuration)+currentSleepTime)*1000/CLOCK_GetFreq(kCLOCK_32KClk);     }     OSA_InterruptEnable();     return time; } /*--------------------------------------------------------------------------- * Name: PWR_ResetTotalSleepDuration * Description: - * Parameters: - * Return: - *---------------------------------------------------------------------------*/ void PWR_ResetTotalSleepDuration(void) {     OSA_InterruptDisable();     mLpmTotalSleepDuration = RTC_GetFreeRunningCount(RTC);     OSA_InterruptEnable(); } /*--------------------------------------------------------------------------- * Name: PWR_RTCGetMsTimeUntilNextTick * Description: - * Parameters: - * Return: Time until next tick in mS *---------------------------------------------------------------------------*/ uint32_t PWR_RTCGetMsTimeUntilNextTick (void) {     uint32_t time;     uint32_t currentRtcCounts, thresholdRtcCounts;     OSA_InterruptDisable();     currentRtcCounts = RTC_GetFreeRunningCount(RTC);     thresholdRtcCounts = RTC_GetFreeRunningResetThreshold(RTC);     if(thresholdRtcCounts > currentRtcCounts){     time = (thresholdRtcCounts-currentRtcCounts)*1000/CLOCK_GetFreq(kCLOCK_32KClk);     }     else{     time = ((0x100000000-currentRtcCounts)+thresholdRtcCounts)*1000/CLOCK_GetFreq(kCLOCK_32KClk);     }     OSA_InterruptEnable();     return time; } /*--------------------------------------------------------------------------- * Name: PWR_RTCSetWakeupTimeMs * Description: - * Parameters: wakeupTimeMs: New wakeup time in milliseconds * Return: - *---------------------------------------------------------------------------*/ void PWR_RTCSetWakeupTimeMs (uint32_t wakeupTimeMs){     uint32_t wakeupTimeTicks;     uint32_t thresholdValue;     wakeupTimeTicks = (wakeupTimeMs*CLOCK_GetFreq(kCLOCK_32KClk))/1000;     thresholdValue = RTC_GetFreeRunningCount(RTC);     thresholdValue += wakeupTimeTicks;     RTC_SetFreeRunningInterruptThreshold(RTC, thresholdValue); } /*--------------------------------------------------------------------------- * Name: PWR_RTCWakeupStart * Description: - * Parameters: - * Return: - *---------------------------------------------------------------------------*/ void PWR_RTCWakeupStart (void){   if(!(RTC->CNT2_CTRL & RTC_CNT2_CTRL_CNT2_EN_MASK)){     RTC->CNT2_CTRL |= 0x52850000 | RTC_CNT2_CTRL_CNT2_EN_MASK | RTC_CNT2_CTRL_CNT2_WAKEUP_MASK | RTC_CNT2_CTRL_CNT2_INT_EN_MASK;   }   else{     RTC->CNT2_CTRL |= 0x52850000 | RTC_CNT2_CTRL_CNT2_WAKEUP_MASK | RTC_CNT2_CTRL_CNT2_INT_EN_MASK;   } } ‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ PWR_Interface.h *** ファイルの末尾に次の関数宣言を追加します /*--------------------------------------------------------------------------- * Name: PWR_GetTotalSleepDurationMS * Description: - * Parameters: - * Return: - *---------------------------------------------------------------------------*/ uint32_t PWR_GetTotalSleepDurationMS(void); /*--------------------------------------------------------------------------- * Name: PWR_ResetTotalSleepDuration * Description: - * Parameters: - * Return: - *---------------------------------------------------------------------------*/ void PWR_ResetTotalSleepDuration(void); #ifdef __cplusplus } #endif #endif /* _PWR_INTERFACE_H_ */ ‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ FSL_TICKLESS_GENERIC 次の変更は、低電力期間中に欠落したティックを回復するためにシステムを準備することを目的としています。 fsl_tickless_generic.h で次の変更を行います。必要なすべての変更は、変更の開始位置で "Start" と、変更の終了位置で "End" というコメントとしてマークされます /* QN_RTC: The RTC free running is a 32-bit counter. */ #define portMAX_32_BIT_NUMBER (0xffffffffUL) #define portRTC_CLK_HZ (0x8000UL) /* A fiddle factor to estimate the number of SysTick counts that would have occurred while the SysTick counter is stopped during tickless idle calculations. */ #define portMISSED_COUNTS_FACTOR (45UL) /* * The number of SysTick increments that make up one tick period. */ /****************************START**************************/ #if configUSE_TICKLESS_IDLE == 1     static uint32_t ulTimerCountsForOneTick; #endif /* configUSE_TICKLESS_IDLE */ /************************END*********************************/ /* * Setup the timer to generate the tick interrupts. */ void vPortSetupTimerInterrupt(void); #ifdef __cplusplus } #endif #endif /* FSL_TICKLESS_GENERIC_H */ ‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ ApplMain.c これがメインのアプリケーションファイルです。ここでは、適切なAPIを呼び出して、低電力モードでMCUに入り、ティックリカバリシーケンスを実行します。 必要なRTCおよびFreeRTOSヘッダーファイルを含める /*Tickless: Include RTC and FreeRTOS header files */ #include "fsl_rtc.h" #include "fsl_tickless_generic.h" #include "FreeRTOS.h" #include "task.h"‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ QN9080には、いくつかの低電力モードが含まれています。スリープモードでは、ほとんどのモジュールがアクティブに保たれます。パワーダウンモードでは、ほとんどのモジュールがオフになりますが、必要に応じてMCUをウェイクアップするために、一部のモジュールをアクティブなままに構成できます。ティックレス FreeRTOS を使用すると、次の準備完了タスクが実行される前に、何らかのタイマーでウェイクアップする必要があります。QN908xの場合、このタイマーはRTCであり、32.768kHz発振器がアクティブ状態を維持する必要があります。コネクティビティソフトウェアのPower Libを、32.768kHzの発振器をオンに維持するディープスリープモード3(QN908xの場合はPower Downモード0)を使用するように変更します。この変更は、 main_task 関数に実装されています。 #if !defined(MULTICORE_BLACKBOX)         /* BLE Host Stack Init */         if (Ble_Initialize(App_GenericCallback) != gBleSuccess_c)         {             panic(0,0,0,0);             return;         } #endif /* MULTICORE_BLACKBOX */ /*************** Start ****************/ #if (cPWR_UsePowerDownMode)     PWR_ChangeDeepSleepMode(3); #endif /*************** End ****************/     }         /* Call application task */     App_Thread( param ); }‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ また、ティックレスFreeRTOSには、次のタスクを実行する前にMCUがスリープ状態を維持できるRTOSティックの量を入力パラメータとして取る特別なアイドル関数が必要です。次の変更により、ティックレス モードが有効になっている場合、接続ソフトウェアのデモで提供されるデフォルトのアイドル機能が無効になります。 /************************************************************************************ ************************************************************************************* * Private prototypes ************************************************************************************* ************************************************************************************/ #if (cPWR_UsePowerDownMode || gAppUseNvm_d) #if (mAppIdleHook_c)     #define AppIdle_TaskInit()     #define App_Idle_Task() #else #if (!configUSE_TICKLESS_IDLE)     static osaStatus_t AppIdle_TaskInit(void);     static void App_Idle_Task(osaTaskParam_t argument); #endif // configUSE_TICKLESS_IDLE #endif #endif‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ /************************************************************************************ ************************************************************************************* * Private memory declarations ************************************************************************************* ************************************************************************************/ /******************************** Start ******************************/ #if ((cPWR_UsePowerDownMode || gAppUseNvm_d) && !configUSE_TICKLESS_IDLE) /******************************** End ******************************/ #if (!mAppIdleHook_c) OSA_TASK_DEFINE( App_Idle_Task, gAppIdleTaskPriority_c, 1, gAppIdleTaskStackSize_c, FALSE ); osaTaskId_t gAppIdleTaskId = 0; #endif #endif  /* cPWR_UsePowerDownMode */‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ #if !gUseHciTransportDownward_d         pfBLE_SignalFromISR = BLE_SignalFromISRCallback; #endif /* !gUseHciTransportDownward_d */ /**************************** Start ************************/ #if ((cPWR_UsePowerDownMode || gAppUseNvm_d) && !configUSE_TICKLESS_IDLE) /**************************** End ************************/ #if (!mAppIdleHook_c)         AppIdle_TaskInit(); #endif #endif‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ /***************************START**************************/ #if (cPWR_UsePowerDownMode && !configUSE_TICKLESS_IDLE) /******************************END***************************/ static void App_Idle(void) {     PWRLib_WakeupReason_t wakeupReason;     if( PWR_CheckIfDeviceCanGoToSleep() )     {         /* Enter Low Power */         wakeupReason = PWR_EnterLowPower(); #if gFSCI_IncludeLpmCommands_c         /* Send Wake Up indication to FSCI */         FSCI_SendWakeUpIndication(); #endif #if gKBD_KeysCount_c > 0         /* Woke up on Keyboard Press */         if(wakeupReason.Bits.FromKeyBoard)         {             KBD_SwitchPressedOnWakeUp();             PWR_DisallowDeviceToSleep();         } #endif     }     else     {         /* Enter MCU Sleep */         PWR_EnterSleep();     } } #endif /* cPWR_UsePowerDownMode */ #if (mAppIdleHook_c) void vApplicationIdleHook(void) { #if (gAppUseNvm_d)     NvIdle(); #endif /*******************************START****************************/ #if (cPWR_UsePowerDownMode && !configUSE_TICKLESS_IDLE) /*********************************END*******************************/     App_Idle(); #endif } #else /* mAppIdleHook_c */ /******************************* START ****************************/ #if ((cPWR_UsePowerDownMode || gAppUseNvm_d) && !configUSE_TICKLESS_IDLE) /******************************* END ****************************/ static void App_Idle_Task(osaTaskParam_t argument) {     while(1)     {   #if gAppUseNvm_d         NvIdle(); #endif         #if (cPWR_UsePowerDownMode)         App_Idle(); #endif         /* For BareMetal break the while(1) after 1 run */         if (gUseRtos_c == 0)         {             break;         }     } } ‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ デフォルトのアイドル機能を無効にしたら、特別なアイドル機能を実装する必要があります。ApplMain.c の末尾に次のコードを追加しますファイル。 /*Tickless: Implement Tickless Idle */ #if (cPWR_UsePowerDownMode && configUSE_TICKLESS_IDLE) extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) {     uint32_t time_ms = xExpectedIdleTime * portTICK_PERIOD_MS;     uint32_t tmrMgrExpiryTimeMs;     ulTimerCountsForOneTick = 160000;//VALUE OF THE SYSTICK 10 ms #if (cPWR_UsePowerDownMode)     PWRLib_WakeupReason_t wakeupReason;         //TMR_MGR: Get next timer manager expiry time     tmrMgrExpiryTimeMs = TMR_GetFirstExpireTime(gTmrAllTypes_c);     // TMR_MGR: Update RTC Threshold only if RTOS needs to wakeup earlier     if(time_ms<tmrMgrExpiryTimeMs){       PWR_SetDeepSleepTimeInMs(time_ms);     }         PWR_ResetTotalSleepDuration();     if( PWR_CheckIfDeviceCanGoToSleep() )     {         wakeupReason = PWR_EnterLowPower();                 //Fix: All the tick recovery stuff should only happen if device entered in DSM         xExpectedIdleTime = PWR_GetTotalSleepDurationMS() / portTICK_PERIOD_MS;     // Fix: ticks = time in mS asleep / mS per each tick (portTICK_PERIOD_MS)         /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG         again, then set portNVIC_SYSTICK_LOAD_REG back to its standard         value. The critical section is used to ensure the tick interrupt         can only execute once in the case that the reload register is near         zero. */         portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;         portENTER_CRITICAL();         portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT;         vTaskStepTick( xExpectedIdleTime );         portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;         portEXIT_CRITICAL(); #if gKBD_KeysCount_c > 0         /* Woke up on Keyboard Press */         if(wakeupReason.Bits.FromKeyBoard)         {           KBD_SwitchPressedOnWakeUp();           PWR_DisallowDeviceToSleep();         } #endif     }     else     {       /* Enter MCU Sleep */       PWR_EnterSleep();     } #endif /* cPWR_UsePowerDownMode */ } #endif  //cPWR_UsePowerDownMode && configUSE_TICKLESS_IDLE ‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ 前の関数から、ulTimerCountsForOneTick の値を使用して、ウェイクアップ後に RTOS ティック タイマーのカウントを復元します。この値は、FreeRTOSConfig.h で定義されている RTOS ティック間隔によって異なりますは、次の式を使用して計算されます。 SYST_RNR = F_Systick_CLK(Hz) * T_FreeRTOS_Ticks(ms) ここで、 F_Systick_CLK(Hz)= AHBまたはSYST_CSR選択の32KHz T_FreeRTOS_Ticks(ms) = ティックカウント値。 FreeRTOSConfig.h 最後に、FreeRTOSConfig.h でファイルで、configUSE_TICKLESS_IDLE が 1 に設定されていることを確認します * See http://www.freertos.org/a00110.html. *----------------------------------------------------------*/ #define configUSE_PREEMPTION                    1 #define configUSE_TICKLESS_IDLE                 1 //<--- /***** Start *****/ #define configCPU_CLOCK_HZ                      (SystemCoreClock) #define configTICK_RATE_HZ                      ((TickType_t)100) #define configMAX_PRIORITIES                    (18) #define configMINIMAL_STACK_SIZE                ((unsigned short)90)‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ ティックレスRTOSのテスト ティックレス サポートが正常に追加されたかどうかをテストするために、LED を切り替えるサンプル アプリケーションが実装されています。このアプリケーションは、500mSごとにLEDを切り替え、アイドル時間中にDSM3にMCUに入るようにRTOSタイマを設定します。この目的のために、Power Profiling デモが使用されました。 power_profiling.c 次のヘッダー ファイルが含まれていることを確認します #include "FreeRTOS.h" #include "task.h"‍‍‍‍ 500mSごとにLEDを点滅させるRTOSタスクを作成します。まず、タスク関数、タスクID、およびタスク自体を宣言します。 void vfnTaskLedBlinkTest(void* param); //New Task Definition OSA_TASK_DEFINE(vfnTaskLedBlinkTest, 1, 1, 500, FALSE ); osaTaskId_t gAppTestTask1Id = 0; // TestTask1 Id‍‍‍‍‍‍ BleApp_Init関数内に新しいタスクを作成します void BleApp_Init(void) {     PWR_AllowDeviceToSleep();     mPowerState = 0;   // Board starts with PD1 enabled     /******************* Start *****************/     gAppTestTask1Id = OSA_TaskCreate(OSA_TASK(vfnTaskLedBlinkTest), NULL); //Task Creation     /*******************  End  *****************/ }‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ 最後に、タスク関数定義をファイルの最後に追加します。 void vfnTaskLedBlinkTest(void* param) {     uint16_t wTimeValue = 500; //500ms     while(1)     {         LED_BLUE_TOGGLE();         vTaskDelay(pdMS_TO_TICKS(wTimeValue));     } }‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ MCUXpresso IDE の電力消費は、 Power Measurement Tool を使用して監視できます。これにより、消費された電流を確認し、実装が期待どおりに機能していることを証明できます。 電力測定ツールを構成する 消費電流 BLEソフトウェア Re:コネクティビティソフトウェア:FreeRTOSでティックレスモードを実装する <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 電力プロファイルは、ティックレスモードやベアボードモードでも、妥当な消費電力に達する可能性があります。 ただし、1つのトラップがあり、注意が必要です。 電源モードPD1から回復すると、スリープ前に32K OSCを閉じたティックレスアイドルタスクで、電源 PWRLib_LPTMR_Stopない周辺機器を操作するためにクラッシュします。 電源モードがPD0の場合、OSCが動作し、スリープ中に電源が供給されたままになっている場合に問題は発生しませんでした。 修正方法: PD1またはPD0からの回復を判断します。 Re:コネクティビティソフトウェア:FreeRTOSでティックレスモードを実装する <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 温度センサーの例は、ティックレスモードで動作するようです。 ただし、パワープロファイルの例に比べてスリープ消費量がわずかに多くなります Re:コネクティビティソフトウェア:FreeRTOSでティックレスモードを実装する <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> ティックレスフリートスと低電力動作をテストするには、どの例を使用するのが最適ですか? Re:コネクティビティソフトウェア:FreeRTOSでティックレスモードを実装する <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi: 最新のSDK v2.2はfreertosのticklessをサポートしており、app_preinclude.hで以下のマクロを有効にする必要があります configUSE_TICKLESS_IDLE:为1 以下定义用于计算tickless消逝时间 /* PD1ではRTCが動作していないため、PWRモジュールでRTC関連コードを無効にします */ #define cPWR_EnableLpTmrRunning 1 #define cPWR_EnablePD0RtcInterrupt 1
查看全文
FTF-DES-F1149.pdf <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 在本次研讨会上,我们将深入探讨 Kinetis Design Studio IDE 的高级用法,包括如何将其与版本控制系统一起使用、自动化构建和调试会话。此外,了解如何生成覆盖范围并分析您的应用程序。 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 在本次研讨会上,我们将深入探讨 Kinetis Design Studio IDE 的高级用法,包括如何将其与版本控制系统一起使用、自动化构建和调试会话。此外,了解如何生成覆盖范围并分析您的应用程序。
查看全文
人工智能和机器学习课程#4:使用S32V处理器的CNN <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 在本文中,我们将讨论以下主题: 如何配置 SBC S32V234 板以准备部署 CNN CNN 开发对主机电脑有什么要求 如何在 MATLAB 中使用预先训练的 CNN 模型 如何在 NXP S32V 微处理器上运行 MATLAB CNN 1.引言 可以使用NXP Vision Toolbox在 NXP 专有板上部署 MATLAB 脚本。工具箱提供的实用程序绕过了所有必须进行的硬件配置和初始化,并可以为 MATLAB 用户提供一种在电路板上轻松开始运行自己的代码的方法,而无需了解特定的硬件和低级软件细节。它还包括一个支持卷积神经网络部署的模块,因此用户可以: 训练在 MATLAB 中开发的自己的 CNN 模型; 使用 MATLAB 预先训练的 CNN; 利用迁移学习调整预先训练的 CNN 模型来识别新物体; 我们将在下一门课程#5 中重新讨论迁移学习并涵盖更多该主题的内容。 NXP Vision Toolbox利用 MATLAB 的功能,使用 ARM Neon 技术为 CNN 生成代码,在一定程度上可以加速这些计算密集型算法。我们正在积极致力于与恩智浦的下一代机器学习软件 AIRunner 协同工作,该软件利用集成 Vision APEX 加速器的强大功能,为部署稳定、实时的对象检测、语义分割和其他有用的算法提供支持,从而改善驾驶员的驾驶体验。 2. 启动并运行 本课程假设您已在C1:硬件和软件环境设置中设置了 MATLAB 环境。为了保证文档的完整性,此处列出的步骤如下: 首先, 应 安装 NXP Vision Toolbox ,并将 Linux Yocto 发行版写入 SD 卡(可从 此处的 NXP Vision SDK 包中下载 SD 卡映像) Debian 版本也可以使用,但是需要在主板上安装一些额外的东西,并且我们当前版本的工具箱在主板上部署脚本时不会与它集成。这很可能会在下一个版本中发生变化,届时也会获得对 Debian 的开箱即用支持 将ARM 计算库下载到主机。有关 ARM 计算库的更多详细信息、它的重要性以及它的功能,请参阅: https://community.arm.com/developer/tools-software/tools/b/tools-software-ides-blog/posts/getting-started-with-deep-learning-models-on-arm-cortex-a-with-matlab ARM 计算库可以从 https://github.com/ARM-software/ComputeLibrary 下载 NXP Vision Toolbox CNN 示例是使用版本18.03构建的,因此请下载此版本以避免任何向后或向前兼容性问题 - 向下滚动直到找到二进制部分,如下图所示:   下载并解压 ARM Compute 映像后,ARM_COMPUTELIB 系统变量应指向安装文件夹的顶部: ARM Compute 库应包含具有正确库的 linux-arm-v8a-neon 文件夹: 为了能够在工具箱中运行 CNN 示例,应安装以下 MATLAB 附加组件: 深度学习工具箱 深度学习工具箱™ GoogLeNet 网络模型 深度学习工具箱™ AlexNet 网络模型 深度学习工具箱™ SqueezeNet 网络模型 适用于深度学习库的 MATLAB Coder 接口 3. 运行示例 此时, NXP Vision Toolbox应该已准备好在板上部署脚本。 如果您不熟悉配置在 NXP SBC S32V234 评估上运行的 Linux 操作系统或 Windows 操作系统中的网络配置的概念,请参阅此主题: https://community.nxp.com/docs/DOC-335345 为了将 MATLAB 中生成和编译的任何应用程序下载到 NXP 微处理器,您只需使用开发板的 IP 地址设置配置结构,然后以以下方式调用 NXP Vision Toolbox 提供的 nxpvt_codegen 脚本: 这只是一种在板上自动化部署的机制。也可以不使用配置结构中的部署选项来编译脚本。在这种情况下,生成的.elf并且应该手动将 MATLAB 为神经网络生成的二进制文件复制到开发板上。 如果编译是通过优化完成的( config.Optimize = true ),则可以在 ../ codegen/exe/SCRIPT_NAME/build-v234ce-gnu-linux-o 中找到可执行文件(.elf 文件),如果编译是通过调试完成的( config.Optimize = false ) ,则可以在 ../ codegen/exe/SCRIPT_NAME/build-v234ce-gnu-linux-d 中找到 😞 复制可执行文件后,您可以直接在codegen /文件夹中找到文件夹中的网络二进制文件。这些文件代表编译的 Makefile、类支持的标签、网络实现以及网络的层、权重和偏差。您需要复制到板上的文件是权重、偏差和平均二进制文件: 如果您使用此手动部署方法,您还必须确保使用 LD_LIBRARY_PATH 环境变量的加载器知道libarm_compute.so和libarm_compute_core.so 。您可以将其设置为指向您复制 .so 的自定义文件夹或者您可以简单地将它们复制到/lib/ 文件夹。 如果省略此步骤,我们将收到一条错误消息,指出未找到 arm_compute so: 使用nxpvt_codegen脚本进行部署将为您完成所有复制工作,无需任何额外步骤 上一门课程https://community.nxp.com/docs/DOC-343430中提供的 3 个可立即运行的示例可在NXP Vision Toolbox中部署,无需对脚本进行任何额外更改。您可以点击下面的图片进行放大,了解网络在准确性和性能方面的表现。 部署在 S32V 板上的 AlexNet 物体检测器 部署在 S32V 板上的 GoogLeNet 物体检测器                                                                                                                                           部署在 S32V 板上的SqueezeNet物体检测器 正如预期的那样,SqueezeNet 在性能方面表现最佳,并且在准确性方面也取得了相当不错的结果。要简要介绍这 3 个预训练网络,您可以查看本教程的第二门课程C2:深度学习简介。 4. 代码洞察 正如本课程前面的文章所示,在将嵌入式世界引入 MATLAB 的背景下,编写 20 多行代码(包括显示和添加注释)来将神经网络实际部署到板上的想法是有意义的。我们将使用cnn_squeezenet.m来证明使用工具箱在S32V上运行东西是多么容易: 我们首先需要将 SqueezeNet 网络对象从 MATLAB 保存到 .mat文件以便能够从中生成代码: 然后我们应该去看看cnn_squeezenet.m脚本。     我们首先创建一个输入对象,该对象使用 第 3 行 nxpvt.webcam 的 1 个参数从 MIPI-A 连接的摄像头读取数据。我们通过传递代表实际网络和网络接受的大小的已保存的 squeezenet.mat ,使用 nxpvt.CNN 对象创建 CNN。我们加载squeezenet_classes.mat使用对象的loadClassNames方法。然后我们循环从相机获取连续流,使用nxpvt.webcam的snapper()方法获取图像对象并对该图像运行预测。预测方法将按百分比的降序返回类别和百分比。 我们显示前 5 个类别,并调用nxpvt.toc()来确定预测和显示图像所需的时间(这是根据nxpvt.tic计算的调用)来计算每秒的帧数。我们完成了! 4.结论 恩智浦视觉工具箱省去了在目标系统上直接从 MATLAB 部署卷积神经网络所需的所有麻烦和额外步骤。它还允许轻松运行 MATLAB 支持的自定义网络,从而实现顺畅的集成和轻松的执行。在下一课程中,我们将重点介绍如何使用迁移学习重新训练网络。
查看全文
如何获取芯片的封装信息 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi,  NXP 改变了文档的结构,用户可以获得相同封装的统一信息。 例如S32R系列。 1.您应该搜索数据表以获取封装类型和文档编号,作为快照 2. 在www.nxp.com上搜索文档 98ASA00081D 3.下载文件并打开检查。 您可以随意获取包裹的信息。 干杯! 奥利弗
查看全文
i.MX21多媒体应用处理器 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 产品系列特性 飞思卡尔的i.MX系列应用处理器充分展示了其在便携式手持设备市场的领导地位。 i.MX21多媒体处理器是该系列产品的最新成员,并且秉承了其低功耗、高性能的传统。 飞思卡尔已经销售了超过6000万的业界开创性应用处理器。 这意味着您可以采用任何带有恩智浦技术的产品来满足您的创造性要求。 i.MX21采用运行频率至少266 MHz的高级高能效ARM926EJ-S内核,进一步扩大了Smart Speed产品系列,这个系列主要以最低功耗实现高性能处理能力。 ARM926EJ-S™ core (16 KB I-Cache, 16 KB D-Cache) Smart Speed开关 支持SVGA 16/18位彩色LCD控制器 USB OTG (双主设备端口) MPEG-4和H.263编码/解码加速高达CIF 30 fps 其他资源 IMX21-ADS I.MX21 ADS 板闪烁 IMX21 和 iMXL Lite 套件
查看全文
i.MX6のガンマ補正 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> ガンマ補正 通常、ディスプレイは非線形の明るい応答を示します。たとえば、フレーム バッファー値を 100 にすると、値 200 の半分の明るさが得られることはほとんどありません。歴史的に、これはCRTモニターの物理学によるものですが、新しいディスプレイテクノロジーはその動作をエミュレートします。これは互換性のためだけでなく、人間の視覚の科学に基づく確固たる理由によるものです。 CRT の非線形性に対する 1 次近似は、次のようになります。 L = ν ^ γ ここで、Lはディスプレイからの放射輝度(光強度)、νはCRTガンに印加される電圧(通常はフレームバッファのデジタル値に比例)、γ(ギリシャ文字の「ガンマ」)はモニターに固有の定数です。未知のパラメータがすべてを機能させます。通常、約2.0から約2.5の範囲です。有用な事実の 1 つは、ガンマ曲線が対数-対数空間で線形であることです (つまり、logL を logν の関数として表し、γ はその直線の傾きにすぎません。 ガンマ補正の例 点線は線形伝達関数 (γ=1)、フレームバッファのガンマを示します。実線は、一般的な CRT の動作を示しています。破線は逆関数、補正されたガンマを表します。 DP(ディスプレイプロセッサ)を使用して i.MX のガンマを補正する方法は? ガンマ補正は、IPU内のIC(Image Converter)またはDP(Display Processor)サブブロックで行うことができます。Freescale が提供する現在の Linux カーネル (3.10) には、Display Processor ブロック上の関連するガンマ パラメータ レジスタ DP_GAMMA_C_SYNC と DP_GAMMA_S_SYNC を変更する IOCTL があります。 次の手順は、ユーザースペースアプリケーションを使用してガンマを変更する方法を示しています。 1 - 変数を次のように宣言mxcfb_gamma。 構造体mxcfb_gamma fb_gamma; 2 - ガマ補正を有効にします。 fb_gamma.enable = 1; 3 - constk と slopek の値を設定します。ここで、i = 0 から 15 で、x と y はそれぞれ新しい constk と slopek の定数値です。 fb_gamma.constk[i]= x; fb_gamma.スロープ[i]= y; 4 - フレームバッファ デバイスを開き、MXCFB_SET_GAMMAを呼び出します。 fd_fb = open("/dev/fb0", O_RDWR, 0) ioctl(fd_fb, MXCFB_SET_GAMMA, &fb_gamma) 上記のコードを実行すると、ガンマ値がすぐに変更されます。 日時:i.MX6のガンマ補正 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi robinsingh‌, 私が説明したガンマ関数はすべての色を変更しますが、実際には、輝度(Y)のみが影響を受けます。 1つの色だけを変更するには、ディスプレイプロセッサのCSC配列を変更することをお勧めします。また、IOCTL を呼び出すことによって、ユーザー空間で行うこともできます。 このリンクでSWを確認してください。 i.MX6 CSC設定サンプルソースコード  ユーザー空間から、bの正しさ、コントラスト、彩度、色相、ガンマなど、多くのことを変更できます。 よろしくお願いいたします。 Rogerio 日時:i.MX6のガンマ補正 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> こんにちは著者、 あなたは私を導いてくれますか、私のステップで何が欠けていますか? 私のLCDの赤い色は少しずれています、それは正確には完全な赤のようには見えません。だから私はこのLCDを校正したいと思います。そして、私はそれを行うための提案を探しています:   これがガンマ補正の手順です、私はすでに試しましたが、良い結果は得られませんでした i.MX6のガンマ補正  ipu-examples リリースノート - v0.1    framebuffer_ex1マスター ·rogeriorps/ipu-examples ·GitHubの  上記のガンマ補正サンプルコードを試しましたが、LCDキャリブレーションがさらに悪くなります。     これが私のプラットフォームとLVDSインターフェースの設定です:[Android4.4カーネル3.10] LCDパネルは(HX8282 -Source driver / HX8696 -Gate Driver)を使用しています---SPIインターフェースが制御用のパネルから出ていないため、パネルレジスタを設定できません。 ====(ドライバー/ビデオ/MXC/mxc_lcdif.c)=================================== 静的構造体 fb_videomode lcdif_modedb[] = { { /* 液晶 1024x600 @ 60 Hz 、ピクセル clk @ 66MHz */ 「HiMAX-WSVGA」、60、1024、600、25000、155、160、8、23、4、4、 FB_SYNC_CLK_LAT_FALL、 FB_VMODE_NONINTERLACED、 0,}, }; ===( DTS ファイル ) ===========: MXCFB1: fb@0 { compatible = "fsl,mxc_sdc_fb"; disp_dev = "ldb"; interface_pix_fmt = "RGB24"; default_bpp = <24>;/*<24>;*/ int_clk = <0>; late_init = <0>; status = "大丈夫"; }; ================================================================ 問: 1)ガンマ補正にipuサンプルコードを使用しましたが、痛風アレイは次のとおりです。 int gout[16] = {0,2,4,8,16,32,64,96,128,160,192,224,255,255,255,255 }; この設定は私のLCDの色に影響を与えません、私が使用する必要がある私のプロセッサimx6dlのための他の痛風値はありますか、または私はこれらの値をどのように計算しますか、何か提案はありますか?   2)リファレンスマニュアルセクション:38.4.9.6ガンマ補正には、「特定のパネル/ディスプレイに必要なガンマ補正スロープはディスプレイメーカーが提供する必要があります」と記載されていますが、サンプルコードのガンマスロープから訴える値は何ですか?   3)データ形式に関しては、私のLCDはRGBストライプをサポートしています(LCDドキュメントはこれについての良い詳細を提供していません)、そして「RGB24」は合理的な結果で私のために働いています。Android HAL は HAL_PIXEL_FORMAT_RGB_565 .この観点から、IPU色空間変換の観点から見る必要があることはありますか?   4)LCDパネルのキャリブレーションに関する他のポインタまたはリファレンスはありますか?    ありがとうございます ロビン・シン Re: Gamma correction on i.MX6 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> OpenGL ES2.0は画像の歪みをフレームバッファに出力します 説明する: 1.下のコンピューターはレンダリングに OpenGL Es2.0 を使用します。 2.チップセレクトシェーダーはガンマ補正を使用しません。cat /dev/fb0 をファイルに保存すると、フレームバッファ内の画像が明らかになります。 3.チップセレクトシェーダーはガンマ補正(ガンマ値は2.2)を使用しています。cat /dev/fb0 でファイルにアクセスすると、フレームバッファ内の画像は元の画像とほとんど変わらず、各ピクセルの成分が1つずつ異なることがわかります。 4.フレームバッファサイズは720pです。ガンマ補正なしのフレームレートは50fps、ガンマ補正ありのフレームレートは20fpsです。テストの結果、フレームレートが低い理由は、プログラムが前面と背面のバッファのスワップ(関数:eglSwapBuffers)に多くの時間を費やしていることが分かりました。 5.質問: ガンマ補正を使用しないと画像が歪んでしまう GAMMA 補正を使用すると、eglSwapBuffers 関数に非常に長い時間がかかり、フレーム レートが非常に低くなります。 下記のリンクの方法を試してみましたが、うまくいきませんでした。何らかの情報(できれば実際の例)を提供してください。 https://community.freescale.com/docs/DOC-98062 https://github.com/rogeriorps/ipu-examples/commit/8c828cede9f3d3ef329368b2e3d06c604264ec8d
查看全文
双模式企业微微小区基站解决方案 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 演示所有者Jeff Steinheider   通过LTE传输视频流+WCDMA手机之间的电话在相同的BSC9132设备上转接。 观看此双模企业微蜂窝如何通过 NXP 的多模 LTE 和 WCDMA 第 1 层软件展示QorIQ 处理平台Qonverge BSC9132 SoC 的功能。     特性 LTE 和 WCDMA 同时运行 为企业和办公环境中的覆盖和容量问题提供解决方案 特色恩智浦产品 产品 链接 QorIQ Qonverge®平台:基带处理器 QorIQ Qonverge ®平台:基带处理器 | NXP QorIQ ® Qonverge BSC9132 双核处理器和双核 DSP QorIQ® Qonverge B9132 | NXP  VortiQa L1基带软件 https://www.nxp.com/design/software/development-software/vortiqa-software-for-networking/vortiqa-layer-1-baseband-software:VORTIQA_L1SW_SC?&tid=SWnT 面向微微小区开发的QorIQ ® Qonverge BSC9132 QDS https://www.nxp.com/design/qoriq-developer-resources/qoriq-qonverge-bsc9132-qds-for-picocell-base-station-development:BSC9132QDS?&parentCode=BSC9132 框图   通信基础设施
查看全文
NFCリーダーライブラリの移植用にCLEV663Bボードを準備します <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 最新のCLRC663用NFCリーダーライブラリは、LPCXpresso1769およびFRDM-K82ボードのみをサポートしているため、ライブラリを他のホストコントローラーに移植する場合は、最初にカスタムボードを作成するか、OM26630FDKを使用して https://www.nxp.com/docs/en/training-reference-material/NFC-READER-K64F.pdf?fsrch=1&sr=3&pageNum=1 で説明されている手順に従ってハードウェアを少し変更する必要がありますフロントエンドボードをホストコントローラーボードに接続しますが、今日は別の方法について説明します。 CLEV663B Blueboardは純粋なNFCフロントエンドボードであり、LPC1769に限定されないLPCXpressoボードとの接続をサポートしており、OM26630FDKとの主な違いはリーダーICであり、これはCLRC663 CLRC663プラスではありませんが、幸いなことにピンツーピン互換性があるため、CLRC663プラスに交換して、そのボードを移植目的で使用する可能性があります。 以前は: 後: 私の下手なはんだ付け技術を許してください... この新しいボードとLPC1769 Xpressoボードを使用すると、NfcrdlibEx1_BasicDiscoveryLoopデモなどの最新の5.12 NFCリーダーライブラリを実行できます。ただし、次の問題が発生する可能性があります。 これは、ver 5.12 で別の IO ピン セットを使用してリーダー IC に接続し、Board_Lpc1769Rc663.h のピン定義を変更するためですこの問題を解決できます。 最終結果は次のとおりです。 NFCリーダーライブラリver4.03を使用して、CLEV663BやLPC1769Xpressoなどのハードウェアをテストしてから、CLRC663プラスに置き換えることをお勧めします、そしてあなたが知っている、CLEV663B BlueboardはちょうどCLRC663用に最適化されているので、マッチング回路はCLRC663プラスに最適ではありません、デモを実行するのに十分です、したがって、移植が成功したかどうかを知ることができます、 ただし、CLRC663 Plusで最高のパフォーマンスを発揮したい場合は、アンテナのチューニングをやり直す必要があり、そのトピックの詳細については https://community.nxp.com/docs/DOC-335545 を参照してください。 リーダ・システム用MIFARE SAM NFCフロントエンド・ソリューション NFCリーダー・ライブラリ
查看全文
SDK 1.3.2 での RootFS の変更 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 場合によっては、ルートファイルシステムを変更してから、標準のSDKに従ってYoctoを使用してイメージを再構築したい場合があります。SDK マニュアルでは、QorIQ_SDK_Infocenter.pdf ドキュメントの第 2 章で必要な手順を説明しています。 次の例では、すでにSDKをインストールし、ホスト環境を設定していることを前提としています。また、あなたはすでに一度イメージをコンパイルしていて、それによってすでにfsl-setup-pokyスクリプトを実行していると思います。私はP3041DSシステムを使っています。私の場合、ビルドをセットアップするために最初に実行したのは:      source ./fsl-setup-poky -m p3041ds -j 4 -t 4 最初の例として、私のP3041DSシステムでは、イーサネットポートとしてfm1-gb4を使用しています。192.168.1.33という静的アドレスを割り当てたいです。そのためには、この機能を実装するための独自の/etc/network/interfacesファイルを作成する必要があります。 CDの bitbake -c cleansstate ネットベース 次に、netbaseフォルダに移動してください:      cd meta-fsl-ppc/recipes-append/netbase/files このディレクトリ内に、ターゲットのインターフェイスファイルを作成します。           auto lo iface、ログインネット、ループバック iface FM1-GB4 INET スタティック アドレス 192.168.1.33              netmask 255.255.255.0 ゲートウェイ 192.168.1.1 ネットワーク 192.168.1.0 この時点で、私は自分のイメージを再構築するだけです: ビットベイク FSL-image-core そして、ネットワーク定義がインストールされます。(私は fsl-image-core をビルドしていますが、現在使用している任意のターゲット、つまり fsl-image-minimal をビルドできることに注意してください) 2番目の例として、ビルド済みのバイナリ(カスタムアプリケーション)をrootfsに追加したいと思います。この例では、カスタムアプリケーションがあり、 mr_access を /usr にインストールします CDの 次に、ファイルを追加します。      cd meta-fsl-ppc-private/recipes-tools/merge-files さて、ファイルをファイル/マージに入れてください。mr_accessを files/merge/usr に追加しました 新しい rootfs イメージをビルドします。    ビットベイク FSL-image-core Qonverge Re: SDK 1.3.2でルートFSを変更しています <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> ガイドをありがとう。確かにとても役に立ちました。 meta-fs-ppcとmeta-fsl-ppc-privateという2つのディレクトリがあることに気付きました。これらの2つはyoctoの用語で「レイヤー」と呼ばれていると思いますか?ところで、これら2つのディレクトリの違いは何ですか?
查看全文
所有主板 U-boot <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 配置U-Boot LTIB 创建 Uimage Uboot U-boot FW Printenv FW 环境文件 在 LTIB 上添加新的 i.MX5x 板 i.MX25 PDK I.MX25 PDK U-boot 启动画面 I.MX25 PDK U-boot SDCard i.MX27 ADS 板 为 i.MX27ADS 编译 U-Boot 在 iMX27ADS 上安装 U-Boot i.MX31 ADS 板 i.MX31ADS编译Uboot I.MX31ADS 安装 Uboot i.MX31 PDK 板 i.MX 31 PDK 板截图 I.MX31 PDK 板闪烁 i.MX31 PDK 板 DirectFB i.MX51 EVK 板 i.MX51 EVK U-boot I.MX51EVK安装U-Boot i.MX51 EVK编译U-boot i.MX51 EVK 更改环境
查看全文
すべてのボードUブーツ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> U-Boot の構成 LTIB Uimage Ubootの作成 U-boot FW Printenv FW Env ファイル LTIBに新しいi.MX5xボードを追加 i.MX25 PDK I.MX25 PDK Uブートスプラッシュスクリーン I.MX25 PDK UブーツSDカード i.MX27 ADSボード u-Boot for i.MX27ADS のコンパイル iMX27ADSへのU-Bootのインストール i.MX31 ADSボード i.MX31ADS Uboot のコンパイル I.MX31ADS uboot のインストール i.MX31 PDKボード i.MX 31 PDK ボードのスクリーンショット I.MX31 PDKボードの点滅 i.MX31 PDKボードDirectFB i.MX51 EVKボード i.MX51 EVK Uブート I.MX51EVK U-Boot のインストール i.MX51 EVK コンパイル U-boot i.MX51 EVK 環境変更
查看全文
CodeWarrior 服务包安装 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 在一些帖子中我谈到了CodeWarrior-Eclipse组合可以带来的诸多优势。其中之一 与使用CodeWarrior的传统视图相比,服务包上的安装方式更加友好。这就是为什么我今天介绍CodeWarrior 工具快速入门安装服务包   如果您选择使用 CodeWarrior 这种既困难又好的方法来完成自己的工作,那么本快速入门将向您介绍如何为在 Windows 平台上运行的经典版本软件安装服务包或更新。   它逐步展示了如何手动正确地执行此操作,防止 IDE 充满您甚至不想使用的东西。 概述
查看全文
i.MX 6 系列 LDO 斜坡问题:Linux 和 Android 补丁现已发布 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 问题摘要: 我们曾收到客户报告,无法以 1GHz 或更高频率运行 MC 和 SC 生产部件。失败的特征是,一旦系统尝试从 800MHz 的启动频率提升到 1GHz 或更高,系统就会挂起。根本原因被追溯到生产部件中 LDO_VOLT_CHANGE_EN 保险丝的设置。LDO_VOLT_CHANGE_EN 保险丝将 LDO 启动电压设置为 1.15V(保险丝设置“1”表示)或 1.1V(保险丝设置“0”表示)。在生产部件中,保险丝设置为“1”,即 1.15V,因为这是基于特性数据的最佳设置。在预生产单元上,LDO 电压设置为 1.1V 的较低设置(即保险丝设置为“0”)。这是 MC/SC 部件的问题,因为保险丝在启动期间由 ROM 读取,并根据保险丝的设置覆盖 PMU_MISC2 寄存器中的 LDO 斜坡速率位。当 LDO_VOLT_CHANG_EN 保险丝设置为“1”时,LDO 上升到指定电压的时间将设置(在 PMU_MISC2 中)为 500uS,而不是 CPUFreq 驱动程序假设的 50uS。由于支持更高频率所需的电压尚未出现,因此当从启动频率转换到更高频率/电压点时,系统将挂起。实际上,拥有 i.MX 6Quad/6Dual/6DualLite 和 6 Solo 部件生产的客户无法将其产品频率提升至 1GHz 或更高。这个问题可以通过软件补丁完全解决,该补丁通过将 PMU_MISC_2 寄存器中的 LDO 斜坡设置设置回最快的斜坡时间来纠正。 请注意,LDO_VOLT_CHANGE_EN 保险丝不在参考手册中,因为它不是客户可见的保险丝。它在最终测试时被编程并锁定。 这是对所有客户的强制修复。 受影响的部件: i.MX 6Quad – 所有 SC 和 MC 部件,消费类和汽车类。工业 MC 零件尚未发货。 i.MX 6Dual – 所有 SC 和 MC 部件,包括消费类和汽车类。工业 MC 零件尚未发货。 i.MX 6DualLite – 所有 MC 部件均为消费部件。汽车和工业 MC 零件尚未发货。 i.MX 6Solo – 所有 MC 消费部件。汽车和工业 MC 零件尚未发货。 补丁可用性和位置: Linux 和 Android 都有补丁。它们可以在 freescale.com 上找到。请参阅下文了解更多详情。 i.MX 6Quad – www.freescale.com/imx6q i.MX 6Dual – www.freescale.com/imx6d i.MX 6DualLite – www.freescale.com/imx6dl i.MX 6Solo – www.freescale.com/imx6s 选择“软件和工具”选项卡,然后展开“更新和补丁”部分。相关补丁如下: Linux——L3.0.35_1.1.1_LDO_PATCH(i.MX 6四/6双) Linux – L3.0.35_3.0.3_LDO_PATCH(i.MX 6DualLite/6Solo) Android – IMX6_R13.4103_ANDROID_LDO_PATCH (i.MX 6Quad/6Dual/6DualLite/6Solo) 沟通推广: i.MX FAE:完成(通过邮件列表)。将于 3 月 1 日结束前将此电子邮件的副本发布到 i.MX 支持空间。 i.MX DFAE:3 月 8 日 。 客户通知:3月8 日 。 i.MX 社区:3 月 8 日 (与客户通知一致)。 我们还正在编写一份工程公告,为未使用我们提供的 Linux 和 Android BSP 的客户描述这一变化。目标日期:待定。但目标是在三月中旬左右推出。 顺祝商祺! 阿曼达和凯尔 本文档由以下讨论生成: i.MX 6 系列 LDO 斜坡问题:Linux 和 Android 补丁现已推出
查看全文