Multi Source Translation Content

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

Multi Source Translation Content

Discussions

Sort by:
i.MX93 JTAG debugging I would like to use openocd for JTAG debugging on the i.MX93, but the processor seems to be in Boundary Scan mode (IDCODE 0x0892801d rather than 0x5ba02477). What do I need to do to switch to DEBUG mode? Is there an openocd configuration file available? Lothar Waßmann Re: i.MX93 JTAG debugging Hello @Zhiming_Liu  Could You please send me the necessary OpenOCD files for the FRDM i.MX93 development board? I would like the board file as well as the file for the SoC, and any other file I would ne FRDM-i.MX93  Re: i.MX93 JTAG debugging Hello Zhiming_Liu, Could you send them to me too please? Regards, Kristian Re: i.MX93 JTAG debugging Could you share the openocd patch with me as well? Re: i.MX93 JTAG debugging Hello Zhiming_Liu, Could you send them to me too please? Regards, Roberto Re: i.MX93 JTAG debugging Did this patch ever get to be publicly available? Anywhere to get a hold of it? Re: i.MX93 JTAG debugging Hi, please send the patches to me too. Wouldn't it be easier to just make them downloadable on the imx93 product page, or even better, send a pullrequest to the openocd project? Re: i.MX93 JTAG debugging Hello Zhiming_Liu, Can you please share the patch for openocd. Regards, Re: i.MX93 JTAG debugging Hello Zhiming_Liu, Could you please send me the patch for openocd as well. Many thanks, JS Re: i.MX93 JTAG debugging Hi @Zhiming_Liu Could you please send me @torus1000 that patch as well? Re: i.MX93 JTAG debugging Hello Zhiming_Liu, Can you please share the patch for openocd. Regards, VR. Re: i.MX93 JTAG debugging I didn't get any email with an attachment. Just the notification mail from this thread. Re: i.MX93 JTAG debugging Hi @lw1  I have sent the attachments via email. Re: i.MX93 JTAG debugging What attachment? Re: i.MX93 JTAG debugging Hello @lw1  You need patch the openocd refer attachments in email
View full article
Simultan 从 m7 内核访问 GPIO13,从 m4 内核访问 GPIO9 亲爱的恩智浦团队 CPU i.mxrt1176CVM8A。 在我的应用程序中,有一个基于内核 m4 的电机控制应用程序和一个基于内核 m7 的实时应用程序。 如果我同时从内核 m7 GPIO13 和内核 m4 GPIO9 进行访问,对 GPIO9 的访问将延迟超过 31 微秒。 在数据表中,我可以找到第 13.1 章和第 2.1.2 章系统总线图以下信息 当 LPSRMIX 主设备访问 GPIO13 时,XB 将保留对任何 AIPS4 外围设备的 WAKEUPMIX 主设备请求,直到当前 LPSRMIX 主设备访问完成为止。由于 GPIO13 访问基于 32 K 时钟,因为它位于 SNVS 域中以节省功耗,因此这些 WAKEUPMIX 主请求可以保留超过 31µs。 我理解从 AIPS4 到 GPIO13(LPSRMIX-Domin)之间的内核 m7 的延迟,但不理解从内核 m4 直接到 GPIO-SOC 的 GPIO9(WAKEUPMIX)引脚 GPIO_AD_31 超过 31µs 的延迟。 请在附件中找到总线图,我用绿色和蓝色通信标记: 请帮帮我。我的电机控制循环出现了问题! Re: Simultan access GPIO13 from core m7 and GPIO9 from core m4 你好,帕布罗、 非常感谢你们的快速回复。 cortex m7 是主时钟主时钟是:792.000.000 Hz cortex m4 的主时钟是:392.727.258 Hz 总线时钟根是:240 MHz 总线 LPSR 时钟根是:160 MHz 另请查看随附的配置文件。   BusDiagram.png 最美好的祝愿, Andreas   Re: Simultan access GPIO13 from core m7 and GPIO9 from core m4 你好@AndreasL、 我看不到总线图的附件。您能再发一次吗? 皮质系统有哪些配置? 两个 Cortex 的速度是多少? 敬上, Pablo Re: Simultan access GPIO13 from core m7 and GPIO9 from core m4 你好@AndreasL、 感谢你提供的信息。 在访问 GPIO13 寄存器期间,LPSR 功能域总线将处于暂停状态。 在这种情况下,GPIO9 是 LPSR 功能域的一部分,这意味着从 M4 内核到 GPIO9 的通信必须等到 M7 内核完成对 GPIO13 寄存器的访问。 参见表 3:i.MX RT1170 交叉处理器数据手册中的 i.MX RT1170 模块列表。 如果电机控制周期的执行受到这种行为的影响,可以尝试使用 GPIO13 以外的 GPIO。 致以最崇高的敬意 巴勃罗
View full article
i2cコールバックが呼び出されない こんにちは、チームの皆さん 私は、I²C 経由で LPC55S69 とインターフェースされた DAC モジュール (MCP47FEB21A0) を使用しています。 I2C_MasterTransferBlocking() は正常に動作することを確認しましたが、I2C_MasterTransferNonBlocking() を使用すると、I²C コールバックが呼び出されません。 I2C_MasterTransferNonBlocking() は kStatus_Success を返します。 参考までに、I2C_MasterTransferCreateHandle() は I²C 初期化中に 1 回呼び出されます。 I2C_MasterTransferNonBlocking() を使用しているときに I²C コールバックが呼び出されない理由を説明していただけますか? よろしくお願いいたします。 サントシュ Re: i2c call back is not getting called こんにちは@sushmasan lpcxpresso55s69_lpc_i2c_interrupt_b2b_transfer_master_cm33_core0 SDK デモを参照できると思います。 Harry_Zhang_0-1767855362914.png BR ハリー Re: i2c call back is not getting called こんにちは@Harry_Zhang 、 ご回答ありがとうございます。 非ブロッキング呼び出しで動作している他のセンサ モジュールがあります。 私は BMP390 センサを使用しており、I²C 通信は非ブロッキング呼び出しで正常に動作します。たとえば、レジスタ アドレスの 1 つが 0x01 の場合、サブアドレスを次のように割り当てます。 マスターXfer.サブアドレス = (uint32_t)0x01; ただし、DAC (MCP47FEB21A0) モジュールの場合、サブアドレスの割り当ては異なります。 uint8_t サブアドレス; subAddress = (uint8_t)(reg_addr << 3); // MCP47FEB21A0データシートによると、レジスタアドレスは3だけ左にシフトする必要がある。 masterXfer.subaddress = (uint32_t)subAddress; 何か違いはあるでしょうか? よろしくお願いいたします。 サン Re: i2c call back is not getting called こんにちは@sushmasan subaddressSize = 0 に設定して、DACのコマンドバイトとデータバイトをmasterXfer.dataに直接配置してみるといいと思います。次に書き込み転送を開始します。 BR ハリー Re: i2c call back is not getting called こんにちは@Harry_Zhang 、 私も試してみましたが、 uint8_t txData[3] = {0}; txData[0] = ( uint8_t ) (reg_addr << 3); txData[1] = ( uint8_t )(data >> 8); /* データ上位バイト */ txData[2] = ( uint8_t )(data & 0xFFU); /* データ下位バイト */ マスターXfer.data = txData; masterXfer. dataSize = 3; /* 合計3バイト */ 2 バイトのデータがあるため、reg addr を追加すると 3 バイトになります。 I2C_MasterTransferNonBlocking() を使用すると、依然として I²C コールバックが呼び出されません。 よろしくお願いいたします。 サン Re: i2c call back is not getting called 昨日あなたのメッセージに返信しましたが、誤ってトピックに返信してしまいました。あなたが気づいているかどうかわかりませんが、ここで再度あなたのメッセージに返信します。 こんにちは@Harry_Zhang 、 私も試してみましたが、 uint8_t txData[3] = {0}; txData[0] = ( uint8_t ) (reg_addr << 3); txData[1] = ( uint8_t )(data >> 8); /* データ上位バイト */ txData[2] = ( uint8_t )(data & 0xFFU); /* データ下位バイト */ マスターXfer.data = txData; masterXfer. dataSize = 3; /* 合計3バイト */ 2 バイトのデータがあるため、reg addr を追加すると 3 バイトになります。 I2C_MasterTransferNonBlocking() を使用すると、依然として I²C コールバックが呼び出されません。 よろしくお願いいたします。 サン Re: i2c call back is not getting called こんにちは@sushmasan 確認できるようにコードを共有していただけますか? BR ハリー Re: i2c call back is not getting called こんにちは@Harry_Zhang 、 参考までにコードスニペットをご覧ください。 #define I2C5_BASE (0x40096000u) #define I2C5_MASTER_BASE (I2C5_BASE) #define I2C5_MASTER_CLOCK_FREQUENCY (12000000) #define I2C5_MASTER ((I2C_Type *) I2C5_MASTER_BASE) static void i2c_master_callback(I2C_Type *base, i2c_master_handle_t *handle, status_t status, void *userData) { /* Signal transfer success when received success status. */ if (status == kStatus_Success) { // Successfully completed data transfer g_MasterCompletionFlag = true; g_i2cCallBackStatus = kStatus_Success; } /* Signal transfer failure when received failure status. */ else { if(status == kStatus_I2C_Nak) { g_i2cCallBackStatus = kStatus_I2C_Nak; } else if (status == kStatus_I2C_Addr_Nak) { g_i2cCallBackStatus = kStatus_I2C_Addr_Nak; } else if (status == kStatus_I2C_ArbitrationLost) { g_i2cCallBackStatus = kStatus_I2C_ArbitrationLost; } else { g_i2cCallBackStatus = false; } } return; } bool i2c_readwrite(i2c_master_transfer_t *masterXfer) { status_t status = kStatus_Fail; status_t finalStatus = kStatus_Fail; bool retVal = false; g_MasterCompletionFlag = false; g_i2cCallBackStatus = kStatus_Fail; /* Send master non-blocking data to slave (Performing the write operation) */ /* Allowing the CPU to continue executing other tasks in parallel while the I2C transfer is being handled in the background. */ status = I2C_MasterTransferNonBlocking(I2C5_MASTER, &g_m_handle, masterXfer); PRINTF("(%s() => Wait for the data transfer to slave completion. status:%d \r\n",__func__,status); /* Wait for transfer completed. */ while (!g_MasterCompletionFlag) { } g_MasterCompletionFlag = false; // Driver-level error (could not start transfer) if(status == kStatus_Success) retVal = true; // Transfer completed else retVal = false; g_i2cCallBackStatus = kStatus_Fail; return retVal; } // THIS IS WITH I2C NON BLOCKING CALL -> CALL BACK IS NOT GETTING INVOKED. bool dac_write_reg(uint8_t reg_addr, uint16_t data) { /* The DAC needs 1 address byte + 2 data bytes. */ static i2c_master_transfer_t masterXfer = {0}; static uint8_t txData[3] = {0}; bool retVal = false; bool write_status = false; memset(&masterXfer, 0, sizeof(masterXfer)); txData[0] = (uint8_t) (reg_addr << 3); txData[1] = (uint8_t)(data >> 8); txData[2] = (uint8_t)(data & 0xFFU); masterXfer.slaveAddress = 0x60; masterXfer.direction = kI2C_Write; masterXfer.subaddress = 0; masterXfer.subaddressSize = 0; masterXfer.data = txData; masterXfer.dataSize = 3; masterXfer.flags = kI2C_TransferDefaultFlag; write_status = i2c_readwrite(&masterXfer); if(true == write_status) { PRINTF("(%s) -> I2C write PASS @line:%d \r\n",__func__,__LINE__); retVal = true; } else { PRINTF("(%s) -> I2C write failed with status %d \r\n",__func__,write_status); retVal = false; } return retVal; } // THIS IS WITH I2C BLOCKING CALL -> WORKING FINE int8_t dac_write_reg(uint8_t reg_addr, uint16_t data) { /* The DAC needs 1 address byte + 2 data bytes. */ i2c_master_transfer_t masterXfer; uint8_t txData[2]; uint8_t subAddress; memset(&masterXfer, 0, sizeof(masterXfer)); subAddress = (uint8_t)(reg_addr << 3); /* DAC reg byte */ txData[0] = (uint8_t)(data >> 8); /* Data high byte */ txData[1] = (uint8_t)(data & 0xFFU); /* Data low byte */ masterXfer.slaveAddress = 0x60; masterXfer.direction = kI2C_Write; masterXfer.subaddress = (uint32_t) subAddress; masterXfer.subaddressSize = 1; masterXfer.data = txData; masterXfer.dataSize = 2; masterXfer.flags = kI2C_TransferDefaultFlag; status_t status = I2C_MasterTransferBlocking(I2C5_MASTER, &masterXfer); if (status == kStatus_Success) { PRINTF("(%s) -> dac_write_reg PASS @line:%d \r\n",__func__,__LINE__); status = 1; } else { PRINTF("(%s) -> I2C_MasterTransferBlocking() failed with status %d \r\n",__func__,status); status = -1; } return status; } int main() { I2C_MasterGetDefaultConfig(&masterConfig); I2C_MasterInit(I2C5_MASTER, &masterConfig, I2C5_MASTER_CLOCK_FREQUENCY); I2C_MasterTransferCreateHandle(I2C5_MASTER, &g_m_handle, i2c_master_callback, NULL); dac_write_reg(0x08, 0x0001); } Re: i2c call back is not getting called こんにちは@sushmasan あなたのコードを確認しました。 しかし、申し訳ありませんが、明らかな誤りは見つかりませんでした。オシロスコープを使用して、データの送信が正しいかどうか、返されたデータが正しいかどうかを確認することもできると思います。 BR ハリー
View full article
如何在 LS1024ARDB 上使用 CodeWarrior TAP <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 1.您应该拥有 CodeWarrior TAP( CWH-CTP-BASE-HE )和 LS1024A 探针提示( CWH-CTP-VSPA-YE )   2.为QorIQ LS系列ARMv7 ISA Windows v10.0.4安装CodeWarrior   3. 为LS1024/MA安装CodeWarrior补丁(LS1024A-2MA_Windows_SP.zip) 4. 将此工具连接到 LS1024A RDB 板并运行 CodeWarrior 环境。   5.启动引导程序并在 Barebox 命令行中停止它   6.在CodeWarrior环境中的File->New->Codewarrior Bareboard项目向导中添加一个LS1024A项目。 运行->调试配置->调试   7.窗口->显示视图->寄存器。您在此处阅读的仅是 ARM 架构寄存器。   8. 如果要读取外围设备控制器寄存器,请使用shell模式 窗口->显示->调试器外壳   CodeWarrior调试器 Shell v1.0 %> cmdwin::mem +偏移量 -s (使用命令“help cmdwin::mem”获取详细信息) 概述
View full article
android4.3でのfstrim機能のテストIMX6の場合 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 私は最近、sabresd-6qのfstrim機能について少し掘り下げました。以下に詳細をリストします。 バックグラウンド: Nexus 7が最初に登場したとき、多くのユーザーはそれがスピーディーで高性能であると感じました。しかし、アプリケーションをインストールしてタブレットを使用し始めて数か月後、事態は遅くなり始めました。これは、多くの人が新しいNexus 7(2013)モデルで修正されることを望んでいた摩擦点でした。しかし、話にはさらに多くのものがあります、それはGoogleがAndroid 4.3アップデートですべてのNexusデバイスでそのストレージI / Oのエージング問題を修正したことが判明しました。これには、将来のパフォーマンスに大きな影響を与える可能性のある少し誇大宣伝された機能が付属しています - fstrimによるTRIMサポート。 なぜペースを落とすのか? ソフトウェアでファイルを削除しても、実際にはソリッドステートストレージ(SSDまたはeMMC)には通信されないことに注意してください。スペースはユーザーの視点から解放されますが、この場合の eMMC コントローラーは、NAND のページを有効なデータを持つものとして扱います。たとえば、3GBの映画を内部ストレージにコピーし、映画を視聴して、後で削除するとします。3GBを再利用できますが、これらのブロックを書き直すまで、eMMCコントローラーはすべての3GBを有効なデータとして扱います。eMMC コントローラーが使用するデータ構造は、NAND の論理的な位置と物理的な位置のマッピングを追跡します。ここでは詳しく説明しませんが、マッピングが複雑になり、追跡する場所が増えれば増えるほど、内部のNAND管理は遅くなります。なぜSSDにこのような問題があるのですか?根本的な原因は「フラッシュメモリがブロックに分割され、さらにページに分割されている」ことです。最小の書き込み単位はページですが、最小の消去単位はブロックです」と、時間が経つにつれて断片が発生します。 なぜfstrimなのか? fstrim は TRIM から派生した Linux ファイルシステムのメカニズムの一つです。TRIM は linux2.6.33 からすでに導入されています。これは、オペレーティングシステムがファイルシステム内で空いているブロックをSSDに伝えるために送信できるコマンドの名前です。SSDはこの情報を使用して、ブロックを内部的に最適化し、空きページを迅速かつ効率的に書き込むことができるようにします。 フレームワークはandroid4.3でfstrimをどのようにトリガーしますか? Android4.3 では、適切なタイミングで fstrim をトリガーするタイミングと方法を管理するための新しいサービス IdleMaintenanceService が導入されています。システムが次の条件を満たすと、MountService がリッスンする 1 つの "ACTION_IDLE_MAINTENANCE_START" インテントが送信されます。 前回「ACTION_IDLE_MAINTENANCE_START」インテントが送信されてから 24 時間前。 デバイスは、80%のバッテリーを備えたオフチャージャーまたは30%のバッテリーを備えたオンチャージャーのいずれかです デバイスはアイドル状態になることがあります。 ユーザーは71分間使用しないでください。 Test fstrim on Imx.6 fstrimをトリガーするのを少し待つために、71分と24時間を待たないように次の変数を変更してみました。変更後、システムがアイドル状態になってから 2 分後に 30 分ごとに 1 回 fstrim がトリガーされます。 --- a/services/java/com/android/server/IdleMaintenanceService.java +++ b/services/java/com/android/server/IdleMaintenanceService.java - private static final long MIN_IDLE_MAINTENANCE_INTERVAL_MILLIS = 24 * 60 * 60 * 1000;1日間 + private static final long MIN_IDLE_MAINTENANCE_INTERVAL_MILLIS = 30 * 60 * 1000;30分間 - private static final long MIN_USER_INACTIVITY_IDLE_MAINTENANCE_START = 71 * 60 * 1000;71分 + private static final long MIN_USER_INACTIVITY_IDLE_MAINTENANCE_START = 2 * 60 * 1000;2分間 - プライベートスタティックファイナルロングMAX_IDLE_MAINTENANCE_DURATION = 71 * 60 * 1000;71分 + private static final long MAX_IDLE_MAINTENANCE_DURATION = 2 * 60 * 1000;2分間 まず、Quadrant apkを実行して、最初にI / Oパフォーマンスを確認しますが、そのスコアは3544です。 この30分間で、システムをめちゃくちゃにしようとすることができます。ほとんどのapkをインストールするために最善を尽くしてください。バックグラウンドでモンキーテストを実行します。 次に、I/Oパフォーマンスを確認するためにQuadrantを再度実行しますが、そのスコアはわずかに低下しているだけです3538。 その後、「logcat |busybox grep -i fstrim」コンソールでfstrimのアクションを待つために、ここに私のlogcatがあります: 130|root@sabresd_6dq:/ # logcat -d | busybox grep -i fstrim I/fstrim ( 2344): fstrim 作業を開始しています... I/fstrim ( 2344): /data で FITRIM ioctl を呼び出しています。 I/fstrim ( 2344): /data の 6367305728 バイトをトリミング I/fstrim ( 2344): /cache で FITRIM ioctl を呼び出しています。 I/fstrim ( 2344): /cache の 526355456 バイトをトリミング I/fstrim ( 2344): fstrim の作業が完了しました。 OK、I / O情報を再度確認したところ、スコアは3546に復元されています。 まとめ 良い、fstrimが有効になります。したがって、android4.3 を使用した imx.6 では、fstrim も自動的に動作します。また、I/Oメモリでも良好なパフォーマンスを発揮します。すごい! 日時:android4.3でのfstrim機能のテストIMX6の場合 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> GGGOODDDDの
View full article
FXLS8471Q - ベアメタルサンプルプロジェクト <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> ねえ皆さん この記事では、新しい Xtrinsic FXLS8471Qデジタル加速度センサーの簡単なベアメタルの例のコードについて説明します。私は、2013年に導入されたXtrinsicセンサの多くをFXLS8471Q搭載した最近リリースされた FRDM-FXS-MULTI(-B)センサ拡張ボードを、フリースケールの FRDM-KL25Z開発プラットフォームと組み合わせて使用しました。FreeMASTERツールは、SPIインターフェースを介した割り込み手法を使用して、FXLS8471Qから読み取られた加速度データを視覚化するために使用されます。 このサンプルでは、次のことを示しています。 1. MKL25Z128 MCU(主にSPIおよびPORTモジュール)の初期化。 2. SPIデータの書き込みおよび読み取り操作。 3.最高の解像度を達成するための加速度計の初期化。 4. AN4069に基づく簡単なオフセットキャリブレーション。 5. 割り込み技術を使用してデータを読み出して出力します。 6. レジスタ0x01 – 0x06からの出力値をg単位の実際の加速度値に変換します。 7. FreeMASTERツールでの出力値の視覚化。 1.FRDM-FXS-MULTI(-B)/FRDM-KL25Zの回路図と下の画像でわかるように、SPI信号はKL25Z MCUのSPI0モジュールにルーティングされ、INT1出力はPTA5ピンに接続されます(センサーボードのJ6のピン2-3がジャンパーを使用して一緒に接続されていることを確認してください)。PTD0ピン(チップセレクト)はSPI0モジュールによって自動的に制御されないため、汎用出力として構成されています。FXLS8471QのINT1出力はプッシュプルアクティブLOW出力として構成されているため、対応するPTA5ピン構成は、立ち下がりエッジに割り込みがあるGPIOです。コア/システム・クロック周波数は20.97MHz、SPIクロックは524.25kHzです。 したがって、MCUは次のように構成されます。 void MCU_Init(void) { SPI0モジュールの初期化 SIM_SCGC4 |= SIM_SCGC4_SPI0_MASK;       SPI0モジュールへのクロックをオンにします SIM_SCGC5 |= SIM_SCGC5_PORTD_MASK;      ポートDモジュールへのクロックをオンにします PORTD_PCR1 = PORT_PCR_MUX(0x02);        PTD1ピンはSPI0 CLKライン PORTD_PCR2 = PORT_PCR_MUX(0x02);        PTD2ピンはSPI0 MOSIライン PORTD_PCR3 = PORT_PCR_MUX(0x02);        PTD3ピンはSPI0 MISOライン PORTD_PCR0 = PORT_PCR_MUX(0x01);        PTD0ピンはGPIOとして構成されています(CSラインは手動で駆動されます) GPIOD_PSOR |= GPIO_PSOR_PTSO(0x01);     PTD0 = 1 (CS 非アクティブ) GPIOD_PDDR |= GPIO_PDDR_PDD(0x01);      PTD0ピンはGPIO出力          SPI0_C1 = SPI_C1_SPE_MASK | SPI_C1_MSTR_MASK;     // Enable SPI0 module, master mode SPI0_BR = SPI_BR_SPPR(0x04) |SPI_BR_SPR(0x02);    ボーレート = バスクロック / ((SPPR+1) * 2^(SPR+1)) = 20970000 / ((4+1) * 2^(2+1)) = 524.25 kHz                   PTA5ピン(FXLS8471QのINT1に接続)を立ち下がりエッジ割り込み用に構成します SIM_SCGC5 |= SIM_SCGC5_PORTA_MASK;      ポートAモジュールへのクロックをオンにします PORTA_PCR5 |= (0|PORT_PCR_ISF_MASK|     割り込みフラグをクリアする PORT_PCR_MUX(0x1)|     // PTA5はGPIOとして構成されています PORT_PCR_IRQC(0xA));   PTA5 は立ち下がりエッジ割り込み用に構成されています            NVICでのPORTA割り込みの有効化 NVIC_ICPR |= 1 << ((INT_PORTA - 16) % 32); NVIC_ISER |= 1 << ((INT_PORTA - 16) % 32); } 2. FXLS8471Qは「モード0」SPIプロトコルを使用しており、クロック信号の非アクティブ状態がローであり、データはクロック信号のリーディングエッジでキャプチャされ、立ち下がりエッジで変更されます。 SA1/CS_Bピンの立下りエッジがSPI通信を開始します。書き込み操作は、R/Wビットに1を送信することで開始されます。次に、8ビットレジスタアドレスADDR[7:0]が1番目と2番目のシリアル化されたバイトにエンコードされます。書き込まれるデータは、シリアル化された 3 番目のバイトから開始されます。ビットの順序は次のとおりです。 Byte 0: R/W, ADDR[6], ADDR[5], ADDR[4], ADDR[3], ADDR[2], ADDR[1], ADDR[0] Byte 1: ADDR[7], X, X, X, X, X, X, X Byte 2: DATA[7], DATA[6], DATA[5], DATA[4], DATA[3], DATA[2], DATA[1], DATA[0] SA1/CS_Bピンの立ち上がりエッジはSPI通信を停止します。 以下は、CTRL_REG1(0x3A)に値0x3Dを書き込む書き込み操作です。 同様に、読み取り操作は、R/W ビットに 0 を送信することによって開始されます。次に、8ビットレジスタアドレスADDR[7:0]が1番目と2番目のシリアル化されたバイトにエンコードされます。データはMISOピンから読み取られます(MSBが最初に)。 以下のスクリーンショットは、WHO_AM_Iレジスタ(0x0D)から正しい値0x6Aを読み取る読み取り操作を示しています。 複数の読み取り操作は、1 つの読み取りと同様に実行されます。ただし、8 つの SCLK サイクルの倍数でバイトが読み取られる点が異なります。レジスタ アドレスは自動インクリメントされるため、次のクロック エッジの 8 つごとに次のレジスタの MSB がラッチされます。 レジスタ0x01から0x06への6バイトのバースト読み出しを以下に示します。また、加速度出力データを読み出すことでINT1ピンが自動的にクリアされる様子も示しています。 3. 初期化の開始時に、CTRL_REG2レジスタのRSTビットを設定して、すべての加速度計レジスタをデフォルト値にリセットする必要があります。ただし、ソフトウェアのリセットは、 FXLS8471Qデータシートの付録Aで説明されているように、SPIモードでは正しく機能しません。したがって、ソフトウェアのリセットを実行する次のコードは使用しないでください。代わりに、FRDM-FXS-MULTI-BボードのR46を短縮して、ハードウェアリセットをアクティブにしました。 ダイナミックレンジは±2gに設定され、最高の分解能を達成するために、LNOISEビットが設定され、最低ODR(1.56Hz)と高解像度モードが選択されます(詳細は AN4075を参照)。DRDY割り込みはイネーブルされ、プッシュプルのアクティブロー出力に設定されたINT1割り込みピンに送られます。 void FXLS8471Q_Init (void) { 符号なし文字 reg_val = 0;     /* 付録 A で説明されているように、SPI モードではソフトウェア リセットが正しく機能しません FXLS8471Qデータシートのしたがって、次のコードは使用されません。 FRDM-FXS-MULTI-BボードのR46を短縮して、ハードウェアリセットをアクティブにしました。*/     /*FXLS8471Q_WriteRegister(CTRL_REG2, 0x40);    すべてのレジスタをPOR値にリセット     一時停止(0x631);    ~1msの遅延            do // RSTビットがクリアされるのを待ちます { reg_val = FXLS8471Q_ReadRegister(CTRL_REG2) & 0x40; } while (reg_val);*/           FXLS8471Q_WriteRegister(XYZ_DATA_CFG_REG、0x00);         +/-2gレンジ、~0.244mg/LSB FXLS8471Q_WriteRegister(CTRL_REG2、0x02);           高解像度モード FXLS8471Q_WriteRegister(CTRL_REG3、0x00);           プッシュプル、アクティブ LOW 割り込み FXLS8471Q_WriteRegister(CTRL_REG4, 0x01);           DRDY割り込みをイネーブルにする FXLS8471Q_WriteRegister(CTRL_REG5, 0x01);           INT1 - PTA5 にルーティングされた DRDY 割り込み   FXLS8471Q_WriteRegister(CTRL_REG1、0x3D);           ODR=1.56Hz、ノイズ低減、アクティブモード     } 4. AN4069に準拠したシンプルなオフセットキャリブレーション方法が実装されています。 ボイドFXLS8471Q_Calibration(ボイド) {      char Xoffset, Yoffset, Zoffset;       データレディ = 0;          一方 (!DataReady){} // 最初のデータセットは準備ができていますか? データレディ = 0;       FXLS8471Q_WriteRegister(CTRL_REG1、0x00);    スタンバイモード              FXLS8471Q_ReadMultiRegisters(OUT_X_MSB_REG、6、AccData);    データ出力レジスタの読出し 0x01-0x06                                                Xout_14_bit = ((ショート) (AccData[0]<<8 |AccData[1])) >> 2;    14ビットX軸出力値を計算 Yout_14_bit = ((ショート) (AccData[2]<<8 |AccData[3])) >> 2;    14ビットY軸出力値を計算 Zout_14_bit = ((ショート) (AccData[4]<<8 |AccData[5])) >> 2;    14ビットZ軸出力値を計算                                         Xoffset = Xout_14_bit / 8 * (-1);    X軸オフセット補正値を計算 Yオフセット= Yout_14_bit / 8 *(-1);    Y 軸オフセット補正値の計算 Zオフセット=(Zout_14_bit-SENSITIVITY_2G)/ 8 *(-1);    Z 軸オフセット補正値の計算                                         FXLS8471Q_WriteRegister(OFF_X_REG, Xoffset); FXLS8471Q_WriteRegister(OFF_Y_REG, Yoffset); FXLS8471Q_WriteRegister(OFF_Z_REG, Zoffset);              FXLS8471Q_WriteRegister(CTRL_REG1、0x3D);    再びアクティブモード } 5. ISR では、割り込みフラグのみがクリアされ、新しいデータの到着を示すために DataReady 変数が設定されます。 ボイドPORTA_IRQHandler() { PORTA_PCR5 |= PORT_PCR_ISF_MASK;    割り込みフラグをクリアする データレディ = 1; } 6.加速度計レジスタ0x01〜0x06からの出力値は、最初に符号付き14ビット値に変換され、その後、g単位の実際の値に変換されます。 if (DataReady) 新しいデータセットは準備ができていますか? { データレディ = 0;                                                                                                                   FXLS8471Q_ReadMultiRegisters(OUT_X_MSB_REG、6、AccData);    データ出力レジスタの読出し 0x01-0x06                                                   Xout_14_bit = ((ショート) (AccData[0]<<8 |AccData[1])) >> 2;    14ビットX軸出力値を計算 Yout_14_bit = ((ショート) (AccData[2]<<8 |AccData[3])) >> 2;    14ビットY軸出力値を計算 Zout_14_bit = ((ショート) (AccData[4]<<8 |AccData[5])) >> 2;    14ビットZ軸出力値を計算                                       Xout_g = ((float) Xout_14_bit) / SENSITIVITY_2G;    X 軸の出力値を g で計算します Yout_g = ((float) Yout_14_bit) / SENSITIVITY_2G;    Y 軸の出力値を g で計算します Zout_g = ((float) Zout_14_bit) / SENSITIVITY_2G;    Z 軸の出力値を g で計算します } 7. 計算された値は、Debugパースペクティブの右上にある「Variables」ウィンドウまたはFreeMASTERアプリケーションで確認できます。FreeMASTERプロジェクトを開いて実行するには、 FreeMASTER 1.4アプリケーション と FreeMASTER通信ドライバをインストールしてください。 MCUのv10.5のCW で書かれた完全なソースコード( FreeMASTERプロジェクトを含む) が添付されています。 この簡単なアプリケーションについて質問がある場合は、以下からお気軽にお問い合わせください。フィードバックや提案も大歓迎です。 よろしくお願いします。 Tomas 加速度センサ Re:FXLS8471Q - ベアメタルサンプルプロジェクト <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> hi Tomas サンプルコードを実行しようとしていますが、正しく実行されているかどうかわかりません それが正しいかどうかを確認できますか?または私にいくつかの提案をしてください - Code Warrior 10.6を使用しました - R46で、ワイヤーラップ付きのブリッジを作成しましたか、それとも起動時に瞬間的にリセットする必要がありますか? - 示したように、Code Warrior からデバッグ モード (実行中) でボードをリセットしたときにのみ、一部の値を取得します。 - その値をFreemasterツールにプロットできず、応答タイムアウトが発生します(アプリのデバッグ中) - J6(2-3)はジャンパで接続されています - 一度実行するか、x、y、zの値を継続的に取得します よろしくお願いいたします カルロス
View full article
i.MX 电源分析系统:仪表电路板 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 仪表板 要对电路板进行检测,需要断开电源和目标设备之间的连接,通常是通过放置在电路板上的串联电阻。有时,如果电路板设计人员没有在导轨上安装串联电阻,则需要抬起电感器。理想情况下,电路板上还提供通孔连接,用于连接这些板外传感器。 这里有三张特写照片,展示了几块已经过检测的电路板: 在这三种情况下,传感器都通过两根外部载流导线固定到位。中间和右边使用绝缘电线,而左边使用裸线。在这三种情况下,传感器的 + 连接需要通向电源和 -连接至目标设备。这里的外线规格为 24-26 号。(使用相对较粗的导线是为了将插入智能传感器的串联电阻保持在最低限度。) 接地连接是智能传感器的中间孔。在左侧和中间的照片中,一根 30 号线连接到电路板中间的孔接地连接。在右边的照片中,地线更方便地添加到照片底部边缘正下方的一个大盖子上。 以下是上面两块板的广角视图照片: 左侧的传感器是独立的,因为载流导线足够坚硬,可以将其直立起来。必须小心,因为过度弯曲会导致电线断裂。弯曲过多也会导致电路板短路(这就是为什么这些电路板上使用绝缘电线的原因)。右侧的电路板上有与其平行放置的传感器。它们没有固定在电路板上,但是一根电线缠绕在带状电缆束上,在照片右边缘看不见。 对于没有通孔连接的电路板,需要固定智能传感器以防止将 SMT 焊盘从电路板上拉下来。如果电路板上、连接器或大型组件的侧面有空间,则可以使用泡沫双面胶带将传感器粘贴下来(见下图,传感器固定在 i.MX7ULP 顶部): 对于没有方便的空闲区域或传感器过多的电路板,需要设计其他方法来固定智能传感器。在下方左侧的照片中,每个传感器的两个电感器被翻转,并且两个传感器被插入以检测两个轨道。智能传感器的任何移动都很容易导致电感器上的焊盘断裂,因此需要 3D 打印一个带有夹子的笼子来固定带状电缆。在背面,有足够的空间将聚合器用拉链绑在底板上,这样仪表板就可以作为一个单元移动,同时尽量减少带状电缆的弯曲。 i.MX 8 系列 | i.MX 8QuadMax (8QM) | 8QuadPlus i.MX 8M | i.MX 8M Mini | i.MX 8M Nano i.MX6_全部 i.MX6DL i.MX6 双核 i.MX6DualPlus6QuadPlus i.MX6 四核 i.MX6S i.MX6SL i.MX6SoloX i.MX6UL i.MX7 双核 i.MX7 单核 i.MX7ULP PMIC 回复:i.MX 电源分析系统:检测电路板 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 这是一个外部电流传感器板: https://community.nxp.com/docs/DOC-335699 回复:i.MX 电源分析系统:检测电路板 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 那块紫色的板子是什么?
View full article
基于NFC读取器库的PN7462 SPIM演示创建指南 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> SPIM 模块是 PN7462 提供的主接口之一,PN7462 是一款基于 32 位 ARM Cortex-M0 的 NFC 微控制器,用户可以使用此接口连接最多两个 SPI 从设备。 NFC读取器库在phHal/phhalSPIM中提供了SPIM驱动代码,用户可以在其应用程序中直接使用以下API来实现简单的SPI交易,就像在“PN7462AU_ex_phExHif”的演示中所做的那样。 但此演示对于某些 SPI 或闪存设备有限制,这些设备需要在一个 NSS 会话中进行写入和读取操作,例如如下所示的 OM27462 上的 SPI 或闪存设备: 请注意焊接 R202 并将其连接到 3V3,以确保 nHold 引脚具有 POR 上拉功能。 以下是该设备支持的命令集之一: 该命令在一个 NSS 会话中包含 1 次写入 (9F) 操作和随后的 3 次读取操作,但如果您使用 phhalSPIM_Transmit() 和 phhalSPIM_Receive() 实现该命令,如下所示: 状态 = phhalSPIM_Transmit(PH_EXHIF_HW_SPIM_SLAVE, PH_EXHIF_HW_SPIM_INIT_CRC, PH_EXHIF_HW_SPIM_APPEND_CRC, PH_EXHIF_HW_SPIM_CRC_INIT, 2, cmd_buf, PH_EXHIF_HW_SPIM_CRC_OFFSET);   状态 = phhalSPIM_Receive(PH_EXHIF_HW_SPIM_SLAVE、PH_EXHIF_HW_SPIM_INIT_CRC、PH_EXHIF_HW_SPIM_CRC_INIT、数据长度、dst、PH_EXHIF_HW_SPIM_CRC_OFFSET);” 您将获得以下结果: 预期的: NSS   \__________________________/ MOSI     CMD A7-A0 味噌数据       actual:                         NSS   \____________||______________/ MOSI     CMD A7-A0 味噌数据 因此写入和读取之间的脉冲是问题所在,在这里我们必须借助 SPIM_CONFIG_REG 中的 NSS_VAL 和 NSS_CONTROL 位手动处理 NSS 线。 所以代码应该是这样的:   Assert NSS   状态 = phhalSPIM_Transmit(PH_EXHIF_HW_SPIM_SLAVE, PH_EXHIF_HW_SPIM_INIT_CRC, PH_EXHIF_HW_SPIM_APPEND_CRC, PH_EXHIF_HW_SPIM_CRC_INIT, 2, cmd_buf, PH_EXHIF_HW_SPIM_CRC_OFFSET);   状态 = phhalSPIM_Receive(PH_EXHIF_HW_SPIM_SLAVE、PH_EXHIF_HW_SPIM_INIT_CRC、PH_EXHIF_HW_SPIM_CRC_INIT、数据长度、dst、PH_EXHIF_HW_SPIM_CRC_OFFSET);”   De-assert NSS NSS 线的置位和取消置位功能可以通过寄存器位级 API 来实现,如下所示:             PH_REG_SET_BIT(SPIM_CONFIG_REG, NSS_VAL);//de-assert NSS             PH_REG_SET_BIT(SPIM_CONFIG_REG, NSS_CTRL);             PH_REG_CLEAR_BIT(SPIM_CONFIG_REG, NSS_VAL);//assert NSS 请在您的应用程序代码中包含以下头文件。 #include "ph_Reg.h" #include “PN7462AU/PN7462AU_spim.h” 请注意,phhalSPIM_Transmit() 和 phhalSPIM_Receive() 是基于 Rom 的函数,默认情况下清除 NSS_CTRL 位。我们无法改变 ROM API 的行为,但幸运的是我们有 phhalSPIM_TransmitContinue() 和 phhalSPIM_ReceiveContinue()。所以最终的解决方案如下: Assert NSS   状态=phhalSPIM_TransmitContinue(1,cmd_buf);   状态=phhalSPIM_ReceiveContinue(3,dst);   De-assert NSS 这并不意味着 phhalSPIM_Transmit() 和 phhalSPIM_Receive() 没有用,因为如果您不想使用寄存器位级 API 手动初始化 SPIM 模块,它们还可以帮助配置 SPI 主接口。请注意使用 1 个字节作为写入/读取长度以使这两个功能正常工作。 所以整个伪代码如下所示: phhalSPIM_Init(PH_HW_SPIM_TIMEOUT) ; phhalSPIM_Configure(PH_HW_SPIM_SLAVE, PH_HW_SPIM_MSB_FIRST,                 \                                     PH_HW_SPIM_MODE, PH_HW_SPIM_BAUDRATE,  \                                     PH_HW_SPIM_NSSPULSE, PH_HW_SPIM_NSSPOL) ; 状态 = phhalSPIM_Transmit(PH_EXHIF_HW_SPIM_SLAVE, PH_EXHIF_HW_SPIM_INIT_CRC, PH_EXHIF_HW_SPIM_APPEND_CRC, PH_EXHIF_HW_SPIM_CRC_INIT, 1, cmd_buf, PH_EXHIF_HW_SPIM_CRC_OFFSET);   状态 = phhalSPIM_Receive(PH_EXHIF_HW_SPIM_SLAVE,PH_EXHIF_HW_SPIM_INIT_CRC,PH_EXHIF_HW_SPIM_CRC_INIT,1,dst,PH_EXHIF_HW_SPIM_CRC_OFFSET);” Assert NSS   状态=phhalSPIM_TransmitContinue(1,cmd_buf);   状态=phhalSPIM_ReceiveContinue(3,dst);   De-assert NSS 以下步骤介绍如何基于 NFC 读取器库创建新项目,有关如何导入 NFC 读取器库,请参阅https://www.nxp.com/docs/en/user-guide/UM10883.pdf 。 1.导入NFC读写器库后创建新项目。 2.如果您安装了 PN7462 支持包,您将看到以下内容: 3.添加NFC读取器库的链接: 4. 在项目中添加路径并启用NFC读取器库: 5.删除cr_startup.c并创建主代码以及头文件: 6.构建结果: 7.Debug result: 要获取现成的演示,请通过https://community.nxp.com/docs/DOC-329745指南提交私人票。 希望有帮助, 顺祝商祺! Kan 接触式智能卡读卡器芯片 NFC 控制器解决方案 NFC读卡器库
View full article
第 1 节:MQX 架构和初始化 - 实验指南 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 该视频演示是MQX RTOS 应用程序开发基础知识培训课程的第一部分。在本课程中,您将了解 MQX 架构,了解 MQX 的初始化方式,并了解如何安排和确定任务的优先级。 该培训由Embedded Access Inc.创建,该公司是飞思卡尔赞助的培训提供商和可靠的合作伙伴。 第 1 场课程线 实验室主题 创建任务 设置优先级 调度 同步概念 驱动程序介绍 创建环境 创建源代码 了解结果 首先,观看飞思卡尔网站上的第 1 节:MQX 架构和初始化的视频。 然后,完成下面的交互式实验室作业。 第 1 节:实验作业 简介 本实验室将引导您了解从头开始新项目的基础知识,然后创建应用程序所需的所有任务。目前,这些任务只会打印出一条唯一的消息,但设置环境和应用程序的外壳是重要的第一步。 目的 本实验的目标是在目标硬件上下载并运行您的第一个 MQX 应用程序。 这一目标将通过以下方式实现: 使用 CodeWarrior 新项目向导创建 MQX 项目 添加所有必需任务的存根 修改任务模板以自动启动所有任务 您将使用的新功能/结构: Printf,_task_block,TASK_TEMPLATE_LIST 转让 创造环境 创建一个新的 MQX 项目。当被问及将使用哪些库时,您应该将 shell 库添加到您的项目中。代码将从闪存运行,请务必使用“int flash debug PnE Multilink”。 此视频已被删除。 (在 “我的视频” 中查看) 导入塔式 K70 板的 BSP、PSP 和 Shell,并重新构建这些库。 现在我们需要为每个任务的源代码添加 .c 文件。为此,我们需要为每个任务创建一个单独的文件,因此在源代码文件夹中,您将包含 HealthTask.c、DisplayTask.c 等文件。最后,您将获得 8 个新文件以及创建项目时创建的 main.c 和 main.h 文件。在 CodeWarrior 中,右键单击源文件夹并选择“新建”>“源”即可添加新文件。这将创建一个包含极少量代码的新文件,以便您入门,其中包括一个将消息打印到默认输出流然后中止的函数。将每个函数的名称更新为与此文件关联的函数(例如:Temp_task)。如果您使用的工具在创建新文件时没有填写极少量代码,请创建一个简单的单行函数来打印消息。 /* * TempTask.c * 创建日期:2014年2月6日 * 作者:Embedded Access Inc */ #include "main.h" /*任务* - - - - - - - - * 任务名称:Temp_task * 评论 : * 此任务打印“Hello World” *END*----------------*/ void Temp_task(uint_32_t initial_data) { printf("\n 临时:Hello World\n") } 我们需要为每个新函数添加一个函数原型,可以将其添加到 main.h 中 /* 示例函数原型 */ 外部无效Healt_task(uint32_t); 因为我们将使用 printf () 函数,所以你应该包含 stdint.h头文件位于main.h的顶部。 由于一些原因,我们需要为每个任务设置一个唯一的 ID 号,但当然,仅使用数字会造成混淆且容易出错,因此,使用定义将每个任务设置为唯一的数字更为实际。您可以使用一系列#define 语句来执行此操作,但当然您可能会无意中将两个定义分配给同一个数字。可以使用枚举结构来避免这种情况,您将在整个课程中看到这一点。在自动生成的代码中找到“#define MAIN_TASK 1”并将其替换为定义所有 8 个任务 HEALTH_TASK、DISPLAY_TASK 等的枚举。 要创建任务,您需要更新 main.c 中的任务模板列表。模板列表将在课程的后续部分介绍,但它本质上是一个表格,用于标识应用程序中将包含的所有任务,并为 MQX 提供有关每个任务的一些信息。项目生成的源代码包含一个起始任务模板列表,其中只有一个名为“main_task”的任务。您不需要 main_task,但可以参考此条目输入所需的条目。请务必在模板列表中保留零条目,以标记列表的末尾。创建应用程序中将包含的所有 8 个任务:健康任务、显示任务、加速任务、温度任务、输入任务、CAN 任务、UI 任务和防盗任务。所有任务都应设置为优先级 9,堆栈大小为 1500,并且自动启动。 /* 示例任务模板列表条目 */ {HEALT_TASK, Healt_task, 1500, 9, "Health_task", MQX_AUTO_START_TASK}, 在 main.c 中的模板列表下面您将看到 main_task 自动生成的代码。我们的系统中没有名为 main 的任务,因此可以将其删除。 对于每个新任务,我们需要稍微更新代码。将 printf 更改为“printf("\n Function: Hello World \n");”。在您的代码中,“Function”将是此文件中函数的实际名称(例如 Health、Display、Temp 等)。将 mqx_exit 替换为 _task_block() 函数。请务必更新所有注释以反映此函数的名称。此外,每个函数都应包含 main.h 头文件,因为其中包含一些定义和函数原型。 运行应用程序以确认每个任务的消息都打印到控制台上。 您的打印输出应该看起来像这样 回顾打印语句的顺序并解释为什么它们按这样的顺序出现。 结果解释 任务将按照任务模板列表 (TTL) 中列出的顺序创建和运行。因此,您看到的打印输出的顺序应该与 TTL 中列出的任务的顺序相匹配。 在课程的后面,我们将研究当任务处于不同优先级时会发生什么,但现在,由于所有任务都处于相同的优先级,它们将按照创建的顺序启动和运行。 需要更多帮助吗?此实验室的完整源代码可以在此处的“实验室源代码”文件夹中找到。 回复:课程 1:MQX 架构和初始化 - 实验指南 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 你好 我很难看完这个视频。视频没有播放,我复制了链接,但出现以下问题: 这 video-svc.jivesoftware.com 找不到页面 未找到该网址的网页: https://video-svc.jivesoftware.com/videos/5bd5d2ca898ff/assets/8850941/play.mp4?player_profile=2016_1_0&auth_token=41cd81004941968141d394bebd6fc98a40296d91f1677603568e4ed316b4be21&logo_image_url=https %3A% 2F %2Fcommunity.nxp.com% 2Fservlet %2FJiveServlet% 2FdownloadImage %2F1101-1-5287% 2FFS_watermark1x1.png& HTTP ERROR 404 该视频还能播放吗?还是已被删除? 谢谢! Angelico Corte
View full article
RingBufferUInt8_1.003_09.08.2012.PEupd <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> リングバッファUInt8 形容 符号なし8ビットエンティティのリングバッファ コンポーネント RingBufferUInt8.PEupd Dependencies なし ライセンス ライセンス : オープンソース (LGPL) 著作権:(c)著作権Erich Styger、2012、無断複写・転載を禁じます。 これは、Processor Expertの組み込みコンポーネントのオープンソースソフトウェアです。 これはフリーソフトウェアであり、次の条件のライセンスポリシーの下で教育、研究、および商用開発に開放されています。 *これはフリーソフトウェアであり、保証はありません。 ※使用制限はありません。あなたは、あなたの責任の下で、個人、非営利、または商用製品のためにそれを使用、変更、および再配布することができます。 ※ソースコードの再配布には、上記の著作権表示を保持する必要があります。 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> リングバッファUInt8 形容 符号なし8ビットエンティティのリングバッファ コンポーネント RingBufferUInt8.PEupd Dependencies なし ライセンス ライセンス : オープンソース (LGPL) 著作権:(c)著作権Erich Styger、2012、無断複写・転載を禁じます。 これは、Processor Expertの組み込みコンポーネントのオープンソースソフトウェアです。 これはフリーソフトウェアであり、次の条件のライセンスポリシーの下で教育、研究、および商用開発に開放されています。 *これはフリーソフトウェアであり、保証はありません。 ※使用制限はありません。あなたは、あなたの責任の下で、個人、非営利、または商用製品のためにそれを使用、変更、および再配布することができます。 ※ソースコードの再配布には、上記の著作権表示を保持する必要があります。 コンポーネント交換
View full article
i.MX53 の QT5 のビルド <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 前提条件: ビルドは、freescale.com からダウンロードするか、Yocto fsl-image-guiからビルドできるビルド済みのrootfs(LTIBに基づく)で検証されます 次の手順は、ホストで実行されます。 1. qt5 の git respository をダウンロードします。 $ git clone git://gitorious.org/qt/qt5.git qt5 CDのQT5 これを と考えてみましょう。 2. qt5 パッケージ用にインストールするビルドディレクトリを作成します。このディレクトリは、任意の場所に配置できます。例えば $ mkdir /opt/qt5 sudo chown -R /opt/qt5 installdir を /opt/qt5 とすると仮定します。 3. Qt5ディレクトリに入り、perl init-repositoryスクリプトを実行して、すべてのソースコードをダウンロードします。 Qt5です。すべてのソースコードをダウンロードするには、約1時間かかります。 $ perl init-リポジトリ 4. 添付のlinux-imx5-g++.tar.gzをダウンロードし、qtbase/mkspecs/devices にコピーします。 updstreamを試してみます。 5. 次のパスから $ gedit qtbase/mkspecs/devices/linux-imx5-g++/qmake.conf   6.qmake.conf の先頭で、configure 行があります。設定行をコピーして、次の場所にあるテキストファイルに貼り付けます ビルドビルドディレクトリにあります。configure 行を編集して、ツールチェーンとファイルシステムを見つけます。また、以下の点に注意してください。 オプション-no-pch、-no-opengl、-opengl es2を含めます。次に例を示します。 configure 行。 $ cd $ cd qtbase $ ./configure -v -opensource -confirm-license -no-pch -opengl es2 -make libs -device imx5 \ -nomake の例 -nomake デモ \ -device-option CROSS_COMPILE=/opt/freescale/usr/local/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin/arm-fsl-linux-gnueabi-\ -sysroot -no-gcc-sysroot \ -prefix 7. configure行と実行可能ファイルを含むテキストファイルを作成し、実行します。設定の概要が表示されたら、Qt5 openGL ES 2.0 をサポートしています。ビルドを行う $make インストール$make Qt5 のビルドが完了すると、Qt5 は 2 つの場所にインストールされます。 1. / 2. / これは、Qt5 のすべてのライブラリとバイナリがホストとターゲットファイルシステムにインストールされているため、良いことです。そこで ターゲットには、Qt5 を実行するために必要なすべてのライブラリとバイナリがすでにあります。 8. また、qtjsbackendとqtdeclarativeをビルドする必要があります。 $ cd $ cd qtjsバックエンド $ ../qtbase/bin/qmake -r $ make & make install $ $ cd $ cd qtdeclarative $ ../qtbase/bin/qmake -r $ make & make install 9. Qtアプリをターゲットで実行する - ターゲットをNFSまたはSDイメージで起動します。 - フォルダ がターゲットファイルシステムの "/usr/local" にコピーされていることを確認してください。    - を使用してアプリケーションを起動する $ cd /usr/local/qt5/examples/opengl/hellogl_es2 $./hellogl_es2-プラットフォームEGLFS i.MX53 日時:i.MX53用のQT5の構築 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> このエラーを取り除くための回避策として、オプション-no-opensslを使用します ./configure -v -opensource -確認-ライセンス -no-pch -opengl es2 -make libs -device imx5 -no-openssl -no-xcb -no-c++11 -device-option CROSS_COMPILE=/opt/freescale/usr/local/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin/arm-fsl-linux-gnueabi- -sysroot /home/juan/imx53/ltib/rootfs -no-gcc-sysroot -prefix /opt/qt5 日時:i.MX53用のQT5の構築 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 同じエラーが発生し、回避策として、#if GLIB_CHECK_VERSION(2、22、0)マクロの下の行をコメントアウトしました ======== ./src/corelib/kernel/qeventdispatcher_glib.cpp =========== QEventDispatcherGlibPrivate::QEventDispatcherGlibPrivate(GMainContext *context)     : mainContext(context) {     . . .   #if GLIB_CHECK_VERSION (2, 22, 0) g_main_context_push_thread_default (mainContext); エンディフ . . . } QEventDispatcherGlib::~QEventDispatcherGlib() { . . . #if GLIB_CHECK_VERSION (2, 22, 0) g_main_context_pop_thread_default (d->mainContext); #endif . . . } 日時:i.MX53用のQT5の構築 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> コンパイルを開始するためにいくつかのオプションを追加する必要がありました。 -no-xcb -no-c++11 しかし、それでもエラーが発生します、最初のエラー: make [2]:ディレクトリ '/home/user/git/qt5/qtbase/src/network'に入ります /opt/freescale/usr/local/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin/arm-fsl-linux-gnueabi-g++-c -pipe -mfloat-abi=softfp -O2 -O2 -march=armv7-a -mfpu=neon -D_LINUX -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -Wall -W -D_REENTRANT -fPIC -DQT_NO_LIBUDEV -DQT_NO_XCB -DQT_NO_XKBCOMMON -DQT_NO_USING_NAMESPACE -DQT_BUILD_NETWORK_LIB -DQT_BUILDING_QT -DQT_NO_CAST_TO_ASCII -DQT_ASCII_CAST_WARNINGS -DQT_MOC_COMPAT -DQT_USE_QSTRINGBUILDER -DQT_DEPRECATED_WARNINGS -DQT_DISABLE_DEPRECATED_BEFORE=0x050000 -DQT_NO_EXCEPTIONS -D_LARGEFILE64_SOURCE -D_LARGEFILE_ソース-DQT_NO_DEBUG -DQT_CORE_LIB -I../../mkspecs/devices/linux-imx5-g++ -I.-私。。/../include -I../../include/QtNetwork -I../../include/QtNetwork/5.1.0 をご覧ください。-私。。/../include/QtNetwork/5.1.0/QtNetwork-Iカーネル -I../../include/QtCore -I../../include/QtCore/5.1.0-私。。/../include/QtCore/5.1.0/QtCoreの-I.moc/release-shared -I/home/user/ltib/rootfs/usr/include -o .obj/release-shared/qsslsocket_openssl.o ssl/qsslsocket_openssl.cpp ssl / qsslsocket_openssl.cpp:メンバー関数 'virtual void QSslSocketBackendPrivate::continueHandshake()'で: SSL / qsslsocket_openssl.cpp:1414:エラー:このスコープで 'q_SSL_ctrl'が宣言されていません make [2]: *** [.obj/release-shared/qsslsocket_openssl.o]エラー1 make [2]:ディレクトリ '/home/user/git/qt5/qtbase/src/network'を離れます make[1]: *** [sub-network-make_first] エラー 2 make [1]:ディレクトリ '/home/user/git/qt5/qtbase/src'を離れます make: *** [sub-src-make_first] エラー 2 日時:i.MX53用のQT5の構築 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> エラー: hread -lgthread-2.0-lrt -lglib-2.0 .obj/release-shared/qeventdispatcher_glib.o:関数 'QEventDispatcherGlibPrivate::QEventDispatcherGlibPrivate(_GMainContext*)'で: qeventdispatcher_glib.cpp:(.text+0x7f0):'g_main_context_push_thread_default' への未定義の参照 .obj/release-shared/qeventdispatcher_glib.o:関数 'QEventDispatcherGlib::~QEventDispatcherGlib()'で: qeventdispatcher_glib.cpp:(.text+0xbf0):'g_main_context_pop_thread_default' への未定義の参照 .obj/release-shared/qeventdispatcher_glib.o:関数 'QEventDispatcherGlib::~QEventDispatcherGlib()'で: qeventdispatcher_glib.cpp:(.text+0xdd4):'g_main_context_pop_thread_default' への未定義の参照 .obj/release-shared/qeventdispatcher_glib.o:関数 'QEventDispatcherGlib::~QEventDispatcherGlib()'で: qeventdispatcher_glib.cpp:(.text+0xfb0):'g_main_context_pop_thread_default' への未定義の参照 .obj/release-shared/qeventdispatcher_glib.o:関数 'QEventDispatcherGlibPrivate::QEventDispatcherGlibPrivate(_GMainContext*)'で: qeventdispatcher_glib.cpp:(.text+0x1114):'g_main_context_push_thread_default' への未定義の参照 collect2: ld が 1 つの終了ステータスを返しました make[2]: *** [../../lib/libQt5Core.so.5.1.0]エラー 1 make [2]:ディレクトリ '/home/mqy/qt5/qtbase/src/corelib'を離れます 助けが必要ですか? 日時:i.MX53用のQT5の構築 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 申し訳ありませんが、作るとエラーが発生します 日時:i.MX53用のQT5の構築 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> なぜLITBを使ってQT5をビルドしないのですか? 日時:i.MX53用のQT5の構築 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> ファイルを qt-project に戻すことを考えましたか?私はこれらがQt 5で動作することを認識しているので、それらが戻ってくることができれば良いでしょう
View full article
Kinetis KV5x Cortex-M7マイクロコントローラおよびGD3000モータ・プリドライバによるUAV速度制御 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Demo このデモでは、強力なKinetis KV46マイクロコントローラを使用した無人航空機(UAV)が、4つのGD3000ブラシレスDCプリドライバを制御して、プロペラを駆動する4つのモータを回転させます。   特長 KV5x 240MHz ARM Cortex-M7 MCU、高速ADCおよびタイマ搭載、4つのBLDCモーターすべてを制御する GD3000 BDLCモータプリドライバは、低Q MOSFETを駆動する高速スイッチングを特長としています 市場で唯一のシングルMCUソリューション – 部品点数とBOMコストの削減と優れた性能   注目のNXP製品 KV5x|Kinetis KV5xコネクテッド・コントロール・マイクロコントローラ |NXPの 3相ブラシレスモータープリドライバー|NXPの   リンクス Kinetis KV5xマイクロコントローラとGD3000モーター・プリドライバを使用したUAVの速度制御を搭載するクアドロコプターのデモ オートモーティブ インダストリアル
View full article
FreeRTOS_1.199_18.08.2012.PEupd <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> FreeRTOS 描述 FreeRTOS( www.freertos.org )作为组件实现。支持所有 S08和所有 S12(X) 、 ColdFire V1 (CN、JM、QE、JE 和 MM 系列)、 ColdFire V2 (5225x) 和所有 Kinetis (已使用 K40、K60、K70/M4F、 KL20Z Freedom Board进行测试)。 组件 FreeRTOS.PEupd Dependencies 实用程序、 FreeRTOSTrace 、 PercepioTrace 如何使用 FreeRTOS 嵌入式处理器专家组件的教程可以在这里找到:教程:DEMOJM 上的 FreeRTOS 经典(非 Eclipse)用户请注意! 该组件已经通过CodeWarrior for S12(X) V5.1进行了测试,该组件不是基于 eclipse 的。基于 eclipse 的 CodeWarrior(MCU10.x)正在使用 RTOS 适配器的概念。FreeRTOS 组件现在有一个设置可以禁用此功能。您需要将设置“Classic CodeWarrior”设置为“yes” ,以便它在非 eclipse CodeWarrior 环境中工作。否则,您将在代码生成期间看到内部错误。 此外至少需要安装 PE 3.09 Service pack。更新可在http://www.freescale.com/webapp/sps/site/overview.jsp?code=CW_UPDATES_MCU_63上获取,直接链接: CodeWarrior for MCU V6.3 Processor Expert V3.09 更新 许可 许可证:开源(LGPL) FreeRTOS (c) 版权所有 2003-2012 Richard Barry,http: www.FreeRTOS.org FreeRTOS 处理器专家组件:(c) 版权所有 Erich Styger,2012 Processor Expert 和 CodeWarrior (c) 版权所有 Freescale Semiconductor,2012,保留所有权利 这是一个免费软件,根据以下条款的许可政策开放用于教育、研究和商业开发: * 这是一个免费软件,没有任何担保。 * 没有使用限制。您可以自行承担责任,将其用于个人、非营利或商业产品。 * 重新分发源代码必须保留上述版权声明。 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> FreeRTOS 描述 FreeRTOS( www.freertos.org )作为组件实现。支持所有 S08和所有 S12(X) 、 ColdFire V1 (CN、JM、QE、JE 和 MM 系列)、 ColdFire V2 (5225x) 和所有 Kinetis (已使用 K40、K60、K70/M4F、 KL20Z Freedom Board进行测试)。 组件 FreeRTOS.PEupd Dependencies 实用程序、 FreeRTOSTrace 、 PercepioTrace 如何使用 FreeRTOS 嵌入式处理器专家组件的教程可以在这里找到:教程:DEMOJM 上的 FreeRTOS 经典(非 Eclipse)用户请注意! 该组件已经通过CodeWarrior for S12(X) V5.1进行了测试,该组件不是基于 eclipse 的。基于 eclipse 的 CodeWarrior(MCU10.x)正在使用 RTOS 适配器的概念。FreeRTOS 组件现在有一个设置可以禁用此功能。您需要将设置“Classic CodeWarrior”设置为“yes” ,以便它在非 eclipse CodeWarrior 环境中工作。否则,您将在代码生成期间看到内部错误。 此外至少需要安装 PE 3.09 Service pack。更新可在http://www.freescale.com/webapp/sps/site/overview.jsp?code=CW_UPDATES_MCU_63上获取,直接链接: CodeWarrior for MCU V6.3 Processor Expert V3.09 更新 许可 许可证:开源(LGPL) FreeRTOS (c) 版权所有 2003-2012 Richard Barry,http: www.FreeRTOS.org FreeRTOS 处理器专家组件:(c) 版权所有 Erich Styger,2012 Processor Expert 和 CodeWarrior (c) 版权所有 Freescale Semiconductor,2012,保留所有权利 这是一个免费软件,根据以下条款的许可政策开放用于教育、研究和商业开发: * 这是一个免费软件,没有任何担保。 * 没有使用限制。您可以自行承担责任,将其用于个人、非营利或商业产品。 * 重新分发源代码必须保留上述版权声明。 组件交换
View full article
使用MMPF0100和MMPF0200 PMIC进行电源管理 - 演示 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 观看此演示,了解如何使用恩智浦 MMPF0100 和 MMPF0200 轻松进行设计。 这些器件 针对 i.MX 6 应用处理器进行了优化。功耗敏感型应用包括便携式医疗设备、网关、路由器、家庭安全系统、电子阅读器、平板电脑和家庭能源管理解决 方案 。   特征 MMPF0100 和 MMPF0200 (PMIC) 评估套件 PMIC 针对i.MX 6 应用处理器进行了优化 轻载效率 卓越的静态电流 板载大量一次性可编程内存 灵活性:编程套件通过 USB 端口连接设备,用户可以设置设备上每个调节器的启动频率、电压水平、电流限制和时序 特色恩智浦产品 MMPF0100 MMPF0200 https://community.nxp.com/external-link.jspa?url=http %3A% 2F %2Fwww.nxp.com% 2Fproducts %2Fpower-management% 2Fpmics %2Fpmics-for-i.mx-processors% 2F12通道可配置电源管理IC%3AMMPF0200 框图 汽车电子 工业控制
View full article
LS102xA での QSPI からのブート <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> LS1021xAシリーズ製品がQSPIフラッシュブートのサポートを開始しました。 ただし、QSPI フラッシュからの起動は、SPI フラッシュからの起動と同じではありません。 QSPIブートは、NORフラッシュブートと同様にXIP(Execute in place)方式を使用します。 QSPI フラッシュに割り当てられたメモリ マップ開始アドレスは 0x4000000 です。 コードを適切な場所に配置する必要があります。 また、QSPIコントローラとARM AMBA AXIバス間のデータエンディアン形式にも注意が必要です。 QSPI フラッシュに書き込まれたバイナリ ファイルは、最初にバイトスワップ プロセスで実行する必要があります。 Ls1021xA Bspでは、この機能を「byte_swap.tcl」というTclスクリプトファイルで提供しています。 以下のコマンドに従って、このプロセスを完了します。 tclsh ./byte_swap.tcl ./ .bin ./ .bin 8 次に、SD / MMCメディアからシステムを起動します。 次のコマンドで、イメージファイルをQSPIフラッシュに書き込みます。 =>TFTP の0x81000000 rcw_qspiboot_swap.bin (このバイナリ ファイルに PBI コマンドが含まれていることを測定します: 0xee0200、0x40010000 これは、u-boot address の回避策です) => SF プローブ => SF 消去 0 0x10000 => sf write 0x81000000 0 0x100 => tftp 0x82000000 u-boot-qspiboot_swap.bin => SF 消去0x10000 0x90000 => SF 書き込み0x82000000 0x10000 0x80000 Re: LS102xA での QSPI からの起動 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> はい、RCWバイナリファイルはTシリーズ、LSシリーズ、およびPシリーズQorIQ製品の一部に必要です。 当社のSDKは、コードビルドプロセス後にRCWデータをU-bootバイナリファイルに自動的に挿入するのに役立ちます。 ただし、LS SDKはまだすべての機能を完了していません。 Re: LS102xA での QSPI からの起動 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> ありがとう、ミンチェ、 RCW バイナリ ファイルは、 LS1021A ボードをどのように起動しても常に必要ですか? これらの設定は、imx6のようにu-bootにすでに含まれていますか? Re: 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バイナリファイルを生成できます。 そのファイルはボードを起動するために必要ですか? はい、これはプリブートローダーコードであり、慎重に変更する必要があります。 Re: LS102xA での QSPI からの起動 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi, 私はQSPIフラッシュからカスタマイズされたLS1021Aボードの起動に取り組んでいますが、1つの質問があります。 ファイル rcw_qspiboot_swap.binとは何ですか? u-bootをコンパイルしている間、u-boot.binしか取得できません。 そのファイルはボードを起動するために必要ですか? ありがとうございます
View full article
NXP 提供的 S32K3 EB tresos AutoCore 8.8.9 无法使用 NXP 提供的 S32K3 EB tresos AutoCore 8.8.9 无法使用, 没有有效的许可证 luhaiou_0-1735870376685.jpeg 以后是不是就不再有这个功能了? 回复:NXP 提供的 S32K3 EB tresos AutoCore 8.8.9 无法使用 Hello, 我刚刚得到消息,SW 帐户中已经有新的激活码可用。 请随意下载有效代码。 享受。 顺祝商祺! Peter 回复:NXP 提供的 S32K3 EB tresos AutoCore 8.8.9 无法使用 Hello, 我正在与管理员交谈,这些激活码存在问题。目前我们还没有。 一旦可用,它们就会出现在 SW 帐户页面上。 顺祝商祺! Peter 回复:NXP 提供的 S32K3 EB tresos AutoCore 8.8.9 无法使用 Hello,@petervlna 新的许可证未出现。 请通知管理员, 非常感谢。 回复:NXP 提供的 S32K3 EB tresos AutoCore 8.8.9 无法使用 Hello, 我和你看到的一样。 然而,由于是新年,一切都需要一些时间才能恢复,我预计它会出现几天。 如果下周结束时仍未收到,请告诉我,我会通知管理员。 顺祝商祺! Peter
View full article
relayr 的 WunderBar <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> WunderBar 是创建创新且实用的应用程序来连接智能设备的最简单方法。 它开箱即用,包含 6 个很棒的 Beacon(BLE)、传感器和 Wifi,并且编程非常简单。传感器包括:光、颜色、距离、温度、湿度、遥控器(红外)、加速度计和陀螺仪、 Grove 连接器以及社区选择的噪音/声音传感器! 开源 我们希望每个人都参与其中,这就是我们在GitHub上分享布局的原因。如果您有改进 - 请分叉我们,做出更改,然后发送拉取请求。如果您需要构建自己的主板以与现有系统集成,请成为我们的客人。自由的 Apache 许可证使这成为可能。 安全 国内网络上低能耗设备的安全性是一个挑战。我们正在与合作伙伴合作,为设备构建最高级别的安全性。我们的设备注册利用您的智能手机或平板电脑的安全性来与 OpenSensor Cloud 建立永久连接 灵活 WunderBar 附带我们自己的固件,可以与 OpenSensor Cloud 无缝集成,但是您可以使用 Arduino,或者推出您自己的解决方案。我们有适用于 Arduino 的库以及用于构建您自己的解决方案的示例。 详细了解 WunderBar by relayr 认为这是一个很酷的项目吗?在下面进行排名并留下您的评论! 概述
View full article
S32K与57xx之间的性能比较 Hello, 我对 55xx、56xx 和 57xx MCU 有一些经验,现在正在考虑将来迁移到 S32。由于性能是一个潜在的问题,我想知道S32K(例如与 264MHz MPC5674F 或 300MHz MPC5777C 相比,配备 240MHz Cortex-M7 的 S32K348 的性能更佳。 根据 EEMBC 网站,MPC5674F(@264MHz)的 Coremark 得分为 516,而 S32Kxx 系列的数据表为 S32K348 提供了 1269 的 Coremark 得分,这意味着性能将获得巨大的提升(将应用程序的执行时间减半?)尽管核心频率略低……然而,我曾经尝试过一些以 400MHz 运行的基于 Arm 的设备,对于我的应用程序(没有长循环的虚拟控制系统,主要由布尔和浮点逻辑组成)来说,它的性能几乎没有超过以 264MHz 运行的 MPC5777C。 您对 56xx/57xx 和 S32K3xx 有任何性能比较吗(Coremark 分数除外)?根据 Coremark 分数显示,S32K348 的性能是否有望超越 MPC5777C? 谢谢! 顺祝商祺! Ricardo 回复:S32K和57xx之间的性能比较 QuadSPI 只是 IP 的名称,但它也允许连接八路 SPI,正如我已经回答的那样。因此数据可以超过 8 行。 FlexIO 提供 8 个定时器/移位器,因此速度可能不会更快。 回复:S32K和57xx之间的性能比较 在哪里可以找到有关 FlexIO 的更多信息?即使它不模拟 EBI,如果它的数据路径比 QSPI 中可用的 4 位更宽(看起来比 EBI 慢得多,并且可能会抵消 CPU 中获得的所有收益),我们也可能会尝试使用它。 谢谢! Ricardo 回复:S32K和57xx之间的性能比较 FlexIO 是通用定时模块,提供 UART、SPI、I2C、I2S、LIN、PWM 等功能,但我认为该外设无法模拟 EBI。至少我不知道有任何现有的解决方案。 QuadSPI模块被认为是外部总线的替代品。它允许用户通过 QuadSPI、OctalSPI 或 Hyperbus 通信协议连接外部存储设备并进行内存映射访问。 回复:S32K和57xx之间的性能比较 Hi David, 谢谢你的回答。为了完成我的性能比较,我想知道在较新的设备中,FlexIO 是否可以被视为 5xxx 设备中的 EBI 模块的替代品。 此致, Ricardo 回复:S32K和57xx之间的性能比较 e200z759 的性能约为 2.27 DMips/MHz,即在 264MHz 的运行频率下每个核心可提供 600 DMIPS。不过MPC设备大多没有指定官方数字。 另一方面,S32K3 在数据表中有很好的定义,如下所示,分别针对 ASIL-B 或 D(即无论这些是核心同步的变体还是分离的变体)。 davidtosenovjan_0-1714993420191.png davidtosenovjan_1-1714993559969.png
View full article
MCTPTX1AK324 + CAN-FD 500/5000 Hi, 我目前正在使用两种不同的开发板: S32K312EVB-Q172 和 MCTPTX1AK324 我正在尝试与 CAN-FD 500/5000 kbps 的人进行通信。 为了计算位时序,我使用 CAN 位时序计算 v2.1.xlsm由 NXP 提供。 对于 CAN Clk 60MHz 的 S32K312 和 TJA1043TKY,一切运行正常。 但是在另一块板上,当我尝试将 FD 速率设置为高于 4mbps 时,使用 CAN Clk 80MHz 的 S32K324 和 TJA1044GT 的 S32K324 时总是会出现总线错误。 TJA1044 预计工作速度可达 5mbps。那里可能存在什么问题?我正在使用一根短(30 厘米)非绞合电缆来连接 IXXAT USB-to-CAN FD 紧凑型产品和额外的 120 欧姆电阻。 500/4000、1000/4000 工作正常,但只要我增加到 500/5000 或 1000/5000 FD 帧就会导致错误。 这是我尝试过的位时序计算的一个例子(我想我测试了所有可能的配置) 2025-03-03_13-33-29.PNG 您有什么建议吗? 谢谢,并致以最诚挚的问候, 格罗尔 回复:MCTPTX1AK324 + CAN-FD 500/5000 Hi Petr, 我找到了 TDC 设置(我之前一定是瞎了……): 2025-03-07_09-25-17.PNG 启用此功能并根据计算器进行设置后,它可以正常工作。 谢谢您的支持! 顺祝商祺! 格罗尔 回复:MCTPTX1AK324 + CAN-FD 500/5000 Hi, 您编写的从 IXXAT 发送的消息被控制器正确读取,但寄存器在接收期间显示错误,并且 IXXAT 在传输期间显示检测到的错误。可能是 CAN 位时序问题。还要确保两者都使用了 ISO CANFD 协议。 对于 MCU 端的传输,必须通过正确的 TDCOFF 设置来启用 TDC。 对于 EB 不确定,但在 S32DS CT 中,可以在 FdBaudrateConfig 设置中使用   image.png BR, Petr 回复:MCTPTX1AK324 + CAN-FD 500/5000 我忘了说:IXXAT 发送的消息被控制器正确读取 回复:MCTPTX1AK324 + CAN-FD 500/5000 Hi @PetrS, 感谢您的快速回复。 您是否确实使用了如图所示的增强型 CAN FD 时序和寄存器? 是的,但我也尝试了正常模式设置,结果相同(最高可达 4mbps)。 你也设置了TDC吗?在调试器中检查设置。 根据调试器,TDC 已被禁用。 2025-03-04_15-15-34.PNG 这是一个 AUTOSAR 项目(SW。版本:4.0.0P14_HF01_D2406),FlexCan 在 Tresos 中配置,TDC 可以在那里配置吗? 在S32K324上检测到什么错误?检查ECR、ESR1寄存器。 这是调试器中 FlexCAN 的顶部,显示了一些错误: 2025-03-04_15-18-56.PNG 另一端的 IXXAT(没有其他节点)报告以下内容: 2025-03-04_15-19-18.PNG 并配置相同的采样点: 2025-03-04_15-19-32.PNG 建议使用示波器测量 TXD/RXD/CAN 线路以查看真实信号。 我现在没有可用的范围,但可能可以在下周左右组织一个。 在此之前我还能尝试什么其他想法吗? 谢谢! 顺祝商祺! 格罗尔 回复:MCTPTX1AK324 + CAN-FD 500/5000 Hi, 所有连接的节点都应使用相同的比特率和采样时间,因此请确保这一点。 您是否确实使用了如图所示的增强型 CAN FD 时序和寄存器?您也设置了 TDC 吗?检查调试器中的设置。在S32K324上检测到什么错误?检查ECR、ESR1寄存器。建议使用示波器测量 TXD/RXD/CAN 线路以查看真实信号。 BR, Petr
View full article
基于CTimer模块测试运行时间 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 基于CTimer模块测试运行时间   有时,需要测试某个api函数执行时所花费的时间,例如,有些用户想测试flash擦除时间和flash编程时间。用户可以使用GPIO来设置/清除,并使用示波器来测试GPIO时序来测量api函数所花费的时间,该方法非常简单直接但不准确。 文档介绍如何将 CTimer 配置为一个 32 位自由运行计数器,用户可以读取 api 函数前后的计数器值,并计算计数器值差以获取 api 函数所花费的时间。 LPC54xxx系列的CTimer对APB总线时钟进行计数,APB总线时钟由12MHz FRO驱动,用户可以使用以下代码来测量经过的时间。 例如测试delayTimer(10000);函数的耗时,得到变量tPoint1,tPoint2,实际耗时为(tPoint2- tPoint1)*(1/12000000)。 例子中tPoint2=110127,tPoint1=53,则经过的时间为(110127-53)*(1/12000000)=9.172us。 //源代码主要关注LPC54xxx系列 uint32_t tPoint1、tPoint2、tPoint3、tDiff; void test(void) { tPoint1 = CTIMER_GetTimerCountValue(CTIMER2);    //模拟经过的时间 延迟计时器(10000); tPoint2 = CTIMER_GetTimerCountValue(CTIMER2); tDiff=tPoint2-tPoint1;      //模拟经过的时间 延迟计时器(20000); tPoint3 = CTIMER_GetTimerCountValue(CTIMER2); tDiff=tPoint3-tPoint2; PRINTF( "时间实例:tPoint1=%d,tPoint2=%d,tPoint3=%d \r\n" ,tPoint1,tPoint2,tPoint3); } 基于 MCUXpresso 工具和 LPC54618 开发板的简单源代码片段,由 XiangJun Rong 开发 #包括“fsl_ctimer.h” void test(void); void CTimerInit(void); void delayTimer(uint32_t elapsedTimer); uint32_t tPoint1、tPoint2、tPoint3、tDiff; void CTimerInit(void) {     ctimer_config_t config;    ctimer_match_config_t 匹配配置;    /*CTimer使用APB总线时钟作为Timer tick,设置APB总线时钟为12MHz内部FRO */      CLOCK_AttachClk(kFRO12M_to_ASYNC_APB);     CTIMER_GetDefaultConfig(&config);       CTIMER_Init(CTIMER2, &config);   matchConfig.enableCounterReset = true; matchConfig.enableCounterStop = false; matchConfig.matchValue = 0xFFFFFFFF; matchConfig.outControl = kCTIMER_Output_NoAction; matchConfig.outPinInitState = true; matchConfig.enableInterrupt = false;     CTIMER_SetupMatch(CTIMER2, kCTIMER_Match_3, &matchConfig); CTIMER_StartTimer(CTIMER2); }   void test(void) { tPoint1 = CTIMER_GetTimerCountValue(CTIMER2);    //模拟经过的时间 延迟计时器(10000); tPoint2 = CTIMER_GetTimerCountValue(CTIMER2); tDiff=tPoint2-tPoint1;      //模拟经过的时间 延迟计时器(20000); tPoint3 = CTIMER_GetTimerCountValue(CTIMER2); tDiff=tPoint3-tPoint2; PRINTF( "时间实例:tPoint1=%d,tPoint2=%d,tPoint3=%d \r\n" ,tPoint1,tPoint2,tPoint3); }   void delayTimer(uint32_t elapsedTimer) {     uint32_t i;     for(i=0; i     {        __asm ( “ nop ” );     } }   int main (无效) {    …………………………………………………………………………………………………..    PRINTF( "经过时间测试开始:\r\n" );     CTimerInit();     test();     for(;;) {} ………………………………………… }  
View full article