Multi Source Translation Content

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

Multi Source Translation Content

讨论

排序依据:
FreeRTOS LPUART ドライバの問題 こんにちは、 私は RT1176 ベースのボードを (現在は古い) mcux-sdk で使用していますが、問題は mcuxsdk でも同じようです (本当に紛らわしい名前です!)。 Freertos-LPUART ドライバー (fsl_lpuart_freertos.c) は、LPUART_RTOS_Init 関数で HAL_UartInit (fsl_adapter_lpuart.c) を呼び出しません。代わりに LPUART_Init だけを呼び出しますが、これでは不十分です。 問題は、フィールド s_UartState (fsl_fsl_adapter_lpuart.c の 719 行目) が LPUART_Init に書き込まれていないため、UART からの受信割り込みが発生するとアサーションが発生することです。 アサート エラー "NULL != uartHandle ": ファイル "D:\usr\TQM\mcuxsdk\core\components\uart\fsl_adapter_lpuart.c"行「433」関数名「HAL_UartInterruptHandle」 それで、このドライバーがどのように動作するのか疑問に思います。なぜなら、割り込みドライバーのハンドルの配列 s_UartState が読み取られるからです (そして、それは NULL です)。 SO、私が何か間違ったのでしょうか、それともこのドライバに問題があるのでしょうか?LPUARTS 用のより低い API ドライバを使用するには、コードを書き直す必要があるかもしれません。 ありがとう、さようなら オリバー i.MX RT Re: FreeRTOS LPUART driver problem こんにちは、 最新の mcux-sdk を備えた VSCode プラグインを使用しています。私たちは TQMa117xL ベースのボードを使用していますが、残念ながら BSP はまだ mcuxsdk に対応していません。 つまり、現時点では mcuxsdk でテストすることはできませんが、将来的には変更する予定です。 言及された例は新しいものですが、mcux-sdk では見つかりませんか?調べてみます。 アサーションは Init 関数の直後に発生します。 lpuart_rtos_config_t mSerConfig; lpuart_rtos_handle_t mRtosHandle; _lpuart_handle mUartHandle; mRtosHandle = {}; mUartHandle = {}; mSerConfig = {}; mSerConfig.srcclk = CLOCK_GetRootClockFreq(kCLOCK_Root_Lpuart9); mSerConfig.base = LPUART9; mSerConfig.baudrate = aBaudrate; mSerConfig.parity = kLPUART_ParityDisabled; mSerConfig.stopbits = kLPUART_OneStopBit; mSerConfig.buffer = mReadBuf; mSerConfig.buffer_size = sizeof(mReadBuf); mSerConfig.enableRxRTS = true; mSerConfig.enableTxCTS = true; int status = LPUART_RTOS_Init(&mRtosHandle, &mUartHandle, &mSerConfig); コードは C++ クラス内にありますが、init コードを例と比較します。 さよなら、 オリバー Re: FreeRTOS LPUART driver problem こんにちは@Oliver_Rさん、 次の質問について教えていただけますか? VS Code または MCUXpresso を使用していますか? mcuxsdk でテストすると、問題は解決しますか? VS Code には、evkbmimxrt1170_freertos_lpuart_cm7 というサンプル プロジェクトがあります。あなたのハードウェアで動作するかどうかのテストを手伝ってもらえますか? よろしくお願いします、 パブロ Re: FreeRTOS LPUART driver problem こんにちは、 その間に、これが FreeRTOS-Uart ドライバだけでなく、基礎となる lpuart ドライバにも関連していることが分かりました。 残念ながら、SDKドキュメントやフォーラムではHAL_Uartドライバーに関する情報は見つかりませんでした。 HAL_Uartxxx-API (fsl_adapter_lpuart.c) が必要な理由は何ですか?なぜ、いつ使用すればよいのでしょうか?SDK 全体で HAL_UartInit を使用しているソースは、debug_console_lite フォルダー内の fsl_component_serial_port_uart.c と fsl_debug_console.c の 2 つだけです。 この API に関する問題は、fsl_adapter_lpuart.c が「HAL_UART_TRANSFER_MODE=1」を定義せずにコンパイルされると、すべての lpuart 割り込みがこのソースで定義され、受信 IRQ でのアサーションを回避するために HAL_UartInit を使用する必要があることです。また、IRQ はすでに定義されているため、独自の IRQ を登録する必要はなくなりました。 しかし、すべての UART の例では HAL_UART_TRANSFER_MODE=1 が設定されておらず、一部の例では独自の IRQ が定義されているため、これがどのように機能するのか疑問に思います。DEBUG_CONSOLE_TRANSFER_NON_BLOCKING を定義していますが、「utility_debug_console_lite」コンポーネントは使用していません。 ところで、「utility_debug_console」と「utility_debug_console_lite」の違いは何でしょうか?SDK ドキュメントは両方のコンポーネントで同じですか? このドライバー コード全体を理解するのは非常に困難です。プリプロセッサ マジックが非常に多く、ドキュメントが非常に少ないためです。 SO、ソース「fsl_adapter_lpuart.c」は、lpuart IRQ を望ましくない方法で定義し、デバッグ コンソール lpuart 以外の lpuart を使用するときにアサーションを引き起こすため、コンパイルしてはならないという印象を受けます。 さよなら、 オリバー Re: FreeRTOS LPUART driver problem ハイ この問題は freertos の実装ではなく、lpuart ドライバに直接起因しているようだと述べています。 LPUART の例をベアメタルでテストすると動作しますか? MCUXpresso を使用してこれをテストすることもできますか? utility_debug_console と utility_debug_console_lite の詳細な説明は、SDK API リファレンス・マニュアルに記載されています。 MCUXpresso SDK APIリファレンス・マニュアル: デバッグコンソール MCUXpresso SDK APIリファレンス・マニュアル: デバッグコンソールLite よろしくお願いします、 パブロ Re: FreeRTOS LPUART driver problem そこで、何時間もかけてドライバ コードをデバッグし、UART コードのすべてのプリプロセッサ マジックを理解しようとした結果、ようやくこの動作の理由が分かりました。そして、それは確かに FreeRTOS API とは関係ありません。 SDK の hello world の例に記載されているフラグを設定すると、問題が発生します。 「高度なデバッグ コンソール ユーティリティを使用するには、プロジェクトで DEBUG_CONSOLE_TRANSFER_NON_BLOCKING を定義するだけです。」 非ブロッキング コンソールはコードのタイミングをそれほど妨げないので、そうするのは良いアイデアだと思いました。しかし、このオプションには、どこにも言及も文書化もされていない壊滅的な副作用があります。 スタートアップ コード (startup_mimxrt1176_cm7.c) は、LPUART IRQ を次のように定義します。 WEAK void LPUART10_IRQHandler(void) { LPUART10_DriverIRQHandler(); } SO、IRQ は LPUART ドライバーにルーティングされますが、これは問題ありません。 ただし、DEBUG_CONSOLE_TRANSFER_NON_BLOCKING を定義すると、fsl_adapter_lpuart.c ですべての LPUART の IRQ (コンソール LPUART1 の IRQ だけでなく) が上書きされ、次のようになります。 void LPUART10_IRQHandler(void); void LPUART10_IRQHandler(void) #endif /* LP_FLEXCOMM10 */ { HAL_UartInterruptHandle(10); SDK_ISR_EXIT_BARRIER; } #endif #endif /* LPUART10 */ HAL_UartInterruptHandleには次の行があります hal_uart_state_t *uartHandle = s_UartState[instance]; HAL_UartInit を使用していない場合は、その後アサーションが発生します。 言い換えると、DEBUG_CONSOLE_TRANSFER_NON_BLOCKING を設定すると、既存の (HAL_xxx 以外の) UART コードがすべて失敗します。 ドライバ コードを確認してください。これは本当に悪い、侵入的、悪意のあるオプションであり、実際に使用する場合は、厳重な警告を出す必要があります。 私の意見では、この定義は副作用がひどいので SDK から削除する必要があります。どの SDK サンプルでもこのオプションが設定されていないのは不思議ではありません。 残念ながら、私の質問のいくつかには誰も答えてくれなかったので、もう一度ここに書きます。 1.HAL_Uartxxx-API (fsl_adapter_lpuart.c) が必要な理由は何ですか?なぜ、いつ使用すればよいのでしょうか? 2. 「utility_debug_console」と「utility_debug_console_lite」の違いは何ですか?SDK ドキュメントは両方のコンポーネントで同じですか? したがって、SDK ドキュメントを再度示さないでください。すでに読んでいますが、「完全な説明」には違いについて何も記載されていません。 さよなら、 オリバー Re: FreeRTOS LPUART driver problem こんにちは、 HAL に関しては、通常、異なる MCU プラットフォーム間での移植性が必要な場合に使用されます。 詳細については、「MCUの潜在能力を拡張するには新しい考え方が必要な理由 | NXP Semiconductors」をご覧ください。 サポートされるデバッグ コンソールのハードウェア デバイス タイプはそれぞれ異なり、UART (lite) のみをサポートするものもあれば、UART、USB、および SWO をサポートするものもあります。 ドキュメントの Web ページに記載されている内容としては、たとえば、API を使用するために必要なパラメーターであるシリアル インターフェースがサポートされていること、たとえば、Advance の場合はインターフェースに応じて情報がどのように印刷されるかを示す完全な表があり、Lite では同数のインターフェースがサポートされていないため、表示される情報は限られていることなどが挙げられます。 他にご質問がございましたらお知らせください よろしくお願いします、 パブロ
查看全文
当 SDK 示例按预期运行时 FlexPWM 中断在 Zephyr 中未触发 Zephyr4.3.0 MCUExpresso SDK2.16 用于示例 AN14196 的应用笔记 板使用了 mcx_n9xx_evk/ mcxn947/cpu0 说明: 我试图在 Zephyr OS 中复制一个 NXP SDK FlexPWM 示例。主要目标是重现 SDK 行为: 使用 FlexPWM 外设生成一个简单的 PWM 信号。 在计算指定数量的 PWM 边缘后(通过 E-捕获)执行回调(中断处理程序)。 SDK 行为(工作): 使用 SDK pwm.c 示例,可以正确生成 PWM 信号。 FlexPWM 中断如期触发。 一旦达到配置的边数,回调函数就会执行。 Zephyr 行为(问题): 使用 Zephyr,我能够利用 FlexPWM 外设成功生成 PWM 信号。 但是,FlexPWM 中断永远不会被触发,也永远不会执行回调函数。 (IRQ_CONNECT(120, 0, FLEXPWM1_SUBMODULE0_IRQHandler, NULL, 0);用于将中断线路连接到 IRQHandler ) 迄今已完成的调试和调查: 我比较了 FlexPWM 寄存器之间的配置: SDK 示例(pwm.c) Zephyr 应用程序(main.c) 在外设设置阶段,所有相关寄存器的值似乎都匹配。 我禁用了 Zephyr 电源管理单元,通过添加以下配置来确保 CPU 不会进入低功耗状态   CONFIG_PM=n CONFIG_PM_DEVICE=n 此更改并未影响行为——中断仍未触发。 引脚上的 PWM 输出正确,这表明外设时钟和基本配置正常。 问题/求助: 在启用 FlexPWM 中断(例如 IRQ 配置、ISR 注册、时钟门控或 NVIC 设置)时,是否有与 SDK 不同的 Zephyr 特定要求? 为了确保 FlexPWM 中断得到正确路由和处理,在 Zephyr 中是否还需要执行其他操作? Zephyr 中是否存在已知限制或缺少对 FlexPWM 边沿计数中断的支持? 如能就如何在 Zephyr 中正确启用和处理 FlexPWM 中断提供指导,将不胜感激。 谢谢! Re: FlexPWM interrupt not triggering in Zephyr while SDK example works as expected 你好@wima88 编译后,请检查 .config 文件,确认中断已启用。 你也可以发给我,我帮你检查。   谢谢。   BR 爱丽丝     Re: FlexPWM interrupt not triggering in Zephyr while SDK example works as expected 嗨,爱丽丝 、 我扫描了 .config并没有发现任何可疑之处。我上传了 .config因为不支持 .config,所以必须重命名)。 在进一步调查 Zephyr 基本设置后,我发现 Zephyr 和 MCUX SDK 在行为上存在以下差异: 尽管 Zephyr 和 SDK 之间的 FlexPWM 寄存器配置和值相同,但初始化后,Zephyr 中的外围设备本身永远不会触发中断。 在 MCUX SDK 中,我可以观察到SM0STS 寄存器位 CFB0 和 CFB1 被周期性设置,从而产生了预期的中断行为。 在 Zephyr 中,这些相同的状态位(SM0STS->CFB0 和 SM0STS->CFB1)从未被设置,尽管如此: 外设设置相同 PWM 输出正确 在初始外设设置期间,SDK 和 Zephyr 都会自动设置一次这些位,并且在初始设置期间,两个环境都会执行一次 IRQ 处理程序。 不过,在执行初始 IRQ 之后,Zephyr 将不再拨动中断状态位,也不会再发生中断。 与此相反,MCUX SDK 会继续定期切换这些状态位,从而导致重复的中断回调。 这表明,尽管在 Zephyr 中初始中断路径是正常的,但之后 FlexPWM 外设不会继续产生中断事件,尽管寄存器配置完全相同。 如果能深入了解为什么 FlexPWM 状态位(CFB0/CFB1)没有在 Zephyr 中设置,或者是否需要额外的 Zephyr 特定处理以启用定期中断生成,我们将不胜感激。 Re: FlexPWM interrupt not triggering in Zephyr while SDK example works as expected 你好@wima88 感谢您的耐心等待。我向我们内部的 Zephyr 专家进行了确认。在您的项目中,您使用的是 MCUXpresso SDK 驱动程序,而不是 Zephyr 驱动程序。这可能会造成潜在的冲突。 您的应用程序使用 Flexcomm1 子模块 0,FRDM-MCXN947 板的 Zephyr 设备树中也启用了该子模块 0。如果启用,Zephyr 将在 main() 执行之前在启动代码中初始化FlexPWM 驱动程序。 因此,如果您选择像现在这样在应用程序中配置 FlexPWM,则应禁用 devicetree 中的 FlexPWM 节点,以避免冲突。 谢谢! BR 爱丽丝 Re: FlexPWM interrupt not triggering in Zephyr while SDK example works as expected 谢谢。我知道可能会有冲突,因为 Zephyr 会在执行 main() 之前初始化 FlexPWM 驱动程序。 不过,我需要验证一点:如果我没弄错的话,Zephyr 的 devicetree 也在通过 pinctrl 处理引脚复用器配置。如果我禁用了设备树中的flexpwm1节点以避免冲突,那么我是否需要在我的应用程序代码中手动设置引脚复用器配置,还是即使禁用了该节点,pinctrl设置也会保持活动状态?   维曼沙 Re: FlexPWM interrupt not triggering in Zephyr while SDK example works as expected 你好@wima88 ” 如果我没错的话,Zephyr 的 devicetree 也在通过 pinctrl 处理引脚多路复用器配置。如果我禁用设备树中的 flexpwm1 节点以避免冲突,那么我是否需要在我的应用程序代码中手动设置引脚复用器配置,“ ->> 是的。 BR 爱丽丝
查看全文
i.MX RT1060 QTMR カスケードモード(入力キャプチャ付き) - 上限カウントなし 32 ビット カウンターの 2 つの TMR チャネルをカスケード接続すると、入力キャプチャが正常に動作しないようです。入力キャプチャは、1 つのチャネルのみを使用する場合は正常に機能しますが、チャネルをカスケードしようとすると機能しません。 1.TMR1 ch0 および ch1 構造が定義されています。TMR1 ch0のクロックソースはkQTMR_ClockDivide_1、TMR2 ch1のクロックソースはkQTMR_ClockCounter0Outputです。 2. qtmr_begin はチャネルを初期化します。フリーランニングに設定されています。TMR1 IRQが有効です。入力キャプチャに対して TMR1 割り込みが有効になります。タイマーが開始されます。 getCount を呼び出すと、上位カウント (チャネル 1) に対して 0 のみが返されます。それ以外の場合、上位カウントを無視すると、下位カウントは常に正しいものになります。 const qtmr_config_t QuadTimer_1_Channel_0_config = { .primarySource = kQTMR_ClockDivide_1, .secondarySource = kQTMR_Counter0InputPin, .enableMasterMode = false, .enableExternalForce = false, .faultFilterCount = 0, .faultFilterPeriod = 0, .debugMode = kQTMR_RunNormalInDebug }; const qtmr_config_t QuadTimer_1_Channel_1_config = { .primarySource = kQTMR_ClockCounter0Output, .secondarySource = kQTMR_Counter0InputPin, .enableMasterMode = false, .enableExternalForce = false, .faultFilterCount = 0, .faultFilterPeriod = 0, .debugMode = kQTMR_RunNormalInDebug }; void qtmr_begin() { QTMR_Init(TMR1, kQTMR_Channel_0, &QuadTimer_1_Channel_0_config); QTMR_Init(TMR1, kQTMR_Channel_1, &QuadTimer_1_Channel_1_config); /* Ensure free-running (no stop at compare) */ TMR1->CHANNEL[kQTMR_Channel_0].CTRL &= ~TMR_CTRL_LENGTH_MASK; TMR1->CHANNEL[kQTMR_Channel_1].CTRL &= ~TMR_CTRL_LENGTH_MASK; /* Setup the input capture */ QTMR_SetupInputCapture(TMR1, kQTMR_Channel_0, QTMR_CounterInputPin, false, true, kQTMR_RisingEdge); /* Enable at the NVIC */ EnableIRQ(TMR1_IRQn); /* Enable timer compare interrupt */ QTMR_EnableInterrupts(TMR1, kQTMR_Channel_0, kQTMR_EdgeInterruptEnable); QTMR_StartTimer(TMR1, kQTMR_Channel_0, kQTMR_PriSrcRiseEdge); QTMR_StartTimer(TMR1, kQTMR_Channel_1, kQTMR_CascadeCount); } void TMR1_IRQHandler(void) { QTMR_ClearStatusFlags(TMR1, kQTMR_Channel_0, kQTMR_EdgeFlag); qtmrIsrFlag = true; } void getCount(void) { // Discard the first capture for (int i = 0; i < 2; i++) { while (!qtmrIsrFlag) { } qtmrIsrFlag = false; uint16_t lowerCount = TMR1->CHANNEL[kQTMR_Channel_0].CAPT; uint16_t upperCount = TMR1->CHANNEL[kQTMR_Channel_1].HOLD; uint32_t counterValue = ((uint32_t)upperCount << 16) | lowerCount; } } i.MXRT 106x Re: i.MX RT1060 QTMR Cascade mode w/ Input Capture - No Upper Count 私はこれをある程度理解しました。上位 (チャネル 1) のカウントを読み取るために間違ったレジスタを使用していました。HOLD レジスタは、カスケード チャネルのカウントを保持するのではなく、ハードウェアまたはソフトウェアの特定のイベント中にカウンター値を保存するために使用されます。通常は、イベントを同期したり、以前の値を保持したりするために使用されます。 単に CNTR レジスタを読み取る必要があります。IRQ ハンドラーですぐに読み取ることも、直後に読み取ることもでき、下位 16 ビットに同期されます。 しかし、私が理解できない別の問題が見つかりました。チャネル 1 のタイマーを 0 にリセットすると、カウントは常に 0 ではなく 1 から開始されます。SO、キャプチャされた時間は、(チャネル 1) の上位カウントで常に 1 ずれます。これを補うために、正しいカウントを取得するには、チャネル 1 のカウンターを 0xFFFF にリセットする必要があります。なぜ? const qtmr_config_t QuadTimer_1_Channel_0_config = { .primarySource = kQTMR_ClockDivide_1, .secondarySource = kQTMR_Counter0InputPin, .enableMasterMode = false, .enableExternalForce = false, .faultFilterCount = 0, .faultFilterPeriod = 0, .debugMode = kQTMR_RunNormalInDebug }; const qtmr_config_t QuadTimer_1_Channel_1_config = { .primarySource = kQTMR_ClockCounter0Output, .secondarySource = kQTMR_Counter0InputPin, .enableMasterMode = false, .enableExternalForce = false, .faultFilterCount = 0, .faultFilterPeriod = 0, .debugMode = kQTMR_RunNormalInDebug }; void qtmr_begin() { QTMR_Init(TMR1, kQTMR_Channel_0, &QuadTimer_1_Channel_0_config); QTMR_Init(TMR1, kQTMR_Channel_1, &QuadTimer_1_Channel_1_config); /* Ensure free-running (no stop at compare) */ TMR1->CHANNEL[kQTMR_Channel_0].CTRL &= ~TMR_CTRL_LENGTH_MASK; TMR1->CHANNEL[kQTMR_Channel_1].CTRL &= ~TMR_CTRL_LENGTH_MASK; /* Setup the input capture */ QTMR_SetupInputCapture(TMR1, kQTMR_Channel_0, QTMR_CounterInputPin, false, true, kQTMR_RisingEdge); /* Enable at the NVIC */ EnableIRQ(TMR1_IRQn); /* Enable timer compare interrupt */ QTMR_EnableInterrupts(TMR1, kQTMR_Channel_0, kQTMR_EdgeInterruptEnable); QTMR_StartTimer(TMR1, kQTMR_Channel_1, kQTMR_CascadeCount); QTMR_StartTimer(TMR1, kQTMR_Channel_0, kQTMR_PriSrcRiseEdge); } void TMR1_IRQHandler(void) { QTMR_ClearStatusFlags(TMR1, kQTMR_Channel_0, kQTMR_EdgeFlag); qtmrIsrFlag = true; } void getCount(void) { // Discard the first capture uint16_t lowerCount; uint16_t upperCount; uint32_t counterValue; for (int i = 0; i < 2; i++) { /* Reset channel 1 count to 0 - for some reason we have to reset to one value before or the count is off by 1...so we reset to 0xFFFF */ TMR1->CHANNEL[kQTMR_Channel_1].CNTR = 0xFFFF; while (!qtmrIsrFlag) { } qtmrIsrFlag = false; lowerCount = TMR1->CHANNEL[kQTMR_Channel_0].CAPT; upperCount = TMR1->CHANNEL[kQTMR_Channel_1].CNTR; counterValue = ((uint32_t)upperCount << 16) | lowerCount; } } Re: i.MX RT1060 QTMR Cascade mode w/ Input Capture - No Upper Count こんにちは@azone 、 弊社の製品にご興味をお持ちいただき、またコミュニティをご利用いただき誠にありがとうございます。 QTMR カスケード モードと入力キャプチャの併用に関するご質問に基づいて検証テストを行いました。 ハードウェア: MIMXRT1060‑EVKB、入力信号をJ33-6に接続します。 ソフトウェア: QTMR3 チャネル 0 とチャネル 1 をカスケード モードで構成 この設定を使用すると、カウンターがカスケードされている間も入力キャプチャは正常に機能します。 エッジ割り込みフラグが設定されている場合は、キャプチャレジスタを読み取ることができます。 mayliu1_0-1768206759574.png BOARD_QTMR_BASEADDR->チャネル[BOARD_QTMR_INPUT_CAPTURE_CHANNEL0].CAPT; および BOARD_QTMR_BASEADDR->チャネル[BOARD_QTMR_INPUT_CAPTURE_CHANNEL1].CAPT; よろしくお願いいたします。 メイリュー Re: i.MX RT1060 QTMR Cascade mode w/ Input Capture - No Upper Count こんにちは。返信ありがとうございます。設定から、カスケード チャネル 1 のカウントを取得する最適な方法は、CNTR レジスタの読み取りに頼るのではなく、このチャネルの入力キャプチャも設定して CAPT レジスタを読み取ることであることがわかります。 これは機能します。しかし、チャネル 1 では依然として値が 1 つ高くカウントされます。私は SDK の API を使用しており、直接レジスタを操作しているわけではありませんが、私の設定はあなたの設定と同じようです。 何が起こるかの例として、150MHz の TMR クロックで 1kHz 信号を入力すると、150,000 というカウントが予想されます。これは、上位 16 ビットのカウントが '2'、下位 16 ビットのカウントが '18928' = 150,000 になります。ただし、上限は「3」になります。測定されたどの周波数でも常に +1 ずれます。なぜそうなるのでしょうか? const qtmr_config_t QuadTimer_1_Channel_0_config = { .primarySource = kQTMR_ClockDivide_1, .secondarySource = kQTMR_Counter0InputPin, .enableMasterMode = false, .enableExternalForce = false, .faultFilterCount = 0, .faultFilterPeriod = 0, .debugMode = kQTMR_RunNormalInDebug }; const qtmr_config_t QuadTimer_1_Channel_1_config = { .primarySource = kQTMR_ClockCounter0Output, .secondarySource = kQTMR_Counter0InputPin, .enableMasterMode = false, .enableExternalForce = false, .faultFilterCount = 0, .faultFilterPeriod = 0, .debugMode = kQTMR_RunNormalInDebug }; void qtmr_begin() { CLOCK_EnableClock(kCLOCK_Timer1); QTMR_Init(TMR1, kQTMR_Channel_0, &QuadTimer_1_Channel_0_config); QTMR_Init(TMR1, kQTMR_Channel_1, &QuadTimer_1_Channel_1_config); /* Explicitly disable secondary source - not supported in API and not necessary but doing it anyways */ TMR1->CHANNEL[kQTMR_Channel_0].CTRL &= ~TMR_CTRL_SCS_MASK; TMR1->CHANNEL[kQTMR_Channel_1].CTRL &= ~TMR_CTRL_SCS_MASK; /* Ensure free-running (no stop at compare) */ TMR1->CHANNEL[kQTMR_Channel_0].CTRL &= ~TMR_CTRL_LENGTH_MASK; /* Setup the input capture */ QTMR_SetupInputCapture(TMR1, kQTMR_Channel_0, kQTMR_Counter0InputPin, false, true, kQTMR_RisingEdge); QTMR_SetupInputCapture(TMR1, kQTMR_Channel_1, kQTMR_Counter0InputPin, false, true, kQTMR_RisingEdge); /* Enable at the NVIC */ EnableIRQ(TMR1_IRQn); /* Enable timer compare interrupt */ QTMR_EnableInterrupts(TMR1, kQTMR_Channel_0, kQTMR_EdgeInterruptEnable); } void TMR1_IRQHandler(void) { uint16_t lowerCount; uint16_t upperCount; QTMR_ClearStatusFlags(TMR1, kQTMR_Channel_0, kQTMR_EdgeFlag); qtmrIsrFlag = true; lowerCount = TMR1->CHANNEL[kQTMR_Channel_0].CAPT; upperCount = TMR1->CHANNEL[kQTMR_Channel_1].CAPT; // UPPER COUNT IS ALWAYS OFF BY +1 } void getCount(void) { uint32_t counterValue; while (!qtmrIsrFlag) { } qtmrIsrFlag = false; counterValue = ((uint32_t)upperCount << 16) | lowerCount; } } Re: i.MX RT1060 QTMR Cascade mode w/ Input Capture - No Upper Count こんにちは@azoneさん、 最新情報をありがとうございます。 あなたの新しい質問に関して、私もテストをしました。150MHzのTMRクロックで1kHzの信号を入力すると、正しい値が得られます。 HW: MIMXRT1060-EVKB、J33-6に1KHZ信号を入力します。 SW: 前回の投稿を参照してください。 mayliu1_2-1768290894570.png mayliu1_1-1768290710042.png よろしくお願いします メイリュー Re: i.MX RT1060 QTMR Cascade mode w/ Input Capture - No Upper Count わかりました。テストしていただきありがとうございます。設定にエラーがあるはずです。ハードウェアを変更して、16 ビット QTMR の代わりに 32 ビット GPT を使用することができたので、カスケード モードを使用する必要がなくなりました。ただし、これを見るかもしれない他の人を助けるために、少し時間をかけてエラーを探し、この投稿を更新してみようと思います。
查看全文
LPC5536:我在真正的漏极开路引脚上测量 VCC。 你好 LPC55(S)xx 系列有两个真正的漏极开路引脚: https://www.nxp.com/docs/en/application-note/AN13033.pdf PIO0_13 和 PIO0_14 是真正的漏极开路引脚。 我用自己的 LPC5536 板测试了这个: 当我不配置 PIO0_13(64 引脚封装上的引脚 #46)时,该引脚处于浮空状态(即高阻抗,如数据表中所述 " Z ")。 当我将 PIO0_13 配置为 GPIO 并输出时,当设置为高电平时,我测量到的电压为 3.3 V(即 VCC)。 我想知道这是为什么? 数据表显示"真正的开漏引脚。[...] 该引脚需要外部上拉才能提供输出功能。 [开漏配置适用于该引脚的所有功能。" 换句话说,只要该引脚未连接到外部电路,该引脚上就不应有任何电压。 知道我为什么要测量这个电压吗? 谢谢。 丹尼尔 Re: LPC5536: I measure VCC at true open drain pins. 由于恩智浦管理层的高超智慧,编辑时间窗口已缩短至几分钟。因此,我必须单独添加这个帖子: 只有当我明确将引脚PIO0_13配置为漏极开路时(通过引脚工具),该引脚才会表现为漏极开路。 如果这种行为是预料之中的,那么我就不明白数据手册中的说法,即该引脚上没有独立于所选功能的输出(或者数据手册的说法不正确)。 请注意以下观察结果:如果 PIO0_13 配置为 OD 并设置为高电平,我可以轻松地 " 将 " 这个引脚(例如,触摸它)浮动到比如 6 V 的电压。这远远超出了 " 普通 " GPIO 引脚所允许的范围。通常 " 普通 " 引脚会实现保护二极管,保护二极管会将电压降低到 3,3 V + Vforward,如参考手册中所述: danielholala_0-1767880597403.png 因此,这也许就是"真正的开漏" 引脚与"普通" 引脚的区别? 如有任何意见,我们将不胜感激。 干杯 Daniel Re: LPC5536: I measure VCC at true open drain pins. 你好,丹尼尔、 您能帮助我们分享以下信息吗? 您正在测试 SDK 示例吗? 你在使用恩智浦板还是 LPC5536 定制板?如果是这样,您能否在示意图中与我们分享您与 PIO0_13 的连接? 您能为我们提供有关这枚勋章用途的信息吗? 在参考手册第 7.2.1 章功能中,评论说 PIO_13 和 PIO_14 是 I2C/MFIO(多功能输入输出)的组合,这是与标准引脚配置 [MFIO] 的区别;在第 7.3 章中,[图 8] 是该配置的示例,以与标准 GPIO 引脚配置进行比较 [图 7]。 此外,要审查您的定制电路板设计以及硬件设计指南 [AN13707],恩智浦建议您查看EVK电路板设计文件进行验证。 LPC5536 EVK 板文件的链接在这里 LPC5536-EVK 设计文件 在评估板中,P0_13和P0_14连接到上拉电阻,因此预计测量电压为3.3V,并且只有在配置后才会起到开路漏极的作用。 顺祝商祺!
查看全文
MCXA346 3路ADC同步采集的问题 你好 我看了数据手册MCXA有4个ADC,然后手册上写ADC0可以触发所有的ADC采集再同一时刻。 所有我在frdmmcxa346_lpadc_trigger_exception例程的基础上,加上了Ctimer0的MR1,0.5ms周期性触发ADC采集,每个ADC配置的采集1个通道。 现在的问题是只能进入ADC0的中断(是按照定时器周期触发的),ADC1和ADC2中断进不去。 这个同步采集,是这样用的吗?难道是我理解错了吗? 我把我的工程附在附件里了。 MCXA Re: MCXA346 3路ADC同步采集的问题 你好@346500452 我查看了您的代码。请进行以下更改,然后进行测试: 为 ADC2 启用硬件触发信号。 将 ADC1 和 ADC2 配置为同时使用触发信号控制寄存器 0。在 INPUTMUX 中,路由到 ADC1_TRIG0 和 ADC2_TRIG0。 Alice_Yang_0-1767845363629.png Alice_Yang_1-1767845368287.png 如果仍不工作,则禁用 ADC0 和 ADC2,并检查 ADC1 是否正常工作。 谢谢! BR 爱丽丝 Re: MCXA346 3路ADC同步采集的问题 你好,爱丽丝     谢谢。我已经解决了上述的问题。     需要补充的一点是,在debug的时候,需要开启overflow中断,并rst FIFO,否则会在debug暂停的时候产生overflow,而且ADC会自动停止。全速运行时不会存在这个问题。 if (status & kLPADC_ResultFIFO0OverflowFlag) { LPADC_ClearStatusFlags(ADC0, kLPADC_ResultFIFO0OverflowFlag); LPADC_DoResetFIFO(ADC0); } 下一步,我打算加上DMA来搬运ADC完成采集的数据,我现在是用的3路ADC,是需要用DMA的3个通道来搬运吗,有其他更好的方法吗?     谢谢 Re: MCXA346 3路ADC同步采集的问题 Hello @346500452  是的,需要3个通道DMA来搬运。因为您使用的是3个ADC并发,每个ADC需要各自的DMA通道。 BR Alice
查看全文
Rev.G Vybrid Tower 主板的非官方用户手册。 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Rev.G Vybrid Tower 主板的非官方用户手册。 (如果加载不正确,请跳过第 1 页 - 那里只有标题。) <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Rev.G Vybrid Tower 主板的非官方用户手册。 (如果加载不正确,请跳过第 1 页 - 那里只有标题。) OpenSDA 塔板 VF6xx
查看全文
使用 26MHz XTAL 操作 KW36 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 默认情况下,FRDM-KW36 板包含一个 32MHz XTAL (YI),如图1所示,但在某些情况下,FRDM-KW36 或定制 KW36 板需要 26MHz XTAL 而不是 32MHz XTAL。   图 1.FRDM-KW36 原理图上的 32MHz XTAL 无线连接演示来自 FRDM-KW36 软件开发套件默认配置为使用 32MHz XTAL 运行,但可以很容易地修改软件以使用 26MHz XTAL 运行。 按照以下步骤配置 FRDM-KW36 无线连接演示,以使用 26MHz XTAL 进行操作: 1.在clock_config.h中文件中,将BOARD_XTAL0_CLK_HZ定义从32000000U更改为26000000U ,如图2所示。   图 2. BOARD_XTAL0_CLK_HZ 在 clock_config.h 中定义 2.在预处理器中添加RF_OSC_26MHZ=1行: 如果使用 IAR IDE: 右键单击您的项目,然后单击选项(图 3 )。 图 3. IAR 项目选项 转到 C/C++ 编译器选项卡,然后是预处理器,并在定义符号窗口中添加 RF_OSC_26MHZ=1 行(图 4 )。 图 4. IAR 预处理器 如果使用 MCUXpresso IDE: 右键单击您的项目,选择属性,转到 C/C++ Build 下的设置,然后转到 MCU C Compiler 下的预处理器(图 5 )。 图 5. MCUXpresso 预处理器 点击定义符号中的添加按钮,写入RF_OSC_26MHZ=1,点击确定完成(图6 )。 图 6.MCUXpresso 定义的符号 最后,重新编译您的项目,它就可以使用 26MHz XTAL 进行操作了。 FRDM-KW36 SDK 可以从MCUXpresso 网页下载。 BLE软件 千瓦
查看全文
RT1050 のさまざまなメモリの起動時間 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 私が取り組んだ小さなプロジェクトは、RT1050の起動がさまざまなメモリタイプからどのように実行されるかを理解することでした。SDK の LED_blinky コードをベースラインとして使用し、EVKB ボードでいくつかのテストを実行しました。私が収集したデータと、より詳細なテスト手順を以下に説明します。 テスト手順 起動時間は、プロセッサが最初に電力を受け取る時間から、main() 関数からコードの最初の行を実行するまでの時間として定義されます。 オシロスコープ(Tektronix TDS 2014)を使用して、POR_B*信号の立ち上がりエッジから次の2点までの時間を測定しました。 FlexSPI_CSアサート(ROMによるFlexSPIの最初の読み取り)** GPIOアプリケーションコード内のトグル(コード実行の開始を通知します)。 *POR_B信号は、ヘッダーJ26-1を介してスコープに使用できました **FlexSPI_CS信号は、ボード上の小さなプルアップ抵抗R356を介して利用できます。この抵抗器の横に細いワイヤーをはんだ付けし、オシロスコープでプローブしました。 使用されたGPIOピンは、USER_LEDに接続したものと同じものでした(アクティブロー)。このピンは、ヘッダー J22-5 を介してスコープを設定できます。 TP 2、3、4、および5は、オシロスコープのプローブを接地するために使用されます。これはすべてEVKB評価ボードで行われました。 ここでは、テストの実行に関する注目すべき点をいくつか紹介します。 このレポートでは、POR_B シグナルの上昇からコードの最初の行の実行までの時間を中心に強調しています。ただし、最初にボードに電源が供給されてからPOR_Bシステムが立ち上がるまでには時間があります。これはパワーエレクトロニクスの問題であり、ユーザーのアプリケーションや設計によって異なります。このため、このレポートではこれにあまり重点を置きません。 アプリケーションの最初の実際のコード行は、実際にはプロセッサのいくつかのピンを構成しています。これらのピンが実行された後にのみ、GPIOがローに切り替わり、オシロスコープで時間が取得されます。ただし、これらのコンフィギュレーション コード行は非常に高速に実行されるため、テストの時間は無視されます。 クロック構成 ブート可能なイメージは、3 つのケースすべてで RT1050 にフラッシュされました。その後、MCUXpresso で、デバッガーは "Attach Only" を true に設定して構成されました。次に、デバッグ セッションが起動され、プロセッサがコードの実行を終了した後、RT1050 リファレンス マニュアルの第 18 章「CCM ブロック図」に従って一時停止し、レジスタ値が読み取られました。 ブート構成: コアクロック (MHz) * FlexSPIクロック(MHz) SEMCクロック(MHz) FlexSPI 130 99 SDRAMの 396 130 99 SRAM 396 130 99 *コア クロック速度は、クロック速度を 8 で割った出力として clko1 を構成することでも検証されています。この周波数はオシロスコープを使用して測定され、396MHzであることが確認されました。 実績 チップ選択ピンまでの時間は、RT1050プロセッサから最初のフラッシュ読み取りが発生する瞬間を表します。GPIO 出力までの時間は、起動時間を表します。 予想通り、XiP Hyperflashは他のメモリよりも高速に起動します。SRAM メモリと SDRAM メモリは、実行可能メモリにコピーする必要がありますが、これには時間がかかり、起動が遅くなります。 以下のセクションでは、これらのテストがどのように実行されたか、およびHyperflash XiPが最速であると予想される理由について、より詳細に説明します。 ハイパーフラッシュXiPの起動 以下は、Hyperflash XiPの起動プロセスがどのようになるかの手順の概要です。 パワーオンリセット(J26-1) フラッシュメモリへのアクセス開始(FlexSPI_SS0) フラッシュでインプレース実行(XiP) コードの最初の行が実行されます (USER_LED) MCUXpresso では、マップ ファイルには次のものが表示されていました。 オシロスコープの画像は次のとおりです。   SDRAM の起動 プロセッサはROMから起動し、シリアルNORフラッシュメモリからSDRAMにアプリケーションイメージをコピーするように指示されます(シリアルNORフラッシュはハイパーフラッシュ通信を使用します)。RT フラッシュローダ ツールを使用すると、アプリケーションをフラッシュにロードして、メモリを SDRAM にコピーして実行するように設定できます。   SDRAM へのコピーは、コピー アクション全体を実行する必要があるため、Hyperflash からインプレースで実行するよりも遅くなることが予想されます。 SDRAM の起動プロセスは次のようになります。 パワーオンリセット(J26-1) フラッシュメモリへのアクセス開始(FlexSPI_SS0) SDRAMへのコードのコピー SDRAMでインプレース実行(FlexSPI_SS0) コードの最初の行が実行される (USER_LED) MCUXpresso では、マップ ファイルには次のものが表示されていました。   このテストを実行するために、私は次の手順に従い ました: https://community.nxp.com/docs/DOC-340655. SRAMの起動 SRAMについては、SDRAMと同様の処理が予想されます。プロセッサは最初に内部ROMから起動し、次にHyperflashに移動します。次に、Hyperflashから内部SRAM DTCメモリにすべてをコピーし、そこから実行します。 SRAM の起動プロセスは次のとおりです。 パワーオンリセット(J26-1) フラッシュメモリへのアクセス開始(FlexSPI_SS0) SRAMへのコードのコピー SRAMでインプレース実行(FlexSPI_SS0) コードの最初の行が実行される (USER_LED)   MCUXpresso では、マップ ファイルには次のものが表示されていました。   このドキュメントは、次の議論から作成されました: javascript:; i.MXRT 105倍
查看全文
将 Kinetis 中断从 CodeWarrior 移植到 KDS <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 最近我收到了两个来自 Kinetis 用户的案例。在将 Kinetis Interrupt 项目从 CodeWarrior 10.x 移植到 KDS 时,他们都遇到了问题。KDS 安装文件夹下有一个文档 KDS_Porting_Guide.pdf,其中涵盖了该主题。然而我知道许多客户即使按照文档步骤操作仍然遇到困难。这种情况很正常;因为用户的项目多种多样,我们不能指望一个移植文档就能解决个人的所有问题。对我来说,老实说,我很少使用这个移植指南来移植我的项目。我更喜欢手动移植我的项目。这样我就可以从上到下了解我的项目的变化。这样即使我稍后遇到问题,我仍然可以轻松快速地定位它。 由于时间原因,在本文中,我将重点介绍如何手动将 Kinetis Interrupt 从 CodeWarrior 移植到 KDS。 CodeWarrior 和 KDS 中的一些 NVIC 寄存器定义名称和文件结构不同。一个很大的区别是 KDS 直接使用来自 ARM 有限公司的核心文件。我将差异总结如下表。在开始移植之前最好先了解一下基本的区别。       CodeWarrior KDS NVIC寄存器定义:   其中 MCU 头文件。 Eg: MK60N512VMD100.h ARM 核心文件。 例如:core_cm4,core_cm0plus.h 作者 NXP(原飞思卡尔) ARM有限公司 使用示例 NVICISERx = 0x01 NVIC->ISER[x] = 0x01 封装在 NVIC_EnableIRQ(n) 中 向量表定义: 其中 Kinetis_sysinit.c 启动_MK60D10.S 语言使用 C 组装 中断处理程序名称 由用户定义 由KDS定义。 例如,PORTA_IRQHandler 允许用户修改。 更多信息请参见附件。
查看全文
MCU 101:脉冲宽度调制 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 脉冲宽度调制(PWM)是机器人技术中用于控制电机和伺服器的技术。通过使用内部计数器,微控制器调节方波的占空比来控制输送到设备的电量。占空比是指方波“开启”的时间与重复信号周期的比例。占空比越高,信号承载的功率就越高。占空比以信号“开启”时间的百分比来表示,100% 表示持续开启。 配置计时器 PWM 信号的生成基于寄存器值和自由运行硬件计数器之间的硬件比较。定时器模块以输出比较电路的形式提供类似的硬件比较。寄存器的内容不断与主自由运行定时器进行比较。当匹配发生时,可以配置硬件输出事件,然后中断可以调用服务例程。 Timer I/O 定时器 I/O 端口控制寄存器位于端口集成模块 (PIM) 中。每个端口可以逐个引脚配置,每个定时器输入捕获/输出比较通道都与一个引脚关联。复位时,定时器模块将被禁用,相应的 I/O 端口默认为高阻抗输入。引脚的初始状态可以通过在数据方向寄存器 (DDRT) 中将相应的通用 I/O 引脚配置为输出,并将端口数据寄存器 (PTx) 写入相应的状态来定义。复位期间需要外部上拉设备来控制电平。设置定时器系统控制寄存器 (TSCR1) 中的定时器使能 (TEN) 位可启用定时器模块。在默认模块复位状态下,输出比较功能被禁用。在此模式下,数据方向位 (DDRTx) 控制引脚的 I/O 状态,而输入比较逻辑则监控引脚上的转换。设置定时器输入捕获/输出比较选择 (TIOS) 寄存器中的相应位可启用定时器通道进行输出比较,以满足 PWM 生成的需求。在输出比较模式下,定时器控制寄存器 (TCTL1/2) 中的输出模式 (OMn) 和输出电平 (OLn) 位可同时选择比较事件操作,并启用输出比较输出逻辑与相关引脚的连接。如果某个通道的 OMn:OLn 控制位均为零,则 DDRTx 和 PTx 位将控制 I/O 引脚的状态。设置 OMn:OLn 位中的任一个(或两个)位会将输出比较电路连接到该引脚,从而覆盖 DDRTx 和 PTx 的设置。复位后,每个输出比较电路的输出状态均为零。 对于 PWM 生成,设置 OM 位 (= 1),以便输出比较输出遵循每个比较事件上相关 OL 位的状态。每次处理定时器通道中断时,OL 位的状态都会反转,以产生切换输出。清除或设置 TEN 位分别禁用或启用定时器模块,但不会修改任何其他定时器控制寄存器的内容或输出比较输出逻辑的状态 配置定时器模块用于PWM时,需要考虑许多因素。从高层角度来看,主要考虑以下几点: • PWM 频率 • PWM 占空比 为了产生所需的 PWM 频率,必须知道总线时钟频率,并且必须设置定时器预分频器。这些值取决于产生的 PWM 频率范围和 PWM 信号的分辨率。最大分辨率和 PWM 频率受最大定时器时钟频率限制。较低的 PWM 频率受到最小定时器时钟频率的限制。这有时会导致权衡,可以按照图 1 所示进行评估。 配置定时器通道后,即可使用定时器通道中断生成 PWM 信号。应配置中断服务例程 (ISR),将适当的比较值(标记或空间)加载到定时器比较寄存器中。具体实现方式如下:识别上一个操作是下降沿跳变还是上升沿跳变,切换跳变状态并加载比较寄存器。 下一个合适的值。只需在连续的ISR函数调用中将连续的标记值和空间值添加到定时器比较寄存器,即可避免对主定时器计数寄存器的引用,如图3所示。使用无符号整数加法时,定时器的翻转是无缝的。使用前一个比较值作为生成下一个比较值的参考,即使ISR延迟可能发生变化,也能实现精确的输出时序。 启动PWM是一项需要仔细考虑的任务。为了使用中断启动PWM生成,需要手动配置第一个比较事件。需要配置强制比较,即设置比较值将输出引脚切换到第一个过渡状态。初始比较事件之后,中断将处理PWM生成。HCS12不支持硬件强制比较,但可以通过将正常比较值设置为比当前自由运行定时器值提前几个周期来配置强制比较。这些周期是必要的,以补偿MCU内部的延迟。周期数将根据内核和模块时钟而变化。停止PWM生成时,务必考虑矮脉冲(宽度小于规定的标记或空比的脉冲,具体视情况而定)。为了避免这些脉冲,请在相关的中断服务程序中设置适当的本地中断掩码来禁用PWM生成。可以通过在ISR的任一部分禁用中断来设置引脚在停止时的适当状态;上升沿 或下降沿部分。 附加教程资源: (在 “我的视频” 中查看) (在 “我的视频” 中查看) (在 “我的视频” 中查看) 直流电机控制简介 - 第二部分 讲座 2:脉冲宽度调制 飞思卡尔杯内容
查看全文
感应传感器节点 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Overview 特性 结构框图 电路板 设计资源 Overview 感应传感器节点参考设计拥有一种紧凑的外形尺寸、开源设计。 借助它,基于Thread和ZigBee等IEEE 802.15.4协议的低功率节点能够将数据传送到无线传感器网络。 恩智浦采用以下工具和软件完善了Kinetis KW2xD,包括硬件评估和开发板、软件开发IDE和演示应用与驱动器。 特性 MKW24D512 802.15.4 Kinetis MCU 完全符合IEEE 802.15.4的Thread网络无线节点 集成PCB的弯曲水平天线 2个中断按钮开关(LLWU) 1 FXOS87000CQ Combo sensor 1个纽扣电池座 1 EEPROM 1个电池充电器 结构框图 电路板 设计资源 传统设计
查看全文
CW10.5でKV10を操作する方法 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Kinetis KV10用CodeWarrior MCU 10.5   Kinetis K10Fアプリケーション向けのCodeWarrior開発環境をセットアップするには ダウンロードとインストールの手順については、添付のドキュメントをお読みください。 CW MCU v10.5 製品、パッチ、およびサービス パックを、指定された順序でダウンロードしてインストールします。   評価版:CodeWarrior for Microcontrollers 10.5 (Eclipse, Offline) CW MCU v10.5 PEx MQX Lite Update 1.0.1 CW MCU v10.5 Kinetis KV10 75MHzサービス・パック   更新は、次のURLに投稿されました。 http://www.freescale.com/webapp/sps/site/overview.jsp?code=CW_UPDATES_MCU_10_5 全般
查看全文
ファイル システム MCUXpresso IDE からプロジェクトをインポートする <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 親愛なるコミュニティの皆様へ このドキュメントの目的は、ファイル システムから MCUXpresso IDE にプロジェクトを統合する方法を示すことです。 実際には、想像しているほど複雑ではありません。 Let's begin... 「ファイルシステムからプロジェクトをインポートする」オプションは、IDE の左下隅にあるクイックスタートパネルに含まれています。 フォルダの場所を入力/貼り付けます(zipまたはunpacked)。次に、[次へ]ボタンをクリックします。 最後に、インポートするすべてのプロジェクトフォルダ/サンプルを選択します。 これで、プロジェクトエクスプローラーからアクセスして利用できるようになります。 ハッピーデベロップメント! よろしくお願いいたします。 Ivan R. Re:ファイルシステムMCUXpresso IDEからプロジェクトをインポートする <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi Ivan, まず、投稿をありがとう。ライブラリに関する私の問題は、ライブラリファイルをカスタムプロジェクトにリンクできないこと、またnxpボードを使用していないことです。フロントエンドとしてPN512チップを使用し、MCUとしてKL17を使用していますが、パートナーが設計したカスタムボードを使用しています。私は2日間移植に取り組んでおり、コミュニティでPN5180、PN7420への移植に関する多くの投稿を読みましたが、PN512に関連する人は誰もいませんでした。また、すべての例に「ph_Nxp_Built_App.h」と「phApp_Init.h」の2種類のファイルがあることに気付きました。このファイルはデモアプリケーションを初期化すると思いますが、メインファイルのヘッダーファイルにはアプリの機能があるため、「phApp_Init.h」を持つことの用途は何ですか?そして「phApp_Init.c」ファイル。。また、FreeRTOSを使用していないので、この投稿を見つけてNULLOSモードを構成しましたが、これ以外に何か構成する必要がありますか? PN5180 ソフトウェアが PH_OSAL_NULLOS (NfcrdlibEx1_BasicDiscoveryLoop) に設定されたライブラリが機能しない  私の主な目標は、tu をコンパイルして、KL17 と PN512 の basicloop デモ コードを実行することです。 よろしくお願いします。
查看全文
如何在FreeRTOS项目中使用LPTMR KSDK驱动程序 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Kinetis软件开发套件(KSDK)是用于在Kinetis MCU上开发应用的一个软件框架。 框架中的软件组成包括外设驱动程序、中间件和实时操作系统。 KSDK 提供 FreeRTOS 操作系统,选定的驱动程序以附加层的形式提供 FreeRTOS 支持。该解决方案可在基于 RTOS 的应用程序中实现简单的驱动程序集成。 带有FreeRTOS层的驱动程序有: • UART / LPUART / LPSCI • I2C / LPI2C • SPI / LPSPI FreeRTOS操作系统的驱动层建立在KSDK标准外设驱动层之上,用以实现多线程(RTOS)感知。 包装器提供的API可阻塞调用任务,直到I/O操作完成,允许其他任务在后台运行。 该特性的实现需要使用底层驱动程序的异步API以及RTOS任务同步对象。 底层驱动程序需要启用中断以确保正常操作。 此外,还可以使用 KSDK 裸机驱动程序。本文档介绍如何在 FreeRTOS 和 SDK 2.0 项目中使用 LPTMR 驱动程序。本例中使用了 SDK 2.0、FRDMK64F 和 FreeRTOS。 如果您想了解如何使用 FreeRTOS 项目创建新的 SDK 2.0,请查看以下链接: https://community.freescale.com/docs/DOC-330183 GPIO 和 LPTMR 示例: 简介 此示例每 1 秒切换一次蓝色 LED。此示例检查定时器比较标志位,当设置此标志时,蓝色 LED 会改变状态。 编写示例代码 首先需要创建一个带有 FreeRTOS 项目的新 SDK 2.0,请查看以下链接进行操作。      https://community.freescale.com/docs/DOC-330183 2.创建新项目后,打开pin_mux.c文件以启用端口时钟并将必要的引脚配置为 GPIO(对于 FRDM-K64F,RGB LED 通过 GPIO 信号连接:红色到 PTB22,蓝色到 PTB21 以及绿色到 PTE26)。 3.此外,还需要在 pin_mux.c 中启用 lptmr 模块的时钟文件。 4.在 main.c 中文件需要包含 fsl_lptmr.h和fsl_gpio.h。 5.在主函数中,创建一个新任务。此任务将初始化 LPTMR 和 GPIO 驱动程序。对于此示例,新的任务函数被命名为 task_init。 /* 创建 RTOS 任务 */ xTaskCreate( 任务初始化, “任务初始化” , 配置最小堆栈大小, 无效的, 任务优先级,                  NULL); 6.编写task_init函数代码。 a.使用KSDK GPIO驱动程序: 要初始化 GPIO,请在用户文件中定义引脚配置(输入或输出)。然后,调用GPIO_PinInit()函数。 在这种情况下,连接蓝色 LED 的引脚 PTB21 被配置为输出。 gpio_pin_config_t ledB_config = {kGPIO_DigitalOutput, 0,}; GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PIN, &ledB_config); 配置GPIO引脚后,可以使用以下GPIO操作: GPIO 输出操作。 GPIO_WritePinOutput  (GPIO_Type *base, uint32_t pin, uint8_t output) GPIO_SetPinsOutput(GPIO_Type *base,uint32_t mask) GPIO_ClearPinsOutput(GPIO_Type *base,uint32_t mask) GPIO_TogglePinsOutput(GPIO_Type *base,uint32_t mask) GPIO 输入操作。 GPIO_ReadPinInput (GPIO_Type *base,uint32_t pin) board.h 文件包含此操作的定义。例如: /*!< 切换目标 LED_BLUE */ #定义LED_BLUE_TOGGLE()\ GPIO_TogglePinsOutput(板_LED_BLUE_GPIO,1U << 板_LED_BLUE_GPIO_PIN) b.使用 KSDK LPTMR 驱动程序: 应在应用程序开始时使用 LPTMR 驱动程序调用 LPTMR_Init ()。此函数初始化 lptmr_config_t 结构,该结构保存 LPTMR 外设的配置设置。要将此结构初始化为合理的默认值,请调用 LPTMR_GetDefaultConfig () 函数并将指针传递给您的配置结构实例。配置结构可以设为 const,以便它驻留在闪存中。 默认值为: 配置->timerMode = kLPTMR_TimerModeTimeCounter; 配置->pinSelect = kLPTMR_PinSelectInput_0; 配置->pinPolarity = kLPTMR_PinPolarityActiveHigh; 配置->启用自由运行 = false; config->bypassPrescaler = true; 配置->预分频器时钟源=kLPTMR_PrescalerClock_1; config->value = kLPTMR_Prescale_Glitch_0; 配置LPTMR后,需要设置定时器周期。LPTMR_SetTimerPeriod(),计时器从0开始计数,直到等于此处设置的计数值。计数值写入CMR寄存器。 最后使用LPTMR_StarTimer()启动计时器。调用此函数后,定时器计数至CMR寄存器的值。每次定时器达到CMR值然后递增时,它都会产生一个触发脉冲并设置超时中断标志。如果启用定时器中断,也会触发中断。 对于此示例,以下几行配置并启动 LPTMR。 /* 配置 LPTMR */ LPTMR_GetDefaultConfig(&lptmrConfig); /*初始化LPTMR*/ LPTMR_Init(LPTMR0, &lptmrConfig); /* 设置定时器周期 */ LPTMR_SetTimerPeriod(LPTMR0,USEC_TO_COUNT(1000000U,LPTMR_SOURCE_CLOCK)); /* 开始计数 */ LPTMR_StartTimer(LPTMR0); c.此示例检查定时器比较标志位,当设置此标志时,蓝色 LED 会改变状态。因此,在无限循环中,LPTMR_GetStatusFlags() 函数检查 状态标志,如果设置了此标志,则切换 LED 并使用 LPTMR_ClearStatusFlags() 函数清除标志。 while (1)    {    if (LPTMR_GetStatusFlags(LPTMR0) )           { LED_BLUE_TOGGLE(); LPTMR_ClearStatusFlags(LPTMR0, kLPTMR_TimerCompareFlag ); } } 7.此时您可以构建并调试示例。 完整代码GPIO和LPTMR示例 #include #包括“board.h” #包括“pin_mux.h” #包括“clock_config.h” #包括“fsl_debug_console.h” #包括“fsl_device_registers.h” #包括“fsl_lptmr.h” #包括“fsl_gpio.h” /* FreeRTOS 内核包括。*/ #包括“FreeRTOS.h” #包括“任务.h” #include "队列.h" #包括“计时器.h” /* 任务优先级。*/ #定义任务优先级(configMAX_PRIORITIES-1) /******************************************************************************* * 定义 ******************************************************************************/ /* 获取 LPTMR 驱动程序的源时钟 */ #定义LPTMR_SOURCE_CLOCK CLOCK_GetFreq(kCLOCK_LpoClk) static void task_init(void *pvParameters); /******************************************************************************* * Variables ******************************************************************************/ volatile uint32_t lptmrCounter = 0U; int main ( void ){ /*初始化板硬件。 */ 板初始化引脚(); 主板启动时钟运行();        BOARD_InitDebugConsole(); /* 在这里添加您的代码 */ /* 创建 RTOS 任务 */ xTaskCreate( 任务初始化, “任务初始化” , 配置最小堆栈大小, 无效的, 任务优先级,                      NULL); vTaskStartScheduler(); for (;;) { /* 无限循环以避免离开主函数 */ __asm ( "NOP" ) ; /* 循环时用作断点停止的东西 */        } } static void task_init(void *pvParameters) { 为了(;;) {               lptmr_config_t lptmrConfig; PRINTF( "您正在运行初始化任务。\r\n" ); /*初始化输出 LED GPIO。*/               gpio_pin_config_t ledB_config = {kGPIO_DigitalOutput, 0,};               GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PIN, &ledB_config); PRINTF( "LED 蓝色初始化 \r\n" ) ; /* 配置 LPTMR */               /*                * lptmrConfig.timerMode = kLPTMR_TimerModeTimeCounter;                * lptmrConfig.pinSelect = kLPTMR_PinSelectInput_0; *lptmrConfig.pinPolarity = kLPTMR_PinPolarityActiveHigh; * lptmrConfig.enableFreeRunning=假;                * lptmrConfig.bypassPrescaler = true; * lptmrConfig.预分频器时钟源=kLPTMR_预分频器时钟_1;                * lptmrConfig.value = kLPTMR_Prescale_Glitch_0;                */               LPTMR_GetDefaultConfig(&lptmrConfig); /*初始化LPTMR*/               LPTMR_Init(LPTMR0, &lptmrConfig); /* 设置定时器周期 */ LPTMR_SetTimerPeriod(LPTMR0,USEC_TO_COUNT(1000000U,LPTMR_SOURCE_CLOCK)); PRINTF( "低功耗定时器模块已初始化 \r\n" ); /* 开始计数 */               LPTMR_StartTimer(LPTMR0); while (1) {                      if (LPTMR_GetStatusFlags(LPTMR0) ) { lptmr计数器++; LED_蓝色_切换(); LPTMR_ClearStatusFlags(LPTMR0, kLPTMR_TimerCompareFlag ); } }        } }
查看全文
FreeRTOS プロジェクトで LPTMR KSDK ドライバーを使用する方法 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Kinetisソフトウェア開発キット(KSDK)は、Kinetisマイクロコントローラ上でアプリケーションを開発するためのソフトウェア・フレームワークです。フレームワークのソフトウェアコンポーネントには、ペリフェラルドライバー、ミドルウェア、およびリアルタイムオペレーティングシステムが含まれます。 KSDKはFreeRTOS OSを提供し、選択されたドライバーは追加のレイヤーの形でFreeRTOSサポートを提供します。このソリューションにより、RTOSベースのアプリケーションへのドライバ統合が容易になります。 FreeRTOS レイヤーを持つドライバーは次のとおりです。 • UART / LPUART / LPSCI • I2C / LPI2C • SPI / LPSPI FreeRTOS OS のドライバーは、標準の KSDK 周辺機器ドライバーの上に構築されたレイヤーで、マルチスレッド (RTOS) 認識を実現します。ラッパーは、I/O 操作が完了するまで呼び出し元のタスクをブロックし、他のタスクをバックグラウンドで実行できるようにする API を提供します。これは、基になるドライバーの非同期 API と RTOS タスク同期オブジェクトを使用して実現されます。基盤となるドライバーは、適切に動作するために有効な割り込みを必要とします。 さらに、KSDKベアメタルドライバーを使用することも可能です。このドキュメントでは、FreeRTOS および SDK 2.0 プロジェクトで LPTMR ドライバーを使用する方法について説明します。この例では、SDK 2.0、FRDMK64F、および FreeRTOS を使用しています。 FreeRTOSプロジェクトを使用して新しいSDK 2.0を作成する方法を知りたい場合は、以下のリンクを確認してください https://community.freescale.com/docs/DOC-330183 GPIOとLPTMRの例: はじめに この例では、青色の LED を 1 秒ごとに切り替えます。この例では、Timer Compare Flagビットをチェックし、このフラグが設定されると青色LEDのステータスが変わります。 サンプルコードの記述 まず、FreeRTOSプロジェクトを使用して新しいSDK 2.0を作成する必要がありますので、以下のリンクを確認してください。      https://community.freescale.com/docs/DOC-330183 2.新しいプロジェクトを作成したら、pin_mux.c を開きますポートクロックを有効にし、必要なピンをGPIOとして構成するためのファイル(FRDM-K64Fの場合、RGB LEDはGPIO信号を介して接続されます:赤からPTB22、青からPTB21、緑からPTE26)。 3.さらに、pin_mux.c で lptmr モジュールのクロックを有効にする必要がありますファイル。 4.main.c でファイルには fsl_lptmr.h を含める必要がありますとfsl_gpio.h. 5.main 関数で、新しいタスクを作成します。このタスクは、LPTMR ドライバーと GPIO ドライバーを初期化します。この例では、新しいタスク関数の名前は task_init です。 /* RTOSタスクを作成 */ xTaskCreate( task_init、                  "Task_Init"、 configMINIMAL_STACK_SIZE、 ヌル task_PRIORITY、                  NULL); 6.task_init関数コードを記述します。 ある。KSDK GPIO ドライバーの使用: GPIO を初期化するには、ユーザー ファイルでピン構成 (入力または出力) を定義します。次に、 GPIO_PinInit() 関数を呼び出します。 今回は青色LEDが接続されているピンPTB21を出力として設定しました。 gpio_pin_config_t ledB_config = {kGPIO_DigitalOutput, 0,}; GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PIN, &ledB_config); GPIO ピンをコンフィギュレーションすると、次の GPIO 操作を使用できます。 GPIO出力操作。 GPIO_WritePinOutput  (GPIO_Type *base, uint32_t pin, uint8_t output) GPIO_SetPinsOutput(GPIO_Type ※ベース、uint32_tマスク) GPIO_ClearPinsOutput(GPIO_Type ※ベース、uint32_tマスク) GPIO_TogglePinsOutput(GPIO_Type ※ベース、uint32_tマスク) GPIO 入力操作。 GPIO_ReadPinInput (GPIO_Type ※ベース、uint32_tピン) board.h ファイルには、この操作の定義が含まれています。例えば: /*!< ターゲットLED_BLUEの切り替え */ #define LED_BLUE_TOGGLE() \ GPIO_TogglePinsOutput(BOARD_LED_BLUE_GPIO、1U<< BOARD_LED_BLUE_GPIO_PIN) b.KSDK LPTMR ドライバーを使用する場合: LPTMR_Init () は、アプリケーションの先頭で LPTMR ドライバーを使用して呼び出す必要があります。この関数は lptmr_config_t 構造体を初期化し、この構造体は LPTMR 周辺機器の構成設定を保持します。この構造体を適切な既定値に初期化するには、LPTMR_GetDefaultConfig() 関数を呼び出し、構成構造体インスタンスへのポインターを渡します。config構造体は、フラッシュに存在するようにconstにすることができます。 デフォルト値は次のとおりです。 config->timerMode = kLPTMR_TimerModeTimeCounter; config->pinSelect = kLPTMR_PinSelectInput_0; config->pinPolarity = kLPTMR_PinPolarityActiveHigh; config->enableFreeRunning = false; config->bypassPrescaler = true; config->prescalerClockSource = kLPTMR_PrescalerClock_1; config->value = kLPTMR_Prescale_Glitch_0; LPTMRを設定した後、タイマー期間を設定する必要があります。LPTMR_SetTimerPeriod() は、タイマーが 0 からここで設定されたカウント値と等しくなるまでカウントします。カウント値はCMRレジスタに書き込まれます。 最後に、LPTMR_StarTimer () を使用してタイマーを開始します。この関数を呼び出した後、タイマーはCMRレジスタ値までカウントアップします。タイマがCMR値に達してからインクリメントするたびに、トリガパルスが生成され、タイムアウト割込みフラグが設定されます。タイマー割り込みが有効になっている場合も、割り込みがトリガーされます。 この例では、次の行で LPTMR を構成して開始します。 /* LPTMR の設定 */ LPTMR_GetDefaultConfig(&lptmrConfig); /* LPTMR を初期化します */ LPTMR_Init(LPTMR0, &lptmrConfig); /* タイマー周期を設定 */ LPTMR_SetTimerPeriod(LPTMR0, USEC_TO_COUNT(1000000U, LPTMR_SOURCE_CLOCK)); /* カウント開始 */ LPTMR_StartTimer(LPTMR0);                   c.この例では、Timer Compare Flagビットをチェックし、このフラグが設定されると青色LEDのステータスが変わります。したがって、無限ループでは、LPTMR_GetStatusFlags()関数がチェックします ステータスフラグ (このフラグが設定されている場合は、LED を切り替えて、LPTMR_ClearStatusFlags() 関数を使用してフラグをクリアします。 (1) ながら    {    if (LPTMR_GetStatusFlags(LPTMR0) )           { LED_BLUE_TOGGLE();                      LPTMR_ClearStatusFlags(LPTMR0, kLPTMR_TimerCompareFlag);               } } 7.この時点で、サンプルをビルドしてデバッグできます。 完全なコード GPIO と LPTMR の例 #include #include「ボード.h」 #include「pin_mux.h」 #include 「clock_config.h」 #include「fsl_debug_console.h」 #include 「fsl_device_registers.h」 #include 「fsl_lptmr.h」 #include 「fsl_gpio.h」 /* FreeRTOS カーネルには以下が含まれます。*/ #include「FreeRTOS.h」 #include「task.h」 #include「queue.h」 #include「timers.h」 /* タスクの優先順位。*/ #define task_PRIORITY (configMAX_PRIORITIES-1) /******************************************************************************* *定義 ******************************************************************************/ /* LPTMR ドライバーのソースクロックを取得 */ #define LPTMR_SOURCE_CLOCK CLOCK_GetFreq(kCLOCK_LpoClk) static void task_init(void *pvParameters); /******************************************************************************* * Variables ******************************************************************************/ volatile uint32_t lptmrCounter = 0U; int main(void) {        /* ボード ハードウェアを初期化 します。*/ BOARD_InitPins(); BOARD_BootClockRUN();        BOARD_InitDebugConsole();        /* ここにコードを追加 */        /* RTOSタスクを作成 */ xTaskCreate( task_init、                      "Task_Init"、 configMINIMAL_STACK_SIZE、 ヌル task_PRIORITY、                      NULL); vTaskStartScheduler();        for(;;){ /* メイン関数から離れないようにするための無限ループ */               __asm(「NOP」); /* ループ中のブレークポイント停止として使用するもの */        } } static void task_init(void *pvParameters) {        for (;;){               lptmr_config_t lptmrConfig; PRINTF("初期化タスクを実行しています。\r\n");               /* イニット 出力LEDGPIO。*/               gpio_pin_config_t ledB_config = {kGPIO_DigitalOutput, 0,};               GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PIN, &ledB_config); PRINTF("LED BLUE 初期化済み \r\n");               /* LPTMR の設定 */               /*                * lptmrConfig.timerMode = kLPTMR_TimerModeTimeCounter;                * lptmrConfig.pinSelect = kLPTMR_PinSelectInput_0; * lptmrConfig.pinPolarity = kLPTMR_PinPolarityActiveHigh; * lptmrConfig.enableFreeRunning= false;                * lptmrConfig.bypassPrescaler = true; * lptmrConfig.prescalerClockSource= kLPTMR_PrescalerClock_1;                * lptmrConfig.value = kLPTMR_Prescale_Glitch_0;                */               LPTMR_GetDefaultConfig(&lptmrConfig);               /* LPTMR を初期化します */               LPTMR_Init(LPTMR0, &lptmrConfig);               /* タイマー周期を設定 */ LPTMR_SetTimerPeriod(LPTMR0, USEC_TO_COUNT(1000000U, LPTMR_SOURCE_CLOCK)); PRINTF("低電力タイマー モジュールが初期化されました \r\n");               /* カウント開始 */               LPTMR_StartTimer(LPTMR0); (1) ながら {                      if (LPTMR_GetStatusFlags(LPTMR0) ) { lptmrCounter ++; LED_BLUE_TOGGLE(); LPTMR_ClearStatusFlags(LPTMR0, kLPTMR_TimerCompareFlag); } }        } }
查看全文
KW36 - 32kHz RTC外部発振器のトリミング調整 はじめに FRDM-KW36には、32kHzの水晶発振器を備えたRTCモジュールが含まれています。このモジュールは、超低消費電力モードで動作しながら、MCU用の32kHzクロックソースを生成します。この発振器には、C LOAD として使用されるプログラム可能なコンデンサのセットが含まれています。これらのコンデンサの値を変更すると、発振器が提供する周波数を変更できます。 この構成可能な容量は、0pF(コンデンサ・バンク・ディセーブル)から30pFまで、2pF刻みで範囲が広い範囲です。これらの値は、イネーブルされたコンデンサを組み合わせて取得します。使用可能な値は、2 pF、4 pF、8 pF、および 16 pF です これら4つの任意の組み合わせが可能です。外部コンデンサが使用可能な場合は、これらの内部コンデンサをディスエーブルすることをお勧めします (RTC 制御レジスタ SFR の SC2P、SC4P、SCS8、および SC16 ビットをクリアします)。 オシレーターによって提供される周波数を調整するには、最初に周波数を測定できる必要があります。周波数カウンタを使用すると、オシロスコープよりも正確な測定が可能になるため、理想的です。また、オシレーター周波数を出力する必要もあります。発振器の周波数を出力するには、例としてBluetoothデモアプリケーションのいずれかを歌うample、次の手順を実行する必要があります。 周波数の調整例 この例では、Connectivity Software Stack の Heart Rate Sensor デモ (freertos バージョン) を利用し、開発者が SDK から IDE へのプロジェクトのインポートまたはオープンに関する知識を持っていることを前提としています。 SDK から Heart Rate Sensor プロジェクトを開くか、クローンします。 ワークスペースの board フォルダーで board.c ファイルと board.h ファイルを見つけます。                                                                                ボード上でvoid関数を宣言します。ファイルを作成します。この機能は、RTC クロックを PTB3 にマルチプレクサし、周波数を測定できるようにするためのものです。 /* Function to mux PTB3 to RTC_CLKOUT */ void BOARD_EnableRtcClkOut (void);‍‍ ボード内部でBOARD_EnableRtcClkOut機能を開発します。ファイルを以下のように用意しています。 void BOARD_EnableRtcClkOut(void) { /* Enable PORTB clock gating */ CLOCK_EnableClock(kCLOCK_PortB); /* Mux the RTC_CLKOUT to PTB3 */ PORT_SetPinMux(PORTB, 3u, kPORT_MuxAlt7); /* Select the 32kHz reference for RTC_CLKOUT signal */ SIM->SOPT1 |= SIM_SOPT1_OSC32KOUT(1); } BOARD_BootClockRUN直後hardware_init関数のBOARD_EnableRtcClkOut関数を呼び出します(board.cファイル)。 clock_config.cを探すワークスペースのボードフォルダー内のファイル。 ファイルの先頭に次の定義を追加します。 #define RTC_OSC_CAP_LOAD_0 0x0U /*!< RTC oscillator, capacitance 0pF */ #define RTC_OSC_CAP_LOAD_2 0x2000U /*!< RTC oscillator, capacitance 2pF */ #define RTC_OSC_CAP_LOAD_4 0x1000U /*!< RTC oscillator, capacitance 4pF */ #define RTC_OSC_CAP_LOAD_6 0x3000U /*!< RTC oscillator, capacitance 6pF */ #define RTC_OSC_CAP_LOAD_8 0x800U /*!< RTC oscillator, capacitance 8pF */ #define RTC_OSC_CAP_LOAD_10 0x2800U /*!< RTC oscillator, capacitance 10pF */ #define RTC_OSC_CAP_LOAD_12 0x1800U /*!< RTC oscillator, capacitance 12pF */ #define RTC_OSC_CAP_LOAD_14 0x3800U /*!< RTC oscillator, capacitance 14pF */ #define RTC_OSC_CAP_LOAD_16 0x400U /*!< RTC oscillator, capacitance 16pF */ #define RTC_OSC_CAP_LOAD_18 0x2400U /*!< RTC oscillator, capacitance 18pF */ #define RTC_OSC_CAP_LOAD_20 0x1400U /*!< RTC oscillator, capacitance 20pF */ #define RTC_OSC_CAP_LOAD_22 0x3400U /*!< RTC oscillator, capacitance 22pF */ #define RTC_OSC_CAP_LOAD_24 0xC00U /*!< RTC oscillator, capacitance 24pF */ #define RTC_OSC_CAP_LOAD_26 0x2C00U /*!< RTC oscillator, capacitance 26pF */ #define RTC_OSC_CAP_LOAD_28 0x1C00U /*!< RTC oscillator, capacitance 28pF */ #define RTC_OSC_CAP_LOAD_30 0x3C00U /*!< RTC oscillator, capacitance 30pF */ BOARD_BootClockRUN 関数内の関数へのCLOCK_CONFIG_EnableRtcOsc呼び出しを検索します (clock_config.cファイル)、上記の定義のいずれかで引数を編集します。 最後に、「preinclude.h」で低電力オプションとLEDサポートを無効にしますプロジェクトのソースフォルダにあるファイル: #define cPWR_UsePowerDownMode 0 #define gLEDSupported_d 0 この時点で、PTB3で測定し、周波数カウンターを使用して周波数調整で遊ぶことができます。ボードがプログラムされるたびに、正しい測定値を得るためにPORを実行する必要があります。次の表は、FRDM-KW36ボードrev Bから取得したもので、周波数を調整するための基準として使用できます。容量は、イネーブルされた内部容量だけでなく、パッケージ、ボンディングワイヤ、ボンディングパッド、およびPCBトレースに見られる寄生容量で構成されることに注意してください。したがって、以下に示す基準測定値は実際の値に近い必要がありますが、周波数がボードとレイアウトに合わせてトリミングされていることを確認するために、ボードを使用して測定も行う必要があります。 イネーブルコンデンサ Cロード キャパシタンスの定義 周波数 - 0pF RTC_OSC_CAP_LOAD_0 (銀行が無効) 32772.980Hz SC2P 2ページF RTC_OSC_CAP_LOAD_2 32771.330Hz SC4P 4ページF RTC_OSC_CAP_LOAD_4 32770.050Hz SC2P, SC4P 6pF RTC_OSC_CAP_LOAD_6 32769.122Hz SC8P 8ページF RTC_OSC_CAP_LOAD_8 32768.289Hz SC2P, SC8P 10pF RTC_OSC_CAP_LOAD_10 32767.701Hz SC4P, SC8P 12pF RTC_OSC_CAP_LOAD_12 32767.182Hz SC2P, SC4P, SC8P 14pFの RTC_OSC_CAP_LOAD_14 32766.766Hz SC16P 16pF RTC_OSC_CAP_LOAD_16 32766.338Hz SC2P, SC16P 18pFの RTC_OSC_CAP_LOAD_18 32766.038Hz SC4P, SC16P 20pFの RTC_OSC_CAP_LOAD_20 32765.762Hz SC2P, SC4P, SC16P 22pFの RTC_OSC_CAP_LOAD_22 32765.532Hz SC8P, SC16P 24pFの RTC_OSC_CAP_LOAD_24 32765.297Hz SC2P, SC8P, SC16P 26pF RTC_OSC_CAP_LOAD_26 32765.117Hz SC4P, SC8P, SC16P 28pFの RTC_OSC_CAP_LOAD_28 32764.940Hz SC2P, SC4P, SC8P, SC16P 30pF RTC_OSC_CAP_LOAD_30 32764.764Hz BLEソフトウェア kW KW35 |36
查看全文
从 LS102xA 上的 QSPI 启动 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> LS1021xA系列产品开始支持QSPI闪存启动。 但是从 QSPI 闪存启动与从 SPI 闪存启动不同。 QSPI 启动使用 XIP(就地执行)方法,就像 NOR Flash 启动一样。 分配给 QSPI 闪存的内存映射起始地址为 0x4000000。 您需要将代码放在正确的位置。 您应该注意的另一个关键点是 QSPI 控制器和 ARM AMBA AXI 总线之间的数据字节序格式。 任何刻录到 QSPI Flash 的二进制文件都应首先完成字节交换过程。 我们的 Ls1021xA Bsp 在名为“byte_swap.tcl”的 Tcl 脚本文件中提供了此功能。 按照以下命令完成此过程。 tclsh ./byte_swap.tcl ./ .bin ./ .bin 8 然后从 SD/MMC 媒体启动系统。 按照以下命令将映像文件刻录到 QSPI Flash 中。 => tftp 0x81000000 rcw_qspiboot_swap.bin (测量此二进制文件包含PBI命令:0xee0200、0x40010000 这是 u-boot 地址的解决方法) => SF探测器 => sf擦除 0 0x10000 => sf写入 0x81000000 0 0x100 => tftp 0x82000000 u-boot-qspiboot_swap.bin => sf擦除 0x10000 0x90000 => sf写入 0x82000000 0x10000 0x80000 回复:从 LS102xA 上的 QSPI 启动 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 是的,T系列、LS系列和部分P系列QorIQ产品需要RCW二进制文件。 我们的 SDK 将帮助您在代码构建过程之后自动将 RCW 数据插入 U-boot 二进制文件中。 但LS SDK尚未完成所有功能。 回复:从 LS102xA 上的 QSPI 启动 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 谢谢明哲, 无论我如何启动 LS1021A 板,是否总是需要 RCW 二进制文件? 这些配置是否已经像 imx6 一样包含在 u-boot 中? 回复:从 LS102xA 上的 QSPI 启动 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> rcw_qspiboot_swap.bin 文件是什么? 您可以使用脚本“ byte_swap.tcl”将 rcw.bin 交换为rcw_qspiboot_swap.bin。 tclsh ./byte_swap.tcl ./ .bin ./ .bin 8 当我编译 u-boot 时,我只能得到 u-boot.bin。 您可以使用 QorIQ 配置套件“预引导加载程序工具”为您的定制板生成特定的 RCW 二进制文件。 该文件对于启动主板是否必要? 是的,这是一个预引导加载程序代码,您需要小心修改它。 回复:从 LS102xA 上的 QSPI 启动 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi, 我正在从 QSPI 闪存启动定制的 LS1021A 板,我有一个问题: rcw_qspiboot_swap.bin 文件是什么? 当我编译 u-boot 时,我只能得到 u-boot.bin。 该文件对于启动主板是否必要? 谢谢!
查看全文
读取s32k116 EVB板的LIN信号时出现问题 我有一个主节点,可以发送两个帧 ID 为 0x30 的信号。在我的例子中,当我发送帧 ID 为 0x30 的信号(帧 ID 为 0x01 0xff 0xff 0xff)时,任何一个 GPIO 引脚都应该为高电平(LED 灯亮);或者,当发送帧 ID 为 0x30 的信号(帧 ID 为 0x00 0xff 0xff 0xff)时,另一个配置了 LED 的 GPIO 引脚应该为高电平。我已经配置了所有 LIN 协议栈,并希望读取主节点发送的 LIN 信号消息。主节点将发送默认信号 0xFF 0xFF 0xFF 0XFF。当我尝试使用以下命令读取第一个字节信号时 数据1 = l_u8_rd_LI0_EVK_CTRL_Byte_1(); 我可以看到信号值为 0XFF,但即使我从主节点更改,它在从属节点中也不会改变。我已附加 lin ldf 和 main.c下面的文件供您参考。 我参考了示例 lin_slave_s32k116,如下所示: santhosh23_0-1721226664724.png 为了读取改变的信号我是否遗漏了什么?或者我需要做出一些改变吗? 非常感谢与此相关的任何建议或简单示例。 提前致谢! 谢谢与问候, 桑托什 #林 #s32k 回复:读取s32k116 EVB板的LIN信号时出现问题 大家好, 我找到了 LIN 协议问题的解决方案,我希望这对第一次使用该协议的任何人有所帮助。问题出在我的主板上的 UART 配置上。最初它被设置为 UART 引脚 PTC 6 和 7,但它们应该设置为 PTC 8 和 9。一旦我纠正了引脚配置,一切都开始按预期工作。 谢谢与问候, 桑托什 回复:读取s32k116 EVB板的LIN信号时出现问题 感谢@PetrS的快速回复! 请尽快发送。我期待您的回复。 谢谢与问候, 桑托什 回复:读取s32k116 EVB板的LIN信号时出现问题 Hi, 最好检查收发器上的 SLP,所以是 TP521。 TXD 是 MCU 的输出,所以只有当从机(MCU)发送响应时才会有信号。 RXD 是 MCU 的输入,如果收发器处于活动状态,它将遵循 LIN 总线信号。因此,如果收发器正在工作,您必须在 RXD 上看到与 LIN 上相同的信号。 我可以进行新的捕获,但没有板,所以最早也要下周才能进行。 BR, Petr 回复:读取s32k116 EVB板的LIN信号时出现问题 你好@PetrS , 我检查了PTA7 引脚,它在分析仪上显示高电平(5V)。但我不明白为什么收发器的 PTC6 RXD 或 PTC7 TXD 引脚上没有信号。 如果可能的话,您能否分享您的 EVB 工作或响应 lin 信号的视频片段? 谢谢与问候, 桑托什 回复:读取s32k116 EVB板的LIN信号时出现问题 Hi, 检查电路板原理图。您可以测量测试点 TP521。 在 revB 板上,/SLP 被拉高并且没有连接到 MCU,无需做任何事情 PetrS_0-1722341386072.png 在 revA 板上没有上拉,而是连接到 PTA7,然后 PTA7 应该保持高位 PetrS_1-1722341444419.png BR, Petr 回复:读取s32k116 EVB板的LIN信号时出现问题 你好@PetrS ! 您说得对,我用分析仪没看到任何来自TDX和RXD线路的信号。这意味着收发器没有激活。您能解释一下如何检查SLP引脚,以便将其拉到PCB上吗? 谢谢与问候, 桑托什 回复:读取s32k116 EVB板的LIN信号时出现问题 Hi, 是的,看起来正确。 我建议使用示波器/分析仪检查 TDX、RXD 线路,以确保 LIN 信号通过收发器。确保收发器处于活动状态,检查 /SLP 引脚,例如在 revA 板上,这没有在 PCB 上拉起。 BR, Petr 回复:读取s32k116 EVB板的LIN信号时出现问题 感谢@PetrS的回复! 如果这对您来说没问题,那么我可能遗漏了硬件配置部分的一些内容。 我做了以下硬件配置: * 连接 12 V 外部电源并将跳线 J107 更改为 1-2(默认)。 *移除跳线 J108,因为它不处于主模式。 *连接 NXP EVB 的 lin 通信外设的 lin 总线、Gnd 和 12 V,如下图所示。 santhosh23_0-1722335901041.png 如果我遗漏了其他内容,请告诉我。 谢谢与问候, 桑托什 回复:读取s32k116 EVB板的LIN信号时出现问题 Hi, 我尝试了这个项目,它似乎运行正常,我使用 PLIN View 并在那里加载 ldf 来作为 BABY_LIN 主机工作。 从机(EVB 板)响应主机 Status_EVK_Board_LIN 帧并根据 Control_EVK_Board_LIN 帧中接收到的数据控制 EVB LED,请参阅所附视频。 BR, Petr 回复:读取s32k116 EVB板的LIN信号时出现问题 你好@PetrS , 感谢您的回复! 按照你的建议,我尝试在S32K116板上使用S32 DS 3.4版的SDK RTM 4.0.3从属演示,但它没有按预期工作。我还用逻辑分析仪监测了UART外设引脚(如PTC 6和7)的信号,但没有看到任何信号。请找到此消息附带的所有必要的项目文件,如果我遗漏了什么,请告诉我。 提前致谢! 谢谢与问候, 桑托什 回复:读取s32k116 EVB板的LIN信号时出现问题 Hi, 项目正在使用一些旧的 SDK 版本,我没有安装,因此很难修改/构建代码。 从 main.c 文件来看,您似乎缺少 PORT_IRQHandler 和 AutoBaudCapture 调用部分。尝试添加在演示项目中使用的内容。 我测试了 SDK RTM 4.0.3S32K116 板上的从机演示,运行正常。 BR, Petr 回复:读取s32k116 EVB板的LIN信号时出现问题 另外,来自主节点的其他信号如下所示。 对于 0x01: santhosh23_0-1721742989318.png 对于 0x00: santhosh23_1-1721743016558.png 回复:读取s32k116 EVB板的LIN信号时出现问题 你好@PetrS , 我尝试过这种方法,也进行了必要的硬件配置,但从 s32k116 EVB 看不到信号变化。这里,一旦执行擦除标志线,数据1将变为0x00,然后默认再次返回0xFF。我还检查了我的主节点,它正在按预期发送信号,如下所示。 santhosh23_0-1721742303195.png 我已附上包含所有必要文件(如 main.c 和 ldf 文件)的文档,供您参考。如果我遗漏了某些内容,请告诉我,以便正确读取数据。 我期待您的回复。 感谢并敬意, 桑托什 回复:读取s32k116 EVB板的LIN信号时出现问题 Hi, 如果您需要使用 LIN 堆栈,那么您需要参考 SDK 或 RTD 演示示例。SDK 或 RTD 也提供 LIN 驱动程序演示。它可以正常工作。电路板必须由 12V 供电,并且主板必须放置 MASTER 跳线。您应该能够测量 LIN 线路和 TXD、RXD 引脚上的 LIN 帧。 如果你想要一些从属裸机代码,下面的代码可能也会有用 https://community.nxp.com/t5/S32K-Knowledge-Base/Example-S32K116-LPUART-LIN-Slave-TXRX-ISR-S32DS-ARM-2-2/ta-p/1128538 BR, Petr  回复:读取s32k116 EVB板的LIN信号时出现问题 感谢@PetrS的回复! 我尝试了下面的两个例子。 1. 林大师 2. 林奴隶 santhosh23_0-1721392444542.png 我无法发送任何信号,也无法接收任何信号。在尝试这些示例之前,是否需要对硬件进行任何设置或配置,例如正确设置跳线或其他设置? 如果是,请告诉我详细步骤。另外,请提供一个简单的示例,其中 s32k EVB 可以读取从主节点发送的 lin 信号。 我期待您的回复。 谢谢与问候, 桑托什 回复:读取s32k116 EVB板的LIN信号时出现问题 Hi, 如果您收到 ID 为 0x30 的帧,那么根据您的 ldf,我认为您应该检查/清除 NXP_EVK_Byte_1 标志。 /* 检查信号是否更新 */ 如果(l_flg_tst_LI0_NXP_EVK_Byte_1_flag()) { /* 清除此标志... */ l_flg_clr_LI0_NXP_EVK_Byte_1_标志(); /* 存储选择数据 */ 数据1 = l_u8_rd_LI0_NXP_EVK_Byte_1(); ..... 另外,您似乎正在使用一些较旧的 SDK 版本,建议使用最新版本。 BR, Petr
查看全文
NXP_C45_TJA11XX 驱动程序软重置问题 大家好, 我们正在开发一款带有 TI TDA4 SoC 和 TJA1120 PHY 的定制主板。在我们的 Linux 版本中包含 nxp_c45_tja11xx 驱动程序后,我们在 nxp_c45_soft_reset 函数内部的启动过程中遇到了错误。如果我们对 phy_read_mmd_poll_timeout 宏调用进行更改,使得其最后一个参数(sleep_before_read)为 true 而不是默认的 false,则此问题就会消失。我们还尝试在 phy_read_mmd_poll_timeout 之前使用较短的睡眠时间(1000 微秒),这也有效。 似乎在 MDIO 写入和读取之间没有任何休眠的情况下,软件在重置时尝试读取 PHY 寄存器并失败。但奇怪的是,至今无人注意到这一点。这可能是由我们的主板引起的,还是驱动程序中的一个错误? 笔记: 我们正在使用 TJA1120A Phy 的修订版 1。 顺祝商祺! Dusan   回复:NXP_C45_TJA11XX 驱动程序软重置问题 补丁已发送: https://lkml.org/lkml/2025/1/16/837 回复:NXP_C45_TJA11XX 驱动程序软重置问题 Hello @rm_ , 那太好了。请这么做。 顺祝商祺! 帕维尔 回复:NXP_C45_TJA11XX 驱动程序软重置问题 你好@PavelL , 我正在和杜桑合作做这件事。我们应该创建一个修复补丁并将其发送给驱动程序维护人员吗? 此致, 米洛斯 回复:NXP_C45_TJA11XX 驱动程序软重置问题 你好@DusanStanisic99 , 这可能是驱动程序中的一个小错误。在我看来,你的观察似乎是正确的。 请参阅 TJA1120 的应用说明 AN13663 第 30 页 - 其中描述了启动时间。 PavelL_0-1736952413530.png 顺祝商祺! 帕维尔
查看全文
驱动强度启用 DSE 与 MCX A 中的 DSE1 Hello, 我对 MCX A micros 中的驱动强度配置有一些疑问: JosG_0-1729155120604.png PCRn寄存器中的DSE和DSE1有什么区别?DSE1在I/O引脚图结构图中集成在什么位置?我无法清楚地理解其中的区别…… JosG_1-1729155120630.png 谢谢! MCXA 回复:在 MCX A 中启用 DSE 与 DSE1 的驱动强度对比 我很高兴能帮助你。如有新问题,欢迎创建新主题。 回复:在 MCX A 中启用 DSE 与 DSE1 的驱动强度对比 谢谢 Celeste! 回复:在 MCX A 中启用 DSE 与 DSE1 的驱动强度对比 Hello @JosG , 感谢您联系 NXP 技术支持。 有关 DSE 的更多信息,您可以在数据表中找到。其中提到“所有类型 IO 的 Pin Control 寄存器中都支持 PE、PS、SRE、ODE 和 DSE。5VTol和 HD 焊盘支持引脚的 Pin Control 寄存器中的两个 DSE 位。 ”在PCRn寄存器中,DSE和DSE1是这两个位的名称。并非所有 PCRn 寄存器都有两个 DSE 位;有些只有一个。详细信息可以在参考手册中找到。基于此,I/O引脚图结构就很容易理解了。其上标示的DSE包括DSE和DSE1。 您还可以在数据表中找到一些有用的信息。比如第23页提到的,如下图所示: Celeste_Liu_0-1729233125335.png 关于PCRn[DSE]的详细介绍,可以参考下图。 Celeste_Liu_1-1729233170952.png 希望以上信息对您有用。 顺祝商祺! Celeste
查看全文