Multi Source Translation Content

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

Multi Source Translation Content

讨论

排序依据:
KDSを使用したS08からKinetis Eマイクロコントローラへの移行。 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> コミュニティの皆さん、こんにちは。   このドキュメントは、通常、CodeWarrior IDEを使用して8ビット・マイクロコントローラ・デバイスを使用し、Kinetisおよび対応するIDEであるKinetis Design Studio(KDS)などの最新テクノロジへの移行を計画しているユーザーを対象としています。   このドキュメントでは、主に KDS を使用して新しいプロジェクトを作成する方法、機能の違い、および移行プロセスに関連する主なソフトウェアに関する考慮事項について説明します。 KE06のサンプルコードが添付されています。   この資料がお役に立てば幸いです。 全般
查看全文
EUF-ACC-T1574 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 飞思卡尔利用 Kinetis MCU 简化了汽车开发。Kinetis EA 系列汽车级 MCU 具有简单的工具、广泛的开发环境和 -40 至 125°C 温度范围内的汽车级认证,可快速将产品推向市场。飞思卡尔汽车产品组合概述(S32、S12、MagniV、Kinetis EA)和生态系统。 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 飞思卡尔利用 Kinetis MCU 简化了汽车开发。Kinetis EA 系列汽车级 MCU 具有简单的工具、广泛的开发环境和 -40 至 125°C 温度范围内的汽车级认证,可快速将产品推向市场。飞思卡尔汽车产品组合概述(S32、S12、MagniV、Kinetis EA)和生态系统。
查看全文
KDS と KSDK を使用して RTCS をプロセッサ エキスパート プロジェクトに追加する方法 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> こんにちはコミュニティ、 「 方法: Kinetis Design Studio IDEのProcessor Expertを使用してMQX RTOS for KSDKプロジェクトを作成する 」 では、添付 のドキュメントで、KSDK1.2およびProcessor Expertを使用してKDS3.0プロジェクトにRTCSをインクルードする手順と、最終プロジェクトについて記載しています。 このプロセスの最初のドラフトを提供してくださった RBORBに感謝します。 MQX を使用した新規 KSDK プロジェクトの作成方法と Processor Expert を使用しない場合については、次のドキュメントを参照してください。 方法 : KDS で新しい MQX RTOS for KSDK プロジェクトを作成する KSDKを使い始めるための簡単なドキュメントをお探しの場合は、次のドキュメントを参照してください。 初めてのKSDK1.2を書くKDS3.0 でのアプリケーション - Hello World と GPIO 割り込み付きトグル LED よろしくお願いします。 カルロス Re: KDS と KSDK を使用して RTCS をプロセッサエキスパートプロジェクトに追加する方法 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 私は、この素晴らしいチュートリアルに従って、MK66FX1M0VLQ18ベースのカスタムハードウェアでプロジェクトを開始しました。 すべての KSDK ファームウェア パッケージ (HAL ライブラリ、DRV ドライバ、ミドルウェア) は、評価ターゲット FRDM-xxx および TWR-xxx で提供されている例と適切に統合されています。しかし、(私がCodeWarrior 10.1やMQX 3.7を使用してKinetisのCPUを使い始めたときのように)評価ボードとは異なるターゲット上で動作するKinetisのサンプルプロジェクトを移植するのは非常に困難です。また、ユーザーの場所にあるKSDKフォルダツリーから独自のKinetisプロジェクトをエクスポートするのも困難です。 MQX 4.0にはBSPCloningWizardツールが付属しており、これは私が常にカスタムハードウェアで新しいプロジェクトを開始したいと思っていたものでした。残念ながら、KSDKにはそのようなツールはまだありません。 ですから、今日からKDS 3.0.0を使用した新しいKinetisプロジェクトが始まると思います+ PEx + KSDK 1.3.0は、カスタムハードウェアに最適な方法です。Processor Expertは、アプリケーションに必要なHAL、ドライバー、MQX RTOSのすべてのコードを生成します。また、プロジェクトは KSDK フォルダー ツリーへのリンクのないカスタム フォルダーに作成されます。いいですね! プロジェクトで TCP/IP スタックやファイル システムを処理する必要がある場合は、このチュートリアルを使用して RTCS ライブラリや MFS ライブラリをプロジェクトに追加できます。残念ながら、カスタムハードウェアにRTCSおよびMFSプロジェクトを移植してビルドする方法は? もしかしたら、エーリッヒ・スティガーが助けてくれるかもしれない...。 私は彼がKDS + PEx + KSDKでプロジェクトを作成し、プロジェクトにlwIPソースフォルダを追加し、コンパイラ設定へのインクルードパスを調整する http://mcuoneclipse.com/2015/10/28/tutorial-lwip-with-the-freertos-and-the-freescale-frdm-k64f-board/ で彼のチュートリアルを見つけました。 RTCS と MFS のソース フォルダをプロジェクトに追加することは、RTCS と MFS ライブラリの移植とカスタム ハードウェアでのビルドを克服する正しい方法ですか? Re: KDS と KSDK を使用して RTCS をプロセッサエキスパートプロジェクトに追加する方法 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 例で説明されているように、私はFRDM-K64Fボードを持っているので、これは私にとってはうまくいきました。しかし、私がはっきりしていないのは、このプロセスを別のターゲットボードにどのように移行するかです。FRDM-K64F、TWR-K60D100M、TWR-K64F120M、TWR-K65F180M (インポートするパスを持つ 4 つのターゲット) を持っていない場合はどうすればよいでしょうか。私の 本当の ターゲットは、MK64FN1M0VLQ12を使用して、FRDM-K64F に似ています が、確かに一致しません。 では、PowerPoint ファイルの指示に従ってから、RTCS プロジェクトを別のハードウェア ターゲットに設定するにはどうすればよいでしょうか。 ありがとうございます! Re: KDS と KSDK を使用して RTCS をプロセッサエキスパートプロジェクトに追加する方法 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> とても良い例です! 非常に便利です - 10倍。 私は時々奇妙な現象を観察します。 ETH PHY LED は、ETH ケーブルが切断されている場合でもリンク (緑色の LED) を示します。 ETEがパケットを配信するのを避けてください。 これは、デバッガー したがって、PHY init が原因ではないかと推測しています。 どうしたらいいですか? Re: KDS と KSDK を使用して RTCS をプロセッサエキスパートプロジェクトに追加する方法 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> こんにちはロジャー、 ここでは、現在のMQX-KSDKおよびPExプロジェクトにMFSおよびシェルのサポートを追加するために必要な手順を確認できます。新しい MQX RTOS for KSDK および PEx プロジェクトに MFS とシェルのサポートを追加する方法 これがお役に立てば幸いです。 よろしくお願いいたします。 アイザック Re: KDS と KSDK を使用して RTCS をプロセッサエキスパートプロジェクトに追加する方法 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> こんにちはロジャー、 私はそうしましたが、キューには他にも多くのプロジェクトがあり、このドキュメントをいつ作成できるかを定義することはできません。 ご不便をおかけして申し訳ございません。 カルロス Re: KDS と KSDK を使用して RTCS をプロセッサエキスパートプロジェクトに追加する方法 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> こんにちはカルロス チームと話す機会はありましたか? 敬具 了解 Re: KDS と KSDK を使用して RTCS をプロセッサエキスパートプロジェクトに追加する方法 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> ありがとうロジャー、 いいですね、私はそれについて私のチームと話します。 よろしくお願いします。 カルロス Re: KDS と KSDK を使用して RTCS をプロセッサエキスパートプロジェクトに追加する方法 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> こんにちはカルロス ガイドはとても役に立ちました。 SDCARDでMFSを追加するためにも1つあるといいですか? 敬具 了解 Re: KDS と KSDK を使用して RTCS をプロセッサエキスパートプロジェクトに追加する方法 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> こんにちはロジャー、 最初にRTCSライブラリをビルドする必要があります。FRDM-K64の場合、ここで見つけることができます。 C:\Freescale\KSDK_1.2.0\middleware\tcpip\rtcs\build\kds\rtcs_frdmk64f ガイドでこの要件について言及するのを忘れていました。更新いたします。 よろしくお願いします。 カルロス
查看全文
Freescale Citrix Demo on i.MX6Q ubuntu If you cannot access the www.youtube.com, you may watch the citrix demo in Youku, the link as fellow: Citrix Receiver for Linux is a software client to access the desktops, applications, and data easily and securely from many types of Linux devices. About Installing Citrix Receiver,please go to Citrix website Receiver The i.MX 6DQ processor incorporates the hardware accelerators Video Processing Unit(VPU) and 3D/2D Graphics Processing Unit. By taking the advantage of i.MX 6DQ hardware accelerators, Freescale integrates H264 hardware decoder to Citrix Receiver for Linux on i.MX6DQ Ubuntu. With accelerated hardware decoding, the computing is offloaded and better performance is achieved. Configuration in the demo: Hardware i.MX6Q: i.MX 6Quad Processors: Quad Core, ARM® Cortex®-A9 Core 1920x1080 HDMI panel Software: Linux kernel 3.0.35 Ubuntu 12.04 hardfloat rootfs Citrix Receiver13.1 with Freescale H264 plug-in
查看全文
S32K1xx Lpuart IDLE detected with DMA transfer What is S32K1‘s IDLE feature: IDLE is set when the LPUART receive line becomes idle for a full character time after a period of activity.When CTRL[ILT] is cleared, the receiver starts counting idle bit times after the start bit. Why write this demo? Because the RTM driver does not support Lpuart's IDLE detect. What needs to be modified? -1.add "UART_EVENT_DMA_IDLE = 0x04U" to “callbacks.h” -2 add "LPUART_DRV_RxIdleCallback" to ".lpuart_driver.c"   -3 Define “LPUART_DRV_RxIdleCallback” function   static void LPUART_DRV_RxIdleCallback(uint32_t instance) { DEV_ASSERT(instance < LPUART_INSTANCE_COUNT); LPUART_Type *base = s_lpuartBase[instance]; lpuart_state_t * lpuartState = (lpuart_state_t *)s_lpuartStatePtr[instance]; LPUART_ClearStatusFlag(base,LPUART_IDLE_LINE_DETECT); if(lpuartState->transferType == LPUART_USING_DMA) { lpuartState->rxSize = EDMA_DRV_GetRemainingMajorIterationsCount(lpuartState->rxDMAChannel); LPUART_DRV_StopRxDma(instance); lpuartState->rxCallback(lpuartState,UART_EVENT_DMA_IDLE,NULL);/*UART_EVENT_DMA_IDLE : 0x04*/ } }   -4 add below code to "LPUART_DRV_IRQHandler" and be sure these code must  be put before "LPUART_DRV_ErrIrqHandler(instance)" /* Handle idle line interrupt */ if (LPUART_GetIntMode(base, LPUART_INT_IDLE_LINE)) { if (LPUART_GetStatusFlag(base, LPUART_IDLE_LINE_DETECT)) { LPUART_DRV_RxIdleCallback(instance); } } -5 configure IDLE releated register in main function. LPUART1->CTRL |= LPUART_CTRL_ILT(1); LPUART1->CTRL |= LPUART_CTRL_IDLECFG(7); LPUART1->CTRL |= LPUART_CTRL_ILIE(1); Test environment: Hardware is base on S32K144EVB-Q100 Software is S32 Design Studio for Arm V 2.2 + RTM 3.0.X Demo Description:           The baud rate of the serial port is set to 19200, and the function implemented is to send back the received data using DMA methods .
查看全文
Boot from emmc mmc0 In the i.MX8MP support 3 SDIO interface, and in the reference board i.MX 8M Plus LPDDR4 EVK design default use the eMMC connect to the USDHC3 to boot up from emmc,use the SD card connect to the USDHC2 port. When the U-Boot starts, it will detect the starting slot and automatically set mmcdev and mmcroot, for the USDHC3 in the default Linux set is mmc dev 2. But some customer need to change to the mmc dev 0, make the mmc0 work, see the following introduction. 1 For the EMMC         MMC (multiMedia card) is a communication protocol that supports two modes, SPI and MMC. EMMC is a chip that supports MMC protocol. Both eMMC and SD card package the flash controller and NAND Flash together, but their interfaces are different. eMMC is generally BGA packaged and soldered on PCB. EMMC includes 11 signals, namely CLK, CMD, DATA0-7 and Data Strobe. The specific signals are as follows: CLK: It is used to output clock signal from the host side, synchronize data transmission and drive device operation. Each cycle can be transmitted on the rising or falling edge, or both CMD: The signal is mainly used by the host to send a command to the eMMC and the eMMC to send a response to the host. DAT0-7: DAT0-7 signal is mainly used for data transmission between Host and eMMC. After the eMMC is powered on or soft reset, only DAT0 can transmit data. After initialization, DAT0-3 or DAT0-7 can be configured for data transmission, that is, the data bus can be configured as 4 bits or 8 bits. Data Strobe: The clock signal is sent to the host by eMMC with the same frequency as the CLK signal. It is used for synchronization of data reception at the host side. The Data Strobe signal can only be configured and enabled in the HS400 mode. After being enabled, the stability of data transmission can be improved and the bus tuning process can be omitted. 2 For the EMMC design on the i.MX8MP LPDDR4 EVK 2.1 The i.MX8MP The i.MX8MP there is 3 SDIO interface,and the i.MX8MP has 3 USDHC ports:USDHC1, USDHC2 and USDHC3. At i MX8MP supports SD/MMC/eSD/eMMC/SDXC, and starts and boots using the USDHC port based on setting of the BOOT_MODE[3:0] pins. In the reference design, eMMC is connected to USDHC3, and SD card is connected to USDHC2. USDHC3 is used as the eMMC boot device by default on the development board. We can see the detailed definitions of the three USDHC interfaces in the reference manual. Among them, USDHC1 and USDHC3 are 8 bits and support 8-bit data, while USDHC2 only supports 4-bit data. 2.2 Hardware and software design The hardware design is as shown above. The eMMC is connected to the SD3 interface, and the software is configured in this way by default. 2.3 The port number of the default BSP In the i.MX 8M Plus LPDDR4 EVK development board design, the eMMC is connected to the USDHC3 as the default boot device When the U-Boot starts, it will detect the starting slot, and automatically set mmcdev and mmcroot. For USDHC3, the default is mmc dev 2. The device structure of SD/MMC cards is similar. MMC should be the predecessor of SD, but the design of MMC at that time was half that of SD. Therefore, the SD/MMC driver is universal, and the device node of Linux continues the name of MMC. Meaning of blk: blk is a block device, and the number after ⾯ is the serial number of the device Meaning of p: p indicates partition, and p1 is the first partition We can see the correspondence between the USDHC interface and the mmc under Linux. The kernel MMC module now uses a fixed mmcblk index for the uSDHC slot. The default BSP is "mmc2=&usdhc3": In the design of the MX 8M Plus LPDDR4 EVK development board, by default, the eMMC is connected to the USDHC3, SD3 is used, and mmcblk2 is used in the SD3 slot. When setting the kernel parameters in the u-boot, you can see that: ### select mmc dev 2 (USDHC3) on the i.MX 8M Mini EVK, i.MX 8M Nano EVK, and i.MX 8M Plus EVK: U-Boot > mmc dev 2 0 For the emmc the related port is :mmcblk2 By default, the flash target is MMC: 2 after the Demo images burning of the development board is started. 3 mmc0 work as emmc device and boot up We need to modify the device, u-boot, kernel related part for the mmc0 work on the android BSP, 3.1 Software modify 2.2.1 u-boot: Dts section root/arch/arm/dts/imx8mp-evk.dts: memory@40000000 {                  device_type = "memory";                  reg = <0x0 0x40000000 0 0xc0000000>,                        <0x1 0x00000000 0 0xc0000000>;         }; aliases { /* SD/MMC: eMMC/SD slot numbering fix */        mmc0 = &usdhc3; /*Modify the usdhc3 and mmc0, default is mmc2*/        mmc1 = &usdhc2; /* usdhc2 and mmc0 do not change*/        mmc2 = &usdhc1; /*Modify the usdhc1 to mmc2, make the usdhc1 work*/         }; reg_can1_stby: regulator-can1-stby {…..} Board secton: root/board/freescale/imx8mp_evk/imx8mp_evk.c int board_init(void) {         struct arm_smccc_res res; } int board_mmc_get_env_dev(int devno) {        if(devno == 0)         return devno + 2;           else if (devno == 2)         return devno - 2;           else         return devno; }   int mmc_map_to_kernel_blk(int devno) {         return devno; } int board_late_init(void) {         board_late_mmc_env_init(); } SPL: root/common/spl/spl_mmc.c int spl_mmc_load_image(struct spl_image_info *spl_image,                         struct spl_boot_device *bootdev) {…..} Default settings: 2.2.2 kernel section: In the kernel section need to change all the related mmcblk2 to mmcblk0.                   2.2.3 device section modify: Change all the related mmcblk2 to mmcblk0. Change the uuu_imx_android_flash.bat /android_build/device/nxp/common/tools/fastboot_imx_flashall.bat if not [%soc_name:imx8mp=%] == [%soc_name%] (  set vid=0x1fc9& set pid=00x0146& set chip=MX8MP  set uboot_env_start=0x2000& set uboot_env_len=0x8  - set emmc_num=2& set sd_num=1 + set emmc_num=0& set sd_num=1  set board=evk  goto :device_info_end All the modify see the Patch in the attachment. i.MX 8M | i.MX 8M Mini | i.MX 8M Nano
查看全文
Thermal Data required for SE050E2HQ1/Z01Z3Z Hello Team,  I am looking for the thermal resistance data and operating junction temperature information for the part number:  SE050E2HQ1/Z01Z3Z Thanks and Regards Harsh Smart Cards Re: Thermal Data required for SE050E2HQ1/Z01Z3Z Hi @Harsh_Bhavsar , You may refer to https://www.nxp.com/docs/en/data-sheet/SE051.pdf for details. They are almost the same. Sincerely, Kan Re: Thermal Data required for SE050E2HQ1/Z01Z3Z Hello Kan_Li, Thank you for the response, the datasheet is very helpful. can you help me to get the maximum allowable junction temperature for the same OR can i consider the operating for it. Thanks and Regards Harsh Re: Thermal Data required for SE050E2HQ1/Z01Z3Z Hello kan, That is really helpful information. thanks and regards Harsh Re: Thermal Data required for SE050E2HQ1/Z01Z3Z Hi @Harsh_Bhavsar , The maximum junction temp for operation is only slightly higher than operation, as internal temp sensors start to trigger around 110°C .  Have a great day, Kan ------------------------------------------------------------------------------- Note: - If this post answers your question, please click the "Mark Correct" button. Thank you! - We are following threads for 7 weeks after the last post, later replies are ignored Please open a new thread and refer to the closed one, if you have a related question at a later point in time. -------------------------------------------------------------------------------
查看全文
Custom S32G399A board: No frames cross switch-facing RGMII bus in either direction Board: Custom S32G399A based module, derived from S32G-VNP-RDB3. PFE_MAC1 connected via RGMII (PE_02–PE_13) to an NXP SJA1110A switch port 2, configured as the DSA CPU port (in-tree sja1105 driver, kernel 6.x BSP43.0). Topology: - PFE_MAC0: SGMII via SerDes1 lane1, Mode 1 - PFE_MAC1: RGMII to SJA1110A port 2 (DSA CPU port) — the port in question - PFE_MAC2: SGMII via SerDes0 lane1 The S32G MACs are configured as follows: +---------+--------------+------------------+ |                    | LANE 0               | LANE 1                        | +---------+--------------+------------------+ | SERDES0    | GMAC (SGMII) | PFE_MAC2 (SGMII)  | | SERDES1      | NOT USED        | PFE_MAC0 (SGMII) | +---------+--------------+------------------+ Full U-Boot hwconfig: hwconfig=pcie0:mode=sgmii,clock=ext,fmhz=100,xpcs_mode=both;pcie1:mode=sgmii,clock=ext,fmhz=100,xpcs_mode=0 pfeng_mode=enable,sgmii,rgmii,sgmii DTS for port@2 (switch side): port@2 { reg = <2>; label = "OBC-1"; ethernet = <&pfe_netif1>; phy-mode = "rgmii"; rx-internal-delay-ps = <0>; tx-internal-delay-ps = <0>; fixed-link { speed = <1000>; full-duplex; }; }; DTS for pfe_netif1 (MAC side): &pfe_netif1 { phy-mode = "rgmii"; status = "okay"; fixed-link { speed = <1000>; full-duplex; }; }; PFE_MAC1 (pfe1) link state — confirmed up and correctly configured at the Linux/driver level: dmesg at boot: [ 5.264108] pfeng 46000000.pfe: netif name: pfe1 [ 5.274127] pfeng 46000000.pfe: netif(pfe1) linked phyif: 1 [ 5.279692] pfeng 46000000.pfe: netif(pfe1) mode: std [ 5.284853] pfeng 46000000.pfe: netif(pfe1) HIFs: count 1 map 02 [ 6.012884] pfeng 46000000.pfe pfe1 (uninitialized): Subscribe to HIF1 [ 6.019438] pfeng 46000000.pfe pfe1 (uninitialized): Host LLTX disabled [ 6.026270] pfeng 46000000.pfe pfe1 (uninitialized): Enable HIF1 [ 6.032374] pfeng 46000000.pfe pfe1 (uninitialized): setting MAC addr: 00:04:9f:be:ef:01 [ 6.040545] pfeng 46000000.pfe pfe1 (uninitialized): PTP HW addend 0x80000000, max_adj configured to 46566128 ppb [ 6.060939] pfeng 46000000.pfe pfe1 (uninitialized): Registered PTP HW clock successfully on EMAC1 [ 6.070441] pfeng 46000000.pfe pfe1: registered [ 6.207482] pfeng 46000000.pfe pfe1: configuring for fixed/rgmii link mode [ 6.214306] pfeng 46000000.pfe pfe1: Set TX clock to 125000000Hz [ 6.220158] pfeng 46000000.pfe pfe1: Link is Up - 1Gbps/Full - flow control off [ 5.257995] pfeng 46000000.pfe: EMAC0 interface mode: 4 [ 5.290707] pfeng 46000000.pfe: EMAC1 interface mode: 9 [ 5.323320] pfeng 46000000.pfe: EMAC2 interface mode: 4 [ 5.354571] pfeng 46000000.pfe: Interface selected: EMAC0: 0x4 EMAC1: 0x9 EMAC2: 0x4 [ 5.382609] pfeng 46000000.pfe: TX clock on EMAC0 for interface sgmii installed [ 5.390050] pfeng 46000000.pfe: RX clock on EMAC0 for interface sgmii installed [ 5.404998] pfeng 46000000.pfe: TX clock on EMAC1 for interface rgmii installed [ 5.419918] pfeng 46000000.pfe: Defer enabling of RX clock on EMAC1 for interface rgmii (ret: -5) [ 5.434235] pfeng 46000000.pfe: TX clock on EMAC2 for interface sgmii installed [ 5.448374] pfeng 46000000.pfe: RX clock on EMAC2 for interface sgmii installed [ 5.667058] pfeng 46000000.pfe: EMAC timestamp external mode bitmap: 0 [ 5.998447] pfeng 46000000.pfe pfe0 (uninitialized): Registered PTP HW clock successfully on EMAC0 [ 6.060939] pfeng 46000000.pfe pfe1 (uninitialized): Registered PTP HW clock successfully on EMAC1 [ 6.130296] pfeng 46000000.pfe pfe2 (uninitialized): Registered PTP HW clock successfully on EMAC2 [ 6.215040] pfeng 46000000.pfe: RX clock on EMAC1 for interface rgmii installed Live DTB confirms the kernel matches the source DTS: # cat /proc/device-tree/soc/pfe@46000000/ethernet@11/phy-mode rgmii ip a output: 6: pfe1: mtu 1536 qdisc mq state UP group default qlen 1000 link/ether 00:04:9f:be:ef:01 brd ff:ff:ff:ff:ff:ff inet6 fe80::204:9fff:febe:ef01/64 scope link All SJA1110 DSA slave ports correctly enumerated. This confirms the sja1105 DSA driver bound successfully to pfe1 as the CPU port/DSA master and parsed the static config without error. Clock tree: both TX and RX RGMII clocks enabled and attached to the correct consumer: # cat /sys/kernel/debug/clk/clk_summary | grep pfe1 pfe1_tx_mii 0 0 0 125000000 0 0 50000 Y deviceless no_connection_id pfe1_rx_mii 0 0 0 125000000 0 0 50000 Y deviceless no_connection_id pfe1_tx_rmii 0 0 0 125000000 0 0 50000 Y deviceless no_connection_id pfe1_rx_rmii 0 0 0 125000000 0 0 50000 Y deviceless no_connection_id pfe1_tx_rgmii 1 1 0 125000000 0 0 50000 Y ethernet@11 tx_rgmii pfe1_rx_rgmii 1 1 0 125000000 0 0 50000 Y ethernet@11 rx_rgmii pfe1_tx_sgmii 0 0 0 125000000 0 0 50000 Y deviceless no_connection_id pfe1_rx_sgmii 0 0 0 125000000 0 0 50000 Y deviceless no_connection_id So pfe1 is UP, LOWER_UP, correctly bound to the SJA1110 as DSA master, running in RGMII mode with both clocks enabled — this rules out pfe1 being down, unbound, or misconfigured at the Linux/driver level. The open question is specifically whether frames actually cross the physical RGMII pins between PFE_MAC1 and SJA1110 port 2. Issue: No traffic appears to cross the RGMII bus between PFE_MAC1 and SJA1110 port 2 in either direction, despite everything on both sides of that bus being independently up: Test 1 — S32G -> switch direction Setup: ip addr add 192.168.1.100/24 dev EPS-100bt1-9 ethtool -S pfe1 | grep '^ p02_' > before tcpdump -i pfe1 -e -nn -c 20 > capture.txt & arping -c 10 -I EPS-100bt1-9 192.168.1.6 ethtool -S pfe1 | grep '^ p02_' > after # arping -c 10 -I EPS-100bt1-9 192.168.1.6 ARPING 192.168.1.6 from 192.168.1.100 EPS-100bt1-9 Sent 10 probes (10 broadcast(s)) Received 0 response(s) $ cat capture.txt tcpdump: verbose output suppressed, use -v[v]... for full protocol decode listening on pfe1, link-type NULL (BSD loopback), snapshot length 262144 bytes 18:08:36.352535 AF Unknown (4294967295), length 64: 0x0000: ffff 0004 9fbe ef01 dadb 0c09 0806 0001 ................ 0x0010: 0800 0604 0001 0004 9fbe ef01 c0a8 0164 ...............d 0x0020: ffff ffff ffff c0a8 0106 0000 0000 0000 ................ 0x0030: 0000 0000 0000 0000 0000 0000 ............ [... 9 more identical ARP frames, all correctly DSA-tagged (dadb 0c09) and well-formed, plus one unrelated IPv6 background frame interleaved ...] # diff before after --- before +++ after @@ -1,4 +1,4 @@ - p02_: 1 + p02_: 0 p02_n_runt: 0 p02_n_soferr: 0 p02_n_alignerr: 0 # grep n_rxfrm before after before: p02_n_rxfrm: 0 after: p02_n_rxfrm: 0 Test 2 — switch -> S32G direction Setup Partner board is a separate SJA1105 switch based board. # ping -c 10 -I t1-6 192.168.1.100 (run on a separate SJA1105/1110-family switch board connected to our port 9 / 100BASE-T1 / EPS-100bt1-9) # diff before after (ethtool -S EPS-100bt1-9) - n_rxfrm: 0 + n_rxfrm: 9 <- port 9 physically received 9 frames from the wire # diff before after - p02_n_txfrm: 0 + p02_n_txfrm: 9 <- switch fabric forwarded all 9 toward the CPU port # tcpdump -i pfe1 -e -nn -c 20 (same window) listening on pfe1, link-type NULL (BSD loopback), snapshot length 262144 bytes [-- nothing captured --] Port 9 received 9 real frames; the fabric forwarded all 9 toward port 2 — but nothing arrived at pfe1. So the SJA1110's own fabric counters show all 9 frames successfully forwarded from port 9 to port 2's egress. But tcpdump -i pfe1 -e -nn on the S32G during this exact test shows NOTHING received. So the DSA/software layer on the S32G side believes it's sending (case 1). The switch's internal fabric believes it's sending toward the CPU port (case 2). Neither side has any confirmation that the other actually received anything across the physical RGMII bus. Every layer adjacent to this bus works individually; the bus itself has no confirmed successful crossing in either direction. What's been ruled out so far: - pfeng_mode / hwconfig (xpcs_mode) — confirmed correct; EMAC1 mode is RGMII (0x9), not SGMII (it was previously misconfigured as SGMII due to xpcs_mode=both on SerDes1 forcing PFE_MAC1's XPCS into SGMII; corrected to xpcs_mode=0 since PFE_MAC0 alone only needs XPCS0) - PFE_MAC1 TX/RX clock enablement — confirmed enabled at the correct rate (125MHz) in clk_summary - DSA tagging and CPU port binding — confirmed working (port netdevs exist, frames get tagged with the correct destination port in the DSA header) - SJA1110 internal fabric/forwarding — confirmed working between two other ports (9 and 2) using real external traffic - BASE-T1 link partner — confirmed passing real frames into the switch (port 9 n_rxfrm increments from genuine wire traffic) What hasn't been ruled out / open questions: - Whether 1000 Mbps RGMII with zero internal delay on both MAC and switch sides (rx/tx-internal-delay-ps=0, plain "rgmii" not "rgmii-id") is compatible without delay added by board trace length — have not yet tried forcing the link down to 100 Mbps as a timing-margin test 1. Is rx/tx-internal-delay-ps=0 on both ends at 1000 Mbps RGMII expected to work, or does this combination typically require delay compensation unless the PCB explicitly accounts for it? 2. Am I missing any other configuration? Happy to share full register dumps, if required. Appreciate any pointers before we probe the PE_02-13 bus with a logic analyzer (limited probe access due to board layout, so it is not so convenient currently. Thanks. Re: Custom S32G399A board: No frames cross switch-facing RGMII bus in either direction Hi @Joey_z @db16122 I am attaching the relevant sections of the schematics here. The connection flow is as follows: We use PE_02 to PE_13 on the S32G3 chip shown in s32g3_pfe_mac1_connections.png for the PFE_MAC1. They go to a board to board connector (shown in Board_to_board_connector.png) that routes these signals to  a different board that has the switch. The switch connections are shown in SJA1110_A.png and SJA1110_B.png. So the connection is PE_xx pins -> board connectors -> switch (SJA1110) Please let me know if you have any questions. I have also raised a support ticket ( #00990408) with the same details.  Re: Custom S32G399A board: No frames cross switch-facing RGMII bus in either direction Hi,pcentauri92 Thank you for your reply. Please provide me with the schematic diagrams related to your ETH, particularly the ones for PFE_MCA1 and SJA1110 sections. You can create an internal support system case. In the information description, @Joey, then provide your schematic diagram information. Refer to this website: https://support.nxp.com BR Joey Re: Custom S32G399A board: No frames cross switch-facing RGMII bus in either direction Hi @Joey_z , Thank you for the response. The module in question here is a custom design that uses the S32G399A chip along with the NXP SJA1110A ethernet switch. We based this design on the S32G-VNP-RDB3 development platform but we made quite a few changes from the base design. The PFE_MAC1 using RGMII is one of those changes.  I am also attaching the dts file override where we change the PFE_MAC1 mode and pinmux here. PFE_MAC1 mode configuration: /* pfe_mdio1 is already disabled in the base config in s32gxxxa-rdb.dtsi */ &pfe_mdio1 { /* occupied by GMAC0 */ status = "disabled"; }; /* * pfe_netif1 = PFE_MAC1 — management port to Switch-A port 2. * Overrides the base "sgmii" stub in s32gxxxa-rdb.dtsi. * Plain "rgmii" (no -id/-txid) since both MAC and switch add zero delay. * No phy-handle: the link partner is the SJA1110A switch, described as a * fixed-link on switch port@2. MDIO is not needed for link management here. */ &pfe_netif1 { phy-mode = "rgmii"; status = "okay"; fixed-link { speed = <1000>; full-duplex; }; }; PFE_MAC1 pinmux: /* * PFE_MAC1 RGMII pinmux — management port to Switch-A. * * All RX pad SSS values confirmed from S32G3 IOMUX spreadsheet. * TX path: output pads only, no IMCR needed. * RX path: input pads + IMCR registers to route pads into PFE_MAC1. * * Note: PE_07 (TXD3) uses FUNC3, not FUNC2. Similarly PE_08 (RX_CLK) output uses FUNC3; its IMCR (CR#859) uses FUNC2. */ pfe1rgmii_pins: pfe1rgmii_pins { /* TX outputs: PE_02=TX_CLK, PE_03=TX_EN, PE_04=TXD0, PE_05=TXD1, PE_06=TXD2 PE_07 (TXD3) */ pfe1rgmii_grp0 { pinmux = , /* PE_02: PFE_MAC1_TX_CLK */ , /* PE_03: PFE_MAC1_TX_EN */ , /* PE_04: PFE_MAC1_TXD0 */ , /* PE_05: PFE_MAC1_TXD1 */ , /* PE_06: PFE_MAC1_TXD2 */ ; /* PE_07: PFE_MAC1_TXD3 */ output-enable; slew-rate = ; }; /* RX inputs — pads set to FUNC0 (input mode); routing into PFE_MAC1 is handled by the IMCR entries in pfe1rgmii_grp2 below. NXP input mux pattern: pad=FUNC0 + IMCR=FUNC2 */ pfe1rgmii_grp1 { pinmux = , /* PE_08: input */ , /* PE_09: input */ , /* PE_10: input */ , /* PE_11: input */ , /* PE_12: input */ ; /* PE_13: input */ input-enable; slew-rate = ; }; /* IMCR input mux — selects which pad drives each PFE_MAC1 RX signal. CR#866 routes PE_02 (TX_CLK pad) back into PFE_MAC1_TX_CLK_I; required even for RGMII TX because the MAC samples its own TX_CLK internally. All entries at FUNC2 per S32G3 IOMUX spreadsheet. */ pfe1rgmii_grp2 { pinmux = , /* CR#866: PFE_MAC1_TX_CLK_I ← PE_02 */ , /* CR#859: PFE_MAC1_RX_CLK_I ← PE_08 */ , /* CR#865: PFE_MAC1_RXDV_I ← PE_09 */ , /* CR#861: PFE_MAC1_RXD_I[0] ← PE_10 */ , /* CR#862: PFE_MAC1_RXD_I[1] ← PE_11 */ , /* CR#863: PFE_MAC1_RXD_I[2] ← PE_12 */ ; /* CR#864: PFE_MAC1_RXD_I[3] ← PE_13 */ }; }; Please let me know if you need any other information.    Re: Custom S32G399A board: No frames cross switch-facing RGMII bus in either direction any schematics sharing from hardware side for RGMII bus between PFE_MAC1 and SJA1110 port 2 ? Re: Custom S32G399A board: No frames cross switch-facing RGMII bus in either direction Hi,pcentauri92 Thank you for your detail information According to my understanding, there seems to be a problem with the communication when using PFE_MAC1 RGMAII and Port 2 of SJA1110A on your development board. Is that correct? The default configuration of S32G-VNP-RDB3 is that PFE_MAC0/1 operates in SGMII mode and is connected to SJA1110. On your development board, why did you consider using RGMII mode? It is recommended to modify the corresponding software configuration. BR Joey
查看全文
MCXA153:LPSPI 数据突发传输。 你好, 参考手册 MCXA153 包含了对 TDBRn 和 RDBRn LPSPI 寄存器的描述: “TDBRn 和 RDBRn 寄存器支持向发送 FIFO 发送数据进行突发传输,以便与 DMA 控制器一起使用”。 请问有人可以分享一下使用这些寄存器进行突发传输的示例代码吗? 此致 博格丹 通信与控制(I3C | I2C | SPI | FlexCAN | 以太网 | FlexIO) MCXA Re: MCXA153: LPSPI data burst transfer. 嗨@bogdan_u 抱歉,目前没有相关示例。 我找到的最接近的 MCXA153 示例使用 LPSPI_MasterTransferEDMALite() 和 eDMA,但驱动程序通过 LPSPI_GetTxRegisterAddress() / LPSPI_GetRxRegisterAddress() 来定位 TDR/RDR,而不是突发别名窗口。 但我认为你可以尝试使用。 typedef struct { uint32_t cmd; uint32_t data[128]; } lpspi_burst_tx_t; static inline uint32_t LPSPI_TCBR_Address(LPSPI_Type *base) { return ((uint32_t)base + LPSPI_TCBR_OFFSET); } static inline uint32_t LPSPI_TDBR0_Address(LPSPI_Type *base) { return ((uint32_t)base + LPSPI_TDBR0_OFFSET); } static inline uint32_t LPSPI_RDBR0_Address(LPSPI_Type *base) { return ((uint32_t)base + LPSPI_RDBR0_OFFSET); } void LPSPI_StartTxBurstDMA(LPSPI_Type *base, edma_handle_t *txDmaHandle, uint32_t *cmd_plus_data, uint32_t nwords) { edma_transfer_config_t cfg = {0}; cfg.srcAddr = (uint32_t)&cmd_plus_data[0]; cfg.destAddr = LPSPI_TCBR_Address(base); cfg.srcOffset = 4; cfg.destOffset = 4; cfg.srcTransferSize = kEDMA_TransferSize4Bytes; cfg.destTransferSize = kEDMA_TransferSize4Bytes; cfg.minorLoopBytes = 4; cfg.majorLoopCounts = nwords + 1u; EDMA_ResetChannel(txDmaHandle->base, txDmaHandle->channel); EDMA_SetTransferConfig(txDmaHandle->base, txDmaHandle->channel, &cfg, NULL); EDMA_StartTransfer(txDmaHandle); LPSPI_EnableDMA(base, kLPSPI_TxDmaEnable); } void LPSPI_StartRxBurstDMA(LPSPI_Type *base, edma_handle_t *rxDmaHandle, uint32_t *rx_words, uint32_t nwords) { edma_transfer_config_t cfg = {0}; cfg.srcAddr = LPSPI_RDBR0_Address(base); cfg.destAddr = (uint32_t)&rx_words[0]; cfg.srcOffset = 4; cfg.destOffset = 4; cfg.srcTransferSize = kEDMA_TransferSize4Bytes; cfg.destTransferSize = kEDMA_TransferSize4Bytes; cfg.minorLoopBytes = 4; cfg.majorLoopCounts = nwords; EDMA_ResetChannel(rxDmaHandle->base, rxDmaHandle->channel); EDMA_SetTransferConfig(rxDmaHandle->base, rxDmaHandle->channel, &cfg, NULL); EDMA_StartTransfer(rxDmaHandle); LPSPI_EnableDMA(base, kLPSPI_RxDmaEnable); } BR 哈里
查看全文
[Zephyr ®系列] 第 4 部分:Kconfig 和设备树的概述及实际应用(日语博客)   从现在开始,我们将进入 Zephyr 的高级主题学习。 本次课程将概述 Kconfig 和设备树,然后进行实践编程练习,帮助您有效地使用它们。   如前所述,Zephyr RTOS 的一个关键特性是其软件可扩展性(可重用性),这使得在其他项目或衍生产品中重用一次开发的软件变得容易,从而实现快速开发。   此外,为了支持各种硬件平台,Zephyr 采用了名为“Kconfig”和“Devicetree”的强大配置系统。   这样,您只需更改配置文件,即可将程序移植到不同的微控制器板,而无需使用相同的 C/C++ 语言重写源代码。 本文解释了Kconfig和设备树的基本机制。作为实际应用,我们将修改第三部分中创建的与硬件无关的LED闪烁程序,使其能够在两种不同的微控制器板“ FRDM-MCXA153 ”和“ FRDM-MCXN947 ”上运行。   为了在不同的电路板(微控制器和处理器)上运行同一个应用程序,我们将解释使用 Kconfig 和设备树的实用编程方法。     目录   准备 Kconfig基础知识 设备树基础知识 提高软件重用性的最佳实践 Kconfig 和设备树的实际应用 创建一个简单的程序(动手实践) 1. 程序规范 2. 目录结构 3. 创建 Kconfig 和 prj.conf 文件 4. 创建设备树覆盖层和板级特定设置 5. 与硬件无关的通用代码(main.c)创造 6. 构建并运行 总结 准备   硬件准备   本文将主要使用以下开发板来创建和测试程序。 FRDM-MCXA153 (主要用途) 此外,以下电路板将作为辅助工具,用于验证您所创建的程序的可移植性。 FRDM-MCXN947   SW 准备   本指南假设您已搭建好 Zephyr 开发环境(Zephyr SDK、West 命令等)。如果您尚未搭建,请参阅第二篇关于环境搭建的文章。 【Zephyr ®系列】第二部分:首次构建与测试(日语博客)   我们将使用在 Zephyr 系列第三篇文章中创建的 LED 闪烁程序。如果您尚未创建该程序,我们建议您参考上一篇文章进行创建。 【Zephyr ®系列】第三部分:LED 闪烁和软件复用的第一步(日语博客)   Kconfig基础知识     Kconfig 是 Linux 内核中使用的一种配置系统。在 Zephyr 中,它用于管理是否“启用或禁用”软件功能,或者“设置哪些参数”,例如内核函数、设备驱动程序、子系统和应用程序特定的设置。 以下两个文件对 Kconfig 很重要: “Kconfig”文件定义了可选的配置项(符号)、它们的默认值和依赖关系。 "prj.conf" 文件*:应用程序开发人员在此文件中指定他们想要为 "Kconfig" 中定义的项目设置的值(例如,使用 "y" 启用它们或提供特定的数值)。 使用 Kconfig,您可以排除编译中不必要的代码并优化内存使用。 此外,Kconfig 和 prj.conf 文件都是以文本格式编写的。 如何启用此功能 prj.conf 文件启用整个项目的功能。 例如,ADC、DAC 和 OPAMP 驱动程序在 Kconfig 中定义。使用 Kconfig 中定义的函数时,需要在 prj.conf 文件开头添加“CONFIG_”来声明它们。 Kconfig:ADCの定義Kconfig:ADC定义 prj.conf例prj.conf 示例   设备树基础知识   Devicetree例设备树示例   设备树是一个文本文件,它描述了微控制器支持的硬件(CPU、内存、外设、引脚设置等),以及这些硬件的设置和配置。 然后将这些设置和配置展开成宏。   Zephyr 宏可以读取设备树中描述的信息,而不是直接将硬件地址写入 C 代码(硬编码),从而实现与硬件无关的编程。 节点和属性:硬件的每个元素在层次结构中都表示为一个“节点”,寄存器地址、中断号等则被描述为“属性”。 ".dts" 和 ".dtsi":每个微控制器和电路板的标准硬件配置都在 Zephyr 存储库中的 ".dts"(设备树源)和 ".dtsi"(包含)文件中预定义。 dts:被描述为电路板的设备树。 dtsi:描述 SoC/微控制器的设备树,由设备制造商提供。 ".overlay" 文件:当您想要覆盖特定应用程序的接线(例如,将 LED 连接到特定的 GPIO 引脚)或默认设置时,将创建此文件。   提高软件重用性的最佳实践   为了提高 Zephyr 软件的可重用性,遵循以下设计原则非常重要: 硬件相关部分与硬件无关部分的分离: C 代码(`main.c`)例如,避免直接描述具体的微控制器寄存器操作或引脚编号。 利用设备树别名:应用程序不应直接引用实际的硬件节点(例如 `&red_led` 或 `&gpioa`),而应引用在 `aliases` 节点中定义的抽象名称(例如 `led0`)。这样,只需更改别名指向的内容,即可轻松适配不同的开发板。 准备特定于电路板的设备树(覆盖) :当某些功能存在差异时,例如在衍生产品中,您可以仅对每个电路板上硬件不同的部分进行覆盖(覆盖)。 使用 Kconfig 切换功能:应用程序行为参数和特定功能的开/关状态使用 Kconfig 符号而不是 C 语言“#define”进行控制。   Kconfig 和设备树的实际应用   接下来,我们将通过创建一个简单的程序来学习如何使用 Kconfig 和设备树,以便我们能够在实践中实际使用它们。     创建一个简单的程序(动手实践) 该程序将通过修改我们上次创建的 LED 闪烁程序来创建,并将具有以下规格。   在这里,作为一项实践练习,我们将创建一个可以在“FRDM-MCXA153”和“FRDM-MCXN947”上运行的通用应用程序。 1. 程序规范 源代码:使用“第 3 部分:你的第一个 LED 闪烁程序”中的代码,并进行以下修改。 LED闪烁速度:可以使用Kconfig设置闪烁间隔。 按钮功能(启用/禁用):可通过 Kconfig 设置启用或禁用按钮功能。启用后,按下按钮可在 LED 闪烁和常亮之间切换。 输出板卡名称:启动时,Kconfig 中配置的“设备(板卡)名称”将输出到标准输出(终端)。 2. 目录结构   项目目录结构应如下所示:   将 Kconfig 文件和 boards 文件夹添加到上次创建的 LED 闪烁程序的“my_hello”文件夹中。添加文件的方法不限。 在 Windows 系统中,使用 PowerShell `ni` 命令或文本编辑器创建一个新文件,并将其保存在 `my_hello` 文件夹中。 在 Linux 系统中,可以使用 `touch` 命令创建一个新的空文件。   “boards/”目录下的文件用于处理硬件差异以及每个主板特有的独特设置。     my_hello/ ├── CMakeLists.txt ├── Kconfig <- 新規追加:アプリ独自のKconfig ├── prj.conf <- アプリの共通設定 ├── src/ │ └── main.c <- ハードウェア非依存の共通コード └── boards/ <- 新規作成フォルダ  ├── frdm_mcxa153.overlay <- 新規作成:FRDM-MCXA153用のデバイスツリー設定  ├── frdm_mcxa153.conf <- 新規作成:FRDM-MCXA153用のKconfig設定  ├── frdm_mcxn947_cpu0.overlay <- 新規作成:FRDM-MCXN947用のデバイスツリー設定  └── frdm_mcxn947_cpu0.conf <- 新規作成:FRDM-MCXN947用のKconfig設定   注意:通过在应用程序目录中创建特定文件,Zephyr 的构建系统(West)将自动识别它们并应用设置。 添加 Kconfig:您可以通过在应用程序文件夹中放置“Kconfig”文件来添加自己的配置符号。 板级特定设置(“boards/”目录):通过在应用程序中创建“boards”目录并将“[板级名称].overlay”或“[板级名称].conf”文件放置于其中,overlay和Kconfig覆盖将仅在以该板级为目标进行构建时自动应用。   3. 创建 Kconfig 和 prj.conf 文件 首先,在应用程序根目录中创建您自己的“Kconfig”文件,并定义特定于应用程序的参数。 my_hello/Kconfig   mainmenu "my LED blink" config CUSTOM_BLINK_RATE_MS int "LED blink rate in milliseconds" default 1000 help Set LED blink frequency. #LEDの点滅周期(ミリ秒)を設定します config ENABLE_BUTTON_TOGGLE bool "Enable button to toggle LED state" default y help Enable button to toggle LED state. # ボタン入力によるLEDの点滅/点灯状態>の切り替え機能を有効にします。 config BOARD_NAME_STRING string "Board Name String" default "Unknown Board" help Set board name for printf. # 標準出力に表示するボード名を設定します。 source "Kconfig.zephyr"     其次,作为整个应用程序的通用设置,还有“prj.conf”。这件事将会被写下来。 在 prj.conf 文件中,使用您刚刚创建的 Kconfig 符号按如下方式进行配置: my_hello/prj.conf   # GPIOの有効化 CONFIG_GPIO=y # アプリケーションの共通設定 CONFIG_CUSTOM_BLINK_RATE_MS=500 CONFIG_ENABLE_BUTTON_TOGGLE=y   4. 创建设备树覆盖层和板级特定设置 创建一个名为“boards”的目录,并为每个电路板准备必要的文件。 FRDM-MCXA153主板     我们将电路板上的按钮(`sw2`)映射出来,以便应用程序可以使用标准别名`sw0`访问它。`led0`已经在电路板定义中,因此这里可以省略,但如果需要,也可以显式地覆盖它。   my_hello/boards/frdm_mcxa153.overlay / { aliases { sw0 = &user_button_2; /* FRDM-MCXA153のユーザーボタン */ }; };   my_hello/boards/frdm_mcxa153.conf   CONFIG_BOARD_NAME_STRING="FRDM-MCXA153 Board"   通过在应用程序 (main.c) 中引用此 .conf(特定于板的 Kconfig)中的符号,可以使用 printf 函数将板名称输出到标准输出。 适用于 FRDM-MCXN947 同样,我们在 FRDM-MCXN947 中定义了“sw0”。这可以处理按钮硬件名称的任何差异。   事实上,如果硬件名称(因外围设备或实例而异)在不同电路板之间有所不同,则需要将实际硬件分配给设备树中的别名节点。 my_hello/boards/frdm_mcxn947_cpu0.overlay   / { aliases { sw0 = &user_button_3; /* FRDM-MCXN947のユーザーボタン */ }; };   my_hello/ boards/frdm_mcxn947_cpu0.conf   我将尝试仅在使用 MCXN947 构建时将 LED 闪烁速度设置为 250ms。   CONFIG_BOARD_NAME_STRING="FRDM-MCXN947 Board" CONFIG_CUSTOM_BLINK_RATE_MS=250 FRDM-MCXA153 和 FRDM-MCXN947 的应用程序代码相同,但您可以在此处单独配置 LED 的闪烁行为。 5. 与硬件无关的通用代码(main.c)创造 在“my_hello/src/main.c”中写入以下内容:   LED 控制部分重用了上一篇文章中创建的硬件无关代码(使用“led0”别名),并将 Kconfig 和按钮控制集成到其中。 my_hello/ src/main.c   #include #include #include /* Devicetreeのエイリアスを参照する */ /* どのボードでも、一番目のLEDは通常 "led0" と定義されています */ #define LED0_NODE DT_ALIAS(led0) #define SW0_NODE DT_ALIAS(sw0) /* エイリアスからGPIO仕様(ポート、ピン、フラグ)を取得 */ static const struct gpio_dt_spec led = GPIO_DT_SPEC_GET(LED0_NODE, gpios); /* ボタン機能がKconfigで有効化されている場合のみコンパイルされる部分 */ #ifdef CONFIG_ENABLE_BUTTON_TOGGLE static const struct gpio_dt_spec sw = GPIO_DT_SPEC_GET(SW0_NODE, gpios); static struct gpio_callback button_cb_data; static bool is_blinking = true; void button_pressed(const struct device *dev, struct gpio_callback *cb, uint32_t pins) { is_blinking = !is_blinking; if (!is_blinking) { /* 点滅オフ時はLEDを点灯させた状態にする */ gpio_pin_set_dt(&led, 1); } } #endif //CONFIG_ENABLE_BUTTON_TOGGLE int main(void) { int ret; /* Kconfigで設定されたボード名を出力 */ printf("Starting application on %s\n", CONFIG_BOARD_NAME_STRING); /* デバイスの準備確認 */ if (!gpio_is_ready_dt(&led)) { return -1; } /* ピンの設定 (Devicetreeで定義された初期状態などを考慮して設定) */ ret = gpio_pin_configure_dt(&led, GPIO_OUTPUT_ACTIVE); if (ret < 0) { return -1; } #ifdef CONFIG_ENABLE_BUTTON_TOGGLE if (!gpio_is_ready_dt(&sw)) { return -1; } ret = gpio_pin_configure_dt(&sw, GPIO_INPUT); if (ret < 0) { return -1; } ret = gpio_pin_interrupt_configure_dt(&sw, GPIO_INT_EDGE_TO_ACTIVE); if (ret < 0) { return -1; } gpio_init_callback(&button_cb_data, button_pressed, BIT(sw.pin)); gpio_add_callback(sw.port, &button_cb_data); #endif //CONFIG_ENABLE_BUTTON_TOGGLE while (1) { #ifdef CONFIG_ENABLE_BUTTON_TOGGLE if (is_blinking) { ret = gpio_pin_toggle_dt(&led); } #else /* ピンの状態を反転 (ボタン機能が無効な場合は常に点滅) */ ret = gpio_pin_toggle_dt(&led); #endif //CONFIG_ENABLE_BUTTON_TOGGLE /* Kconfigで設定された点滅間隔で待機 */ k_msleep(CONFIG_CUSTOM_BLINK_RATE_MS); } return 0; }     6. 构建并运行 现在,让我们实际测试一下它的功能。请参考上一篇文章,了解如何设置构建环境和启用 west 命令。 首先,按照下面的命令说明导航到已安装的 zephyrproject 存储库目录,并在继续操作之前启用 west。 已确认 FRDM-MCXA153(主)运行正常 使用以下命令构建并将其写入 FRDM-MCXA153。   ## ホームディレクトリからZephyrprojectディレクトリに移動 cd ~/zephyrproject ## west環境を有効化 source .venv/bin/activate ## zephyr v4.3をチェックアウトしていない場合は、前回(第3回 初めてのLチカとソフトウェアの再利用性)を参考にv4.3をチェックアウトしてください。 west build -b frdm_mcxa153 my_hello west flash     执行结果   コンソール出力控制台输出   LED点滅、点灯モード切り替えLED闪烁和常亮模式切换   终端上将显示“正在FRDM-MCXA153板上启动应用程序”的消息。 LED 灯以500 毫秒的间隔闪烁(“prj.conf”)。(设置)。 按下 SW2(“自定义开关”)即可将其打开,再按下即可使其恢复闪烁状态。 已确认FRDM-MCXN947运行正常 我们将使用完全相同的 C 源代码来构建该项目,只更改电路板规格。   # -pオプションを使用し、frdm_mcxa153のビルド情報をクリーンしてビルドします。 west build -p -b frdm_mcxn947//cpu0 my_hello west flash   执行结果   “boards/frdm_mcxn947_cpu0.conf”的内容将自动应用,终端将显示“在FRDM-MCXN947板上启动应用程序”。 LED 灯以250 毫秒的间隔快速闪烁(在“prj.conf”中配置)。 按下 SW3(MCXN947 上映射到“user_button_3”的按钮)同样可以在 LED 点亮和闪烁之间切换。 虽然 FRDM-MCXA153 和 FRDM-MCXN947 使用不同的 GPIO 来控制 LED 和开关按钮,但设备树有效地吸收了这些差异,这表明应用程序和硬件是如何清晰分离的。   总结     在本节课中,我们学习了 Zephyr 中 Kconfig 和设备树的基础知识,并练习了如何利用它们将硬件相关的部分与 C 代码分离。   我相信您已经体验到了一种强大的机制,可以在多个不同的电路板上重用相同的源代码,其中硬件设置被设备树覆盖(“overlay”)吸收,应用程序参数可以灵活地更改,并且可以使用特定于电路板的 Kconfig 文件(“conf”)轻松启用或禁用功能。   ========================== 我们目前无法回复此帖子“评论”部分留下的评论。 由此给您带来的不便,我们深表歉意。如有任何疑问,请参考“NXP 技术问题 - 如何联系我们(日语博客)”。 (如果您已经是恩智浦的分销商或与恩智浦有合作关系,您可以直接咨询您的代表。) 本文档概述了设备树和 Kconfig,这两项功能旨在增强 Zephyr 的软件重用性。随后,本文档详细介绍了在实践中使用这些功能所需的步骤。 读完 Zephyr 系列的第一册到第四册后,你将能够使用 Zephyr 实时操作系统编写程序。 通用微控制器 MCX 日本博客
查看全文
How to Measure the Internal Temperature and Voltage of an MCU Using the ADC0 NXPサポートチームの皆様、こんにちは。  現在、S32K314、RTD 7.0.0、およびFreeRTOSを使用したプロジェクトに取り組んでいます。MCALのADCモジュールを使用して、MCUに接続された外部デバイスの電圧、MCUの内部温度(TEMPSENSE)、MCUの内部電圧(ANAMUX)、およびバンドギャップ電圧の測定を実装しようとしています。測定結果を見ると、外部デバイスの電圧とバンドギャップ電圧は正しく測定されているようですが、MCUの内部温度と内部電圧の値は予想と異なっています。 期待値: MCU内部電圧(VDD_HV_A): 8192(2.5V、14ビット分解能) 実測値: 約6800~7100(2.07~2.13V、14ビット分解能) MCUの電源電圧は5.0Vです。ADCハードウェアユニットはADC0に設定され、ADC測定対象は以下のように構成されます。  Ch8:MCU内部温度(TEMPSENSE)  Ch9:MCU内部電圧(ANAMUX)  第10章:バンドギャップ  MCU入力電圧 = 5.0V ADC初期化コード: void AdcAdapter_Init ( void ) { Adc_Calibrate ( ADC0 , & calStatus ) ; Adc_SetupResultBuffer ( ADC0 , Group0Result ) ; IP_DCM_GPR -> DCMRWF1 = ( IP_DCM_GPR -> DCMRWF1 | DCM_GPR_DCMRWF1_SUPPLY_MON_EN ( 1 ) | DCM_GPR_DCMRWF1_VDD_HV_A_VLT_DVDR_EN ( 1 ) | DCM_GPR_DCMRWF1_VDD_HV_B_VLT_DVDR_EN ( 1 ) | DCM_GPR_DCMRWF1_VDD_1_5_VLT_DVDR_EN ( 1 ) ) ; IP_DCM_GPR -> DCMRWF1 = ( IP_DCM_GPR -> DCMRWF1 & ~ DCM_GPR_DCMRWF1_SUPPLY_MON_SEL_MASK ) | DCM_GPR_DCMRWF1_SUPPLY_MON_SEL ( 0U ) ; // VDD_HV_A_DIV Adc_StartGroupConversion ( ADC0 ) ; // AdcConversionStart } ADCデータ取得(すべての周期的なタスク) void AdcAdapter_RunCyclic ( void ) { Adc_StatusType ret = ADC_IDLE ; Std_ReturnType adcStatus ; uint16 temperature ; // 変換完了チェック ret = Adc_GetGroupStatus ( ADC0 ) ; if ( ( ret == ADC_COMPLETED ) || ( ret == ADC_STREAM_COMPLETED ) ) { // 結果を取得 Adc_ReadGroup ( ADC0 , Group0Result ) ; // 次の変換を開始 Adc_StartGroupConversion ( ADC0 ) ; } else { // エラーログ } /* Adc_TempSenseGetTemp Singed Q11.4 */ adcStatus = Adc_TempSenseGetTemp ( ADC0 , mcuTemperature ) ; if ( E_OK == adcStatus ) { temperature = Adc_TempSenseCalculateTemp ( ADC0 , mcuTemperature ) ; } else { // エラーログ } }  ADC0グループのADC値は`Adc_ReadGroup`を使用して更新できると思いますが、MCUの内部温度については`Adc_TempSenseGetTemp`と`Adc_TempSenseCalculateTemp`を使用する必要があると思います。もし私が見落としている設定があれば教えてください。 Re: How to Measure the Internal Temperature and Voltage of an MCU Using the ADC0 こんにちは、センレントさん。 迅速なご対応ありがとうございます。 ご提供いただいたサンプルコードは既に確認済みで、私のコードに組み込んだと考えています。 ご提供いただいた表は、ADCブロックに供給される各クロックに対するレジスタ設定の表であると解釈しました。しかし、それらがMCALのどのADC設定に対応しているのかを特定することはできませんでした。 ソースコードを提供できないため、ADC設定の画像を添付します。どの設定を変更すればよいか教えてください。 他に何か必要な設定画面があれば、お知らせください。 AdcHwUnit> Re: How to Measure the Internal Temperature and Voltage of an MCU Using the ADC0 こんにちは@輝彦 提供された情報にはADCの完全な構成が見当たらなかったので、ADCクロックがデータシートの要件に合っているか再確認してください。 可能であれば、テストプロジェクトを共有していただければ、私が確認します。 ちなみに、下記のリンクからデモをご覧ください。 https://community.nxp.com/t5/S32K-Knowledge-Base/Example-S32K344-TempSenser-S32DS36-RTD600-500-400-p24/ta-p/2136187 Re: How to Measure the Internal Temperature and Voltage of an MCU Using the ADC0 こんにちは、センレントさん。 アドバイスありがとうございます。 ご助言に従い、TEMPSENSEのサンプリング時間を1.2マイクロ秒に設定するように、以下のように設定を変更しました。 160MHz = 0.00625マイクロ秒 1.2マイクロ秒/0.00625マイクロ秒= 192 FreeRTOSで1秒サイクルのタスクを作成し、MCU電圧(VDD_HV_A)とMCU温度(TEMPSENSE)のADC値を毎秒取得しました(30秒分のデータ収集)。 MCU電圧についてはバンドギャップ電圧を使い、以下の補償式でmVに変換しました。 (バンドギャップ電圧はほとんど変動せず、約3975(約1.2V)の値が得られた。) Adc補正 = (1200(mV) * Adc_VCC_HV_A) / Adc_バンドギャップ Mcu電圧 = アドコレーション × 2(2は電圧分割比VDD_HV_A) さらに、 McuTempデータは `Adc_TempSenseGetTemp(ADC0, &mcuTemperature)` から取得されます。 ADC変換誤差が±5.0%であることを考慮しても、このばらつきは大きすぎると思います。何か解決策の提案はありますか?   Re: How to Measure the Internal Temperature and Voltage of an MCU Using the ADC0 こんにちは@輝彦 ご提供いただいた設定画面のスクリーンショットとコードを見る限り、明らかなエラーは見当たりません。ただし、温度センサのサンプリング時間は1.2μsを超えなければならないことに注意が必要です。そうでなければ、サンプリングの精度に影響します。したがって、テストを行う前にサンプリング時間を再度確認することをお勧めします。 Re: How to Measure the Internal Temperature and Voltage of an MCU Using the ADC0 ADC_Config>AdcHwUnitの画像が圧縮されて解像度が低下したため、再アップロードします。 <#1> <#2> <#3> Re: How to Measure the Internal Temperature and Voltage of an MCU Using the ADC0 こんにちは@輝彦 温度チャネルから生データを直接読み取って、変動があるかどうかを観察できます。変動が大きい場合は、サンプリング時間を延ばし続けるCAN。 Re: How to Measure the Internal Temperature and Voltage of an MCU Using the ADC0 こんにちは、センレントさん。 ご返信ありがとうございます。 下図に示すように、サンプリング期間1/期間2の値を増加させた後、値は安定しました。デフォルト設定はサンプリング持続時間0だと思っていましたが、サンプリング持続時間0、1、2の切り替えはどうすればいいのでしょうか? (プリスケール設定に基づくと、ADCクロックは80MHzなので、1.2μsに相当する期間は96となる。) Re: How to Measure the Internal Temperature and Voltage of an MCU Using the ADC0 こんにちは、センレントさん。 ドキュメントを添付してくださりありがとうございます。現在チャネル32から63を測定しているので、これはサンプリング持続時間1に対応していると理解しています。 迅速なご対応ありがとうございます。問題は解決しました。 Re: How to Measure the Internal Temperature and Voltage of an MCU Using the ADC0 こんにちは、センレントさん。 私は表317の情報を以下のように解釈しました。 fmc = 160 MHz の場合: ・キャリブレーション用のプリスケーラを4に設定する ・通常のADC変換のプリスケーラを2に設定する ・「ADC高速」を無効に設定する これらの設定を適用して得られたデータは、以下の表に示されています。 平均化することでばらつきは減りましたが、MCU内部温度の変動は依然としてかなり大きいと感じます。 以下の表は、ADC値から°Cに変換したMCU温度データを示しています。 (ADC値を摂氏に変換するために、ADC値を16で割りました。) 16点平均で2.55度の変動は極めて大きい。MCUの温度はプロセッシング負荷によって変動することは理解していますが、これほど瞬時に大きく変わるのは普通のことですか? MCUの内部温度を測定する際に、平均を取るのが正しいアプローチでしょうか?
查看全文
RT1176 PWMの起動に失敗しました 私はPWM + Fault + QTimerを使ってモーターパルス制御を実装していますが、PWM3サブモジュール0のPWM_Aチャネルが時々起動できず、最初のハイレベル以降は一定のままで、その後のパルスは現れません。検査の結果、PWMの「ラン」部分が正しく設定されていないことが判明しました。後からプログラムに起動時の処理を繰り返し追加したにもかかわらず、この異常は依然として発生した。 Re: RT1176 PWM startup failed こんにちは、 @liu626 さん。 カスタムボードを使用していますか、それともEVKを使用していますか?EVKを使用している場合、何か改造を加えましたか? PWM3で使っている構成を教えてもらえますか? 何か例を参考にしていますか?もしそうなら、どの学校ですか? PWM3のみを含むプロジェクトを使用して問題を再現しようとした場合、問題は解消されますか? これはPWM3サブモジュール0のPWM_Aチャネルだけに起こるのでしょうか?他のPWMモジュールやサブモジュールでも同様の現象が発生しましたか? PWM3レジスタを操作し、ランビットに影響を与えたり上書きしたりする他のタスクや割り込みはありますか? よろしくお願いします、 パブロ Re: RT1176 PWM startup failed こんにちは、カスタム回路基板を使用しました。私は具体的な例を挙げませんでした。これは、プロジェクトの正式な開発過程で発見された問題だった。パルス制御用に6つのPWMチャネルを設定しました。このチャネルだけが問題を起こし、他のサブモジュールでは同様の問題はありませんでした。調べたところ、このチャネルだけがPWM3モジュールを使っていることがわかりました。他に干渉因子は検出されなかった。以下は私の設定です。 static axis_ctrl_t g_axes[AXIS_NUM] = ヤージュ ヤージュ .id= AXIS_X1、.name= "X1", .pwmBase= PWM1、.pwmModule= kPWM_Module_0、.pwmChannel= kPWM_PwmA、 .tmrBase= TMR3、.lowCh= kQTMR_Channel_2、.highCh= kQTMR_Channel_3、 .tmrInputsrc=kQTMR_ClockCounter2InputPin、.cascadePcs= 6U、 .faultNum= 0U、.hwExactSupported= true、.outTrigMask= kPWM_ValueRegisterMask_3、 }、 ヤージュ .id= AXIS_X2、.name= "X2", .pwmBase= PWM2、.pwmModule= kPWM_Module_0、.pwmChannel= kPWM_PwmA、 .tmrBase= TMR2、.lowCh= kQTMR_Channel_0、.highCh= kQTMR_Channel_1、 .tmrInputsrc=kQTMR_ClockCounter0InputPin、.cascadePcs= 4U、 .faultNum= 0U、.hwExactSupported= true、.outTrigMask= kPWM_ValueRegisterMask_3、 }、 ヤージュ .id= AXIS_Y、.name= "Y"、 .pwmBase= PWM3、.pwmModule= kPWM_Module_0、.pwmChannel= kPWM_PwmA、 .tmrBase= TMR3、.lowCh= kQTMR_Channel_0、.highCh= kQTMR_Channel_1、 .tmrInputsrc=kQTMR_ClockCounter0InputPin、.cascadePcs= 4U、 .faultNum= 0U、.hwExactSupported= true、.outTrigMask= kPWM_ValueRegisterMask_3、 }、 ヤージュ .id= AXIS_Z、.name= "Z"、 .pwmBase= PWM4、.pwmModule= kPWM_Module_0、.pwmChannel= kPWM_PwmA、 .tmrBase= TMR1、.lowCh= kQTMR_Channel_0、.highCh= kQTMR_Channel_1、 .tmrInputsrc=kQTMR_ClockCounter0InputPin、.cascadePcs= 4U、 .faultNum= 0U、.hwExactSupported= true、.outTrigMask= kPWM_ValueRegisterMask_3、 }、 ヤージュ .id= AXIS_EX1、.name= "EX1", .pwmBase= PWM1、.pwmModule= kPWM_Module_1、.pwmChannel= kPWM_PwmA、 .tmrBase= TMR1、.lowCh= kQTMR_Channel_2、.highCh= kQTMR_Channel_3、 .tmrInputsrc=kQTMR_ClockCounter2InputPin、.cascadePcs= 6U、 .faultNum= 1U、.hwExactSupported= true、.outTrigMask= kPWM_ValueRegisterMask_3、 }、 ヤージュ .id= AXIS_EX2、.name= "EX2", .pwmBase= PWM2、.pwmModule= kPWM_Module_1、.pwmChannel= kPWM_PwmA、 .tmrBase= TMR2、.lowCh= kQTMR_Channel_2、.highCh= kQTMR_Channel_3、 .tmrInputsrc=kQTMR_ClockCounter2InputPin、.cascadePcs= 6U、 .faultNum= 1U、.hwExactSupported= true、.outTrigMask= kPWM_ValueRegisterMask_3、 }、 };static void APP_Init_PWM_QTMR(void) ヤージュ pwm_config_t pwmConfig; pwm_fault_param_t faultConfig; qtmr_config_t qtmrConfig; PWM_GetDefaultConfig(&pwmConfig); pwmConfig.pairOperation= kPWM_Independent; pwmConfig.reloadLogic = kPWM_ReloadImmediate; PWM_FaultDefaultConfig(&faultConfig); faultConfig.faultLevel = true; faultConfig.enableCombinationalPath= 偽; faultConfig.faultClearingMode= kPWM_ManualSafety; faultConfig.recoverMode = kPWM_NoRecovery; QTMR_GetDefaultConfig(&qtmrConfig); CLOCK_EnableClock(kCLOCK_Qtimer1); CLOCK_EnableClock(kCLOCK_Qtimer2); CLOCK_EnableClock(kCLOCK_Qtimer3); PWM_StopTimer(PWM1, 0x0FU); PWM_StopTimer(PWM2, 0x0FU); PWM_StopTimer(PWM3, 0x0FU); PWM_StopTimer(PWM4, 0x0FU); pwm_fault_input_filter_param_t faultFilter; faultFilter.faultFilterPeriod= 255U; faultFilter.aultFilterCount= 7U; faultFilter.faultGlitchStretch= 偽; /* 记录每个 PWM 实例上已配置的 faultチャネル,避免重复设置 */ uint16_t pwm1FaultDone = 0U, pwm2FaultDone = 0U, pwm3FaultDone = 0U, pwm4FaultDone = 0U; for (uint8_t i = 0U; i < AXIS_NUM; i++) { axis_ctrl_t *ax = &g_axes[i]; PWM_Init(ax->pwmBase, ax->pwmModule, &pwmConfig); PWM_SetupFaults(ax->pwmBase, (pwm_fault_input_t)ax->faultNum, &faultConfig); /* 故障濾波(每個 PWM 实例的每个 faultチャネル 只设一次) */ { uint16_t *faultDone; if (ax->pwmBase == PWM1) faultDone = &pwm1FaultDone; else if (ax->pwmBase == PWM2) faultDone = &pwm2FaultDone; else if (ax->pwmBase == PWM3) faultDone = &pwm3FaultDone; else faultDone = &pwm4FaultDone; uint16_t faultBit = (uint16_t)(1U << ax->faultNum); if((*faultDone & faultBit) == 0U) { PWM_SetupFaultInputFilterExt(ax->pwmBase, (pwm_fault_channels_t)ax->faultNum, &faultFilter); *faultDone |= faultBit; } } /* 故障時輸出低電平 */ ax->pwmBase->SM[ax->pwmModule].OCTRL &= ~(PWM_OCTRL_PWMAFS_MASK |PWM_OCTRL_PWMBFS_MASK); APP_PWM_Unmap_Selected_Fault(ax); APP_PWM_ClearFault_Safe(ax); ax->pwmBase->SM[ax->pwmModule].INIT = 0U; ax->pwmBase->SM[ax->pwmModule].VAL0 = 0U; ax->pwmBase->SM[ax->pwmModule].VAL1 = 1U; ax->pwmBase->SM[ax->pwmModule].VAL2 = 0U; ax->pwmBase->SM[ax->pwmModule].VAL3 = 0U; ax->pwmBase->SM[ax->pwmModule].VAL4 = 0U; ax->pwmBase->SM[ax->pwmModule].VAL5 = 0U; ax->pwmBase->SM[ax->pwmModule].TCTRL = PWM_TCTRL_OUT_TRIG_EN(ax->outTrigMask); APP_PWM_Disable_Output(ax); if (ax->hwExactSupported) { qtmrConfig.primarySource= ax->tmrInputSrc; QTMR_Init(ax->tmrBase, ax->lowCh, &qtmrConfig); QTMR_Init(ax->tmrBase, ax->highCh, &qtmrConfig); ax->tmrBase->CHANNEL[ax->lowCh]。CTRL = TMR_CTRL_CM(kQTMR_PriSrcRiseEdge) |TMR_CTRL_PCS(ax->tmrInputSrc); ax->tmrBase->CHANNEL[ax->highCh]。CTRL = TMR_CTRL_CM(kQTMR_CascadeCount) |TMR_CTRL_PCS(ax->カスケードPcs); APP_QTMR_Disable_Low_OFLAG_Output(ax); QTMR_DisableInterrupts(ax->tmrBase, ax->lowCh, 0xFFU); QTMR_DisableInterrupts(ax->tmrBase, ax->highCh, 0xFFU); QTMR_ClearStatusFlags(ax->tmrBase, ax->lowCh, 0xFFU); QTMR_ClearStatusFlags(ax->tmrBase, ax->highCh, 0xFFU); } ax->位相 = kAxisIdle; ax->armed = false; ax->running=false; ax->done = 真; #if HARD_PWM_STATE_GUARD_ENABLE APP_StateGuard_Reset(斧); #endif } /* 使能 QTMR 中断 */ NVIC_SetPriority(TMR1_IRQn、2U); NVIC_SetPriority(TMR2_IRQn、2U); NVIC_SetPriority(TMR3_IRQn、2U); EnableIRQ(TMR1_IRQn); EnableIRQ(TMR2_IRQn); EnableIRQ(TMR3_IRQn); }静的ブールAPP_PWM_Config_Pulse(axis_ctrl_t *軸、 uint32_t highCnt400M、 uint32_t 低Cnt400M) { pwm_clock_prescale_tプリスケール; uint16_t期間ダックス; uint32_t totalCnt400M = highCnt400M + lowCnt400M; もし((軸 == NULL) ||(totalCnt400M == 0U))Return false; もし(!APP_PWM_SelectPrescaler_FromPeriodCnt400M(totalCnt400M、およびprescale、&periodTicks)) Return false; uint32_t highTicks32 = (uint32_t)((((uint64_t)periodTicks * (uint64_t)highCnt400M + ((uint64_t)totalCnt400M / 2ULL))/ (uint64_t)totalCnt400M); もし(highTicks32 == 0U) highTicks32 = 1U; もし(highTicks32 >= periodTicks) highTicks32 = (uint32_t)periodTicks - 1U; uint32_t riseTicks32 = 0U; uint32_t fallTicks32 = highTicks32; #if HARD_PWM_LOW_START_PHASE_ENABLE uint32_t lowTicks32 = (uint32_t)periodTicks - highTicks32; もし (lowTicks32 >= (2U * HARD_PWM_LOW_START_PHASE_MIN_TICKS)) { uint32_t LeadCnt400M = highCnt400M; uint32_t minLeadCnt400M = (uint32_t)HARD_PWM_LOW_START_PHASE_MIN_US * 400U; もし(desiredLeadCnt400M < minLeadCnt400M) desiredLeadCnt400M = minLeadCnt400M; uint32_t desiredLeadTicks32 = (uint32_t)(((uint64_t)periodTicks * (uint64_t)desiredLeadCnt400M + ((uint64_t)totalCnt400M / 2ULL))/ (uint64_t)totalCnt400M); if (desiredLeadTicks32 < HARD_PWM_LOW_START_PHASE_MIN_TICKS) desiredLeadTicks32 = HARD_PWM_LOW_START_PHASE_MIN_TICKS; uint32_t maxRiseByHalfTicks32 = lowTicks32 / 2U; uint32_t postGuardTicks32 = (uint32_t)(((uint64_t)periodTicks * (uint64_t)(HARD_PWM_VAL3_POST_LOW_GUARD_US * 400U) + ((uint64_t)totalCnt400M / 2ULL))/ (uint64_t)totalCnt400M); if(postGuardTicks32 < HARD_PWM_VAL3_POST_LOW_GUARD_MIN_TICKS) postGuardTicks32 = HARD_PWM_VAL3_POST_LOW_GUARD_MIN_TICKS; uint32_t maxRiseByPostGuardTicks32 = (lowTicks32 > postGuardTicks32) ? (lowTicks32 - postGuardTicks32) : 0U; uint32_t RiseTicks32; もし (maxRiseByHalfTicks32 >= desiredLeadTicks32) { selectedRiseTicks32 = desiredLeadTicks32; if(selectedRiseTicks32 > maxRiseByHalfTicks32) selectedRiseTicks32 = maxRiseByHalfTicks32; } そうでなければ(maxRiseByPostGuardTicks32 >= desiredLeadTicks32) { selectedRiseTicks32 = desiredLeadTicks32; if (selectedRiseTicks32 > maxRiseByPostGuardTicks32) selectedRiseTicks32 = maxRiseByPostGuardTicks32; } そうでなければ { selectedRiseTicks32 = maxRiseByPostGuardTicks32; } if (selectedRiseTicks32 >= HARD_PWM_LOW_START_PHASE_MIN_TICKS) { riseTicks32 = selectedRiseTicks32; fallTicks32 = riseTicks32 + highTicks32; } } #endif もし(fallTicks32 >= (uint32_t)periodTicks) fallTicks32 = (uint32_t)periodTicks - 1U; uint16_t riseTicks = (uint16_t)riseTicks32; uint16_t fallTicks = (uint16_t)fallTicks32; PWM_SetPwmLdok(axis->pwmBase, APP_PwmModuleMask(axis), false); uint16_t ctrl = axis->pwmBase->SM[axis->pwmModule]。CTRL; ctrl &=(uint16_t)(~PWM_CTRL_PRSC_MASK); ctrl |= PWM_CTRL_PRSC(プリスケール); axis->pwmBase->SM[axis->pwmModule]。CTRL = ctrl; axis->pwmBase->SM[axis->pwmModule]。INIT = 0U; axis->pwmBase->SM[axis->pwmModule]。VAL0 = 0U; axis->pwmBase->SM[axis->pwmModule]。VAL1 = ((uint16_t)(periodTicks - 1U); もし(軸>pwmチャンネル== kPWM_PwmA) { axis->pwmBase->SM[axis->pwmModule]。VAL2 = riseTicks; axis->pwmBase->SM[axis->pwmModule]。VAL3 = fallTicks; } そうでなければ (axis->pwmChannel == kPWM_PwmB) { axis->pwmBase->SM[axis->pwmModule]。VAL4 = riseTicks; axis->pwmBase->SM[axis->pwmModule]。VAL5 = fallTicks; } axis->pwmBase->SM[axis->pwmModule]。TCTRL = PWM_TCTRL_OUT_TRIG_EN(axis->outTrigMask); PWM_SetPwmLdok(軸>pwmBase、APP_PwmModuleMask(軸)、真); PWM_SetPwmLdok(軸>pwmBase、APP_PwmModuleMask(軸)、真); axis->pwmConfigValid = true; 軸>キャッシュドHighCnt400M = highCnt400M; axis->cachedLowCnt400M = lowCnt400M; 真を返す; } Re: RT1176 PWM startup failed こんにちは、 @liu626 さん。 設定を分離して、PWM3だけを初期化しても問題が続くかテストするのを手伝ってもらえますか? ご提供いただいた設定を確認し、その動作を再現するために、以下の質問があります。 axis_ctrl_t の定義は何ですか? アプリケーションでHARD_PWM_LOW_START_PHASE_ENABLEとHARD_PWM_STATE_GUARD_ENABLEは有効になっていますか? 以下のアプリ機能はどのような働きをしますか? APP_PWM_Unmap_Selected_Fault APP_PWM_ClearFault_Safe APP_PWM_出力無効化 APP_QTMR_Disable_Low_OFLAG_Output APP_StateGuard_Reset APP_PWM_SelectPrescaler_FromPeriodCnt400M APP_PwmModuleMask よろしくお願いします、 パブロ Re: RT1176 PWM startup failed お返事ありがとうございます。私が使用しているGPIOピンはrt1176のGPIO_EMC_B1_29です。「axis_ctrl_t」はモーターシャフトに関連する定義です。 * PWM出力パルス -> XBAR信号をトリガー -> パルスの立ち下がりエッジがQTMRの外部クロック入力を駆動 -> * QTMR 32ビットカスケードカウンタが1ずつ減少する -> 0に達すると、QTMR比較割り込みがトリガーされる -> 割り込みにより内部的にPWMがオフになる * 同時に、QTMR はハードウェア障害をトリガーし、PWM の物理出力ピンを直接プルダウンします。.id= AXIS_Y、 。名前= "Y", /* シリアルポートのログ記録またはブレークポイントデバッグでY軸を識別するために使用されます */ /* ================= PWM出力リソース割り当て ================= */ .pwmBase= PWM3、/* Y軸はFlexPWM3モジュールを使用します */ .pwmモジュール= kPWM_Module_0, /* PWM3 のサブモジュール 0 を使用します (各 PWM には 0 から 3 までの 4 つのサブモジュールがあります) */ .pwmChannel= kPWM_PwmA, /* サブモジュール0のフェーズAの出力ピンを使用します。これは物理ピンGPIO_EMC_B1_29に対応します。 */ /* ================= 32 ビット QTMR カスケード カウント リソース割り当て ================= */ .tmrBase= TMR3, /* Y軸はQTMR3ペリフェラル(IRQ割り込み番号TMR3_IRQnに対応します)を使用します */ .lowCh= kQTMR_Channel_0, /* 16ビットローカウンタ:TMR3のチャンネル0を使用します */ .highCh= kQTMR_Channel_1,/* 16ビットハイカウンタ:TMR3のチャンネル1を使用 */ /* 👉 .lowCh と .highChこれらはペアになっており、ハードウェアレベルでは自動的に32ビットカウンタに結合されます。 /* ================= ハードウェアカスケードクロックソースの構成 (コアクリティカル) ================= */ .tmrInputsrc=kQTMR_ClockCounter0InputPin, /* チャンネル0のクロックソース:「外部ピン入力0」に設定。 XBAR構成では、PWM3からのパルスの落ち降り縁がXBARを介してTMR3のチャネル0の入力ピンに接続されます。 したがって、PWMでパルスが出力されるたびに、チャンネル0(16ビット)は一度だけ減衰操作を行います。*/ .cascadePcs = 4U, /* 高16ビットチャネル(チャネル1)のクロックソース(PCS)の設定。 i.MX RTのQTMRレジスタにおけるPCS値は以下の通りに対応します。 0-3 = 外部ピン入力; 4 = チャネル0のオーバーフロー/終了イベント; 5 = チャネル1のオーバーフロー/終了イベント; 6 = チャネル2のオーバーフロー/終了イベント; 7 = チャネル3のオーバーフロー/終了イベント。 ここでは4Uとして構成されており、つまり「TMR3のチャネル1」が「TMR3のチャネル0のオーバーフローイベント」を監視することを意味します。 HARD_PWM_LOW_START_PHASE_ENABLE と HARD_PWM_STATE_GUARD_ENABLE が有効になっています。APP_PWM_Unmap_Selected_Fault 機能:現在の軸に対応する故障ピンマッピングを削除します。障害を無効にするには、基となる PWM_SetupFaultDisableMap 関数を呼び出します。その目的は、ハードウェア障害が不要な場合に、偶発的な外部干渉によってPWMがオフになるのを防ぎ、根本的なデバッグプロセスを容易にすることです。 APP_PWM_ClearFault(元のコード関数) 機能:PWMモジュールの障害状態フラグ(axis->pwmBase->FSTS)をクリアします。ハードウェア故障が発生した後は、PWMの再起動を許可する前にまずこのフラグをクリアしなければなりません。 APP_PWM_出力無効化 機能: PWMタイマーを即座に停止し、ピンの出力を強制的に低レベル(PWM_SetPwmForceOutputToZero)にし、出力を有効にします。この目的は、ピンがモーター起動前に浮かんだりデフォルト状態に置かれたりして高レベルを出力し、モーターが不規則に動くのを防ぐことです。 APP_QTMR_Disable_Low_OFLAG_Output 機能:QTMRのOFLAG(ステータスフラグ)出力を無効にし、OFLAGを低レベルに強制的に設定します。XBARハードウェアと連携して、その役割はQTMR出力からPWMフォルトピンへの経路を遮断し、起動前にフォルトが誤ってトリガーされるのを防ぐことです。 APP_StateGuard_Reset 機能:国家警備隊(番犬)のカウンターと旗をクリアします。この関数は、HARD_PWM_STATE_GUARD_ENABLEが有効になっている場合に、長時間パルス変化がない状態やデッドロックが発生した場合に、システムを停止または再起動する前にこれらの保護変数をリセットするために使用されます。 APP_PWM_SelectPrescaler_FromPeriodCnt400M 機能:これは周波数計算の非常に重要な基本機能です。これは、High + Lowの合計400MHzカウント値を受け取り、16ビットPWMレジスタに収まるように設定すべきプリスケーラ(PRSC)とPWM周期(PERIOD)の数を計算します。ご注意ください:計算された周期が65535を超え、かつ除算係数が範囲外の場合、この関数はfalseを返し、モーターの起動に失敗します。 APP_PwmModuleMask 機能:PWMサブモジュールのインデックス番号(例えば、値が0のkPWM_Module_0)を、Nビット左シフトしたビットマスクに変換します。NXPのPWMレジスタの多く(OUTEN、MCTRLなど)はビット単位で制御されます。この関数は、正しいバイナリマスクを生成する役割を担っています。 Re: RT1176 PWM startup failed 原因を突き止めました。これは、cm4コア内のPIT割り込みの内部負荷が大きすぎるため、cm7コアのPWM動作に影響を与えているためです。PIT割り込みの負荷を軽減したところ、PWM起動時の不具合が解消しました。
查看全文
マネージャー:FS32K144UAT0VLLTのVREFHを誤った電源に接続した場合、どのような問題が発生しますか? FS32K144UAT0VLLTは、VDDとVDDAに3.3V、ADサンプリングに5Vの電源を使用します。VREFHが5V電源に誤って接続されているため、以下の問題が発生します。 1. VREFHの電圧はVDDAの電圧よりも低くなければなりません。VREFに5Vを供給した場合、測定電圧は3.3Vから約4.18Vに上昇します。 2. 3.3V電源を取り外し、5V電源のみを残した場合、3.3V電源の電圧は約4.18Vと測定されます。これは、FS32K144UAT0VLLTのVREFHが5V電源を3.3V電源と直列に接続しているためでしょうか? 3. FS32K144UAT0VLLTのVDDとVDDAを5V電源に変更し、元のMC14504BDRGレベル変換チップを3.3Vから5Vへのレベル変換に使用している場合、それを5Vレベル変換に変更することは可能でしょうか?回路基板は既にハンダ付け済みです。 ありがとう! Re: 经理:FS32K144UAT0VLLT的VREFH接错电源会出现什么问题? こんにちは@ YF666666 S32K1xxマイクロコントローラ向けハードウェア設計ガイドライン、改訂版5、2021年3月 図3. S32K14x – 100LQFPおよび100BGAパッケージの電源ピンとドメイン FS32K144UAT0VLLT の電源設計は上の図を参照しており、チップの外部電圧は VDD + 0.3 V を超える必要はありません。 「当初は電圧レベル変換チップ MC14504BDRG を使用して 3.3V から 5V 電圧レベルへの変換を行っていましたが、5V 電圧レベルに変更されました。」 尾行の説明はありませんが、不明瞭な変更が加えられています。 MC14504BDRG の出力は VREFH です。当初は 3.3V から 5V に VREFH に供給されていましたが、5V から 5V に変更されましたか? 自己認証が MC14504BDRG にある場合、切り替えの結果は VREFH が VDDA より小さいだけで済みます。
查看全文
S32K344 Mini EVB上でlwIP FreeRTOSを使用したPing応答なしの例 私は、 S32K344 Mini EVBボード上でのイーサネット通信の参考として、 lwip_FreeRTOS_s32k344のサンプルを使用しています。 しかし、PCからボードへのpingに応答がありません。当社では、RTDバージョン5.0.0とNXP TCPIPスタックバージョン2.0.0を使用しています。 この時点で、この例を正しく動作させるために、PHY構成、クロック設定、ピン構成、IPアドレス設定、またはS32K344 Mini EVBに必要な特定の変更など、追加の構成が必要かどうかを把握したいと考えています。 不足しているものや設定ミスがある可能性のある箇所を特定するのにご協力いただけますでしょうか? Re: Ping Not Responding Using lwIP FreeRTOS Example on S32K344 Mini EVB こんにちは、@brunoGT88 さん。 標準のlwipサンプルは、S32K344 mini EVBでは動作しません。必要な変更は、ピン配置とクロック構成のみです。 私の同僚の一人が提供した例を参照してください:例 S32K344 EMAC lwIP FreeRTOS miniEVB S32DS 3.6.1 RTD 6.0.0 。 コミュニティのサンプルでは、ピンとクロックを更新し、IPアドレスを192.168.0.209に変更し、サンプルが実行されていることを示すためにLEDスタックを追加します。 また、UDP_ECHOを有効にし、TCP/IPスタックのシャットダウンのタイムアウトをスキップします。 よろしくお願いします、 ジュリアン
查看全文
Wi-Fi + 蓝牙 Zephyr 演示 本指南的目的是通过使用 FRDM-RW612 结合 Zephyr 资源库中的 Wi-Fi 外壳和蓝牙外设示例的功能,演示 RW61x MCU 利用 Wi-Fi 和蓝牙功能生成示例应用程序的能力。 该演示可通过串行终端控制多项 Wi-Fi 功能,同时还能通过恩智浦的物联网工具箱应用程序测试蓝牙外设的多项 GATT 服务。 环境 用于 Visual Studio Code 的 MCUXpresso。 Zephyr v4.3.0。 Zephyr SDK v0.17.4。 FRDM-RW612。 首先,需要将 Wi-Fi Shell 和蓝牙外设示例导入工作区: 在快速启动面板中选择"从资源库导入示例" 。 选择 Wi-Fi 外壳示例,然后单击"Import" 按钮: 选择蓝牙外设示例,然后单击"Import" 按钮: 将示例导入工作区后,将外设示例主文件中的内容复制到 Wi-Fi shell 示例的主文件中,以便在 Wi-Fi 示例中添加蓝牙功能和所需的初始化。 在此步骤中,您可以覆盖集成项目主文件中的内容,因为它只包含一个空的主结构。 然后从"prj.conf中复制配置"外围示例的文件到"prj.conf"文件,以启用蓝牙功能和服务。 重要: 注意 不要删除修改后示例的 prj.conf 文件中的设置,只需添加下面的新设置即可。 按下生成按钮或右键单击 " Build Project " 来构建示例,如下所示: 闪存或调试示例。要闪存它,请右击项目名称并选择"闪存所选目标" ,然后选择"zephyr.elf"锉刀 如果你想调试项目,请点击之前使用的版本按钮旁边的绿色箭头。 刷新项目后,打开串行终端,配置如下: 波特率115200 停止位1 数据8 位 奇偶校验:无 在终端中,重置后应获得以下输出,其中打印了蓝牙和Wi-Fi的初始化日志: 如蓝牙日志所示,集成外设示例开始做广告,要测试此功能,您可以使用恩智浦物联网工具箱 " Heart Rate " 工具,该工具允许与主板配对,如下图所示: 要开始配对,请点击 " 设置 PHY " 框并选择首选 PHY。一旦配对成功,您就可以看到心率指示如图所示增减: 与手机配对后,您可以在串口终端上看到以下日志: 要测试 Wi-Fi 外壳功能,可通过在终端" nxp_wifihelp" 以及" wifihelp" 中编写命令来显示所有 NXP-Wi-Fi 功能,以使用默认 Wi-Fi 功能扫描/连接网络。 要测试与接入点的连接,请执行" wifiscan" 以显示可用网络,确定要加入的网络后,写入" wificonnect..." 并输入加入网络所需的其他属性,然后就会得到类似下面的输出: 请注意,您可以在通过蓝牙与移动应用程序中的心率工具连接的同时执行此操作,这表明 Wi-Fi 和蓝牙连接可以同时工作。
查看全文
MCXN947: CMC0をセキュアな特権モードに割り当てる方法 RMには、これをセキュアかつ特権モードに設定する必要があり、そのためにはAHBSCレジスターを使用できると記載されています。 SRMによると、AHBSCレジスタはCMC0レジスタの特権ステータスに影響を与えないとのことです。 このレジスタのセキュリティレベルを確認/変更するにはどうすればよいですか? MCX N Re: MCXN947: how assign CMC0 to secure privileged mode こんにちは、 @ClarkS さん。 TrustZoneの設定方法に関するトレーニングセッションがあります。こちらをご覧ください。 TrustZoneの設定トレーニング セキュアなアプリケーションと非セキュアなアプリケーションの作成方法、およびセキュアなCortex M33 NXPデバイス上でのデバッグ方法を学びます。   よろしくお願いします。   BR アリス Re: MCXN947: how assign CMC0 to secure privileged mode アリス、ありがとう。この記事のことは知りませんでした。勉強してみます。 Re: MCXN947: how assign CMC0 to secure privileged mode 結局、これは古いプレゼンテーションのスライドを集めたものだった。CMCペリフェラルに関する記述は見当たりませんでした。 スライドを見て、Config Toolsアプリを確認するように思い出したので、最新バージョンをダウンロードしました。Teeツールの検査では、CMC0レジスタは全く見つかりませんでした。 では、この周辺機器、特にSRSレジスタとSSRSレジスタのセキュリティレベルをどのように判断すればよいのでしょうか。 また、RM(リファレンスマニュアル)には、AHBSCレジスタを使用して権限を設定するようにという注記がありますが、これは誤りであると思われるため、RMを更新する必要があるでしょう。 Re: MCXN947: how assign CMC0 to secure privileged mode こんにちは、 @ClarkS さん。 ドキュメントにいくつか不明瞭な点があります。社内チームにエスカレーションしましたので、進捗状況は追ってご連絡いたします。ありがとう。   BR アリス Re: MCXN947: how assign CMC0 to secure privileged mode ありがとう、アリス。期待通り、デフォルトでセキュア/特権モードになっているようです。 SRMをアップデートしていただき、ありがとうございます! Re: MCXN947: how assign CMC0 to secure privileged mode こんにちは、 @ClarkS さん。 ご辛抱いただきありがとうございます。 CMCのアクセス許可はAHBSC AIPS_BRIDGE_GROUP0_MEM_RULE1[1:0]によって管理されています。これは次期のRMバージョンで修正されます。 よろしくお願いします。 BR アリス ありがとう。
查看全文
FreeMASTER S32K344-WB用のSimulinkモデルを作成し、LEDを1秒ごとに点滅させるようにしました。その後、ELFファイルをFreeMASTERにインポートし、J-Linkを介して波形を監視しました。しかし、 「Go」をクリックした後、FreeMASTERオシロスコープの信号レベルは平坦な線のままで、変化しませんでした。基板上の物理的なリセットボタンを押すと、LEDは正常に点滅し始めたが、FreeMASTERの波形表示は一時停止した。MCUがLEDを連続的に点滅させながら正常に動作している状態で、FreeMASTERオシロスコープで波形を観測するには、どのように設定すればよいでしょうか?
查看全文
マルチサンプルフレームバッファからマルチサンプルEGLサーフェスへのブリッティングを実行する際に、GL_INVALID_OPERATIONエラーが発生します。 こんにちは、 私はI.MX8QM評価ボードでOpenGL ESを使用してマルチサンプルフレームバッファからマルチサンプルEGLサーフェスへのブリッティングを行っていますが、「 GL_INVALID_OPERATION 」というエラーが発生します。以下は私が実行した手順です。 マルチサンプルレンダーバッファがアタッチされたFrameBufferObjectが作成されました glRenderbufferStorageMultisample (GL_RENDERBUFFER, 4, GL_RGBA8, width, height); を呼び出し、FBO に描画します。 glBlitFramebufferを使用してFBOからDefault Framebufferにレンダリングする場合、 EGLウィンドウサーフェスが属性付きで作成されるとGL_INVALID_OPERATIONエラーが発生します。 EGL_SAMPLES = 4 EGL_RED_SIZE = 8 EGL_GREEN_SIZE = 8 EGL_BLUE_SIZE = 8 EGL_ALPHA_SIZE = 8 EGL_SAMPLES = 0で EGL サーフェスが作成されると、 glBlitFramebuffer はデフォルトのフレームバッファに正しく描画します。 注: glBlitFramebufferでは、ソース矩形とデスティネーション矩形のサイズは完全に同じです。 Re: GL_INVALID_OPERATION error, when doing multisample framebuffer to multisample EGL Surface blitti こんにちは、 OpenGL ES では、このような使用例は禁止されています。マルチサンプル バッファからマルチサンプル バッファへの解決 (blit) はできません。 ドキュメントに記載されているとおり: https://registry.khronos.org/OpenGL-Refpages/es3.0/html/glBlitFramebuffer.xhtml 描画バッファのGL_SAMPLE_BUFFERSの値がゼロより大きい場合、GL_INVALID_OPERATIONが生成されます。 よろしくお願いいたします。 アルド。
查看全文
PCF85063TP/1Z RTC 中的时间漂移 我们在温度记录仪产品中使用 PCF85063TP/1Z RTC,用于在温度数据记录期间保持时间戳。在测试期间,我们观察到多个电路板上的时间偏移问题,其中每个电路板随时间推移显示出不同的偏移量。 在当前的硬件设计中,我们使用的是 12.5 pF 负载电容晶体。在此基础上,我们更新了 RTC 寄存器的设置,将 CAP_SEL 位配置为 "1",以满足晶体负载电容要求。 更改配置后,我们在实时运行中仍能观察到大约 2 秒钟的漂移。 我们想了解 PCF85063TP/1Z 是否会出现这种程度的漂移。 是否有建议的寄存器配置或校准方法来提高 RTC 的精度。 PCB 布局、晶体选择或其他硬件考虑因素是否会导致观察到的板之间的差异。 请就如何在此应用中提高 RTC 计时精度提出建议和指导。 Re: Time Drift in PCF85063TP/1Z RTC 你好 请参阅应用笔记 AN11247 使用外部温度传感器使用 PCF85063、PCF8523 和 PCF2123 提高计时精度 希望对您有所帮助!
查看全文
PCF2131 MBF可靠性报告 我使用的是 PCF2131 RTC I2C 集成电路,我们需要它在 50C 温度条件下的可靠性报告和 MTBF 数据。 RTC Re: PCF2131 RELIABILITY REPORT FOR MTBF 您好, 为了获取所需的 FIT/MTBF 数据,请创建 标准票据。 谢谢您! BRs, Tomas
查看全文