Multi Source Translation Content

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

Multi Source Translation Content

ディスカッション

ソート順:
TFC 2015全球锦标赛规则 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 这是 2015 年飞思卡尔杯全球挑战赛规则。决赛将于2015年9月14日至15日在德国埃尔兰根举行。 除非大学项目协调员针对您所在的特定地区修改规则,否则所有挑战都将采用全球规则。 规则 V6 更新:强调比赛期间不允许进行无线连接。技术检查前必须移除所有无线连接模块 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 这是 2015 年飞思卡尔杯全球挑战赛规则。决赛将于2015年9月14日至15日在德国埃尔兰根举行。 除非大学项目协调员针对您所在的特定地区修改规则,否则所有挑战都将采用全球规则。 规则 V6 更新:强调比赛期间不允许进行无线连接。技术检查前必须移除所有无线连接模块 飞思卡尔杯内容 回复:TFC 2015 全球锦标赛规则 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 各位组织者大家好, 关于规则,我们有两个问题: 问题 1 关于第 1 部分机械规则: 1.必须使用原始且未经改动的设备作为参赛作品。 a. 外轮胎胎面和轮辋。 是否允许像下图所示那样打磨/刮削轮胎胎面? 问题 2 关于第 1 节电气点 3 中的规则: 高压电机控制和接口需要使用飞思卡尔技术。 使用的电机驱动芯片数量有限制吗? 谢谢。 期待您的回复。 回复:TFC 2015 全球锦标赛规则 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 你好,约书亚, 越过界线不会受到惩罚。唯一的处罚是当赛车超过 2 个车轮脱离赛道时。 这意味着:如果两个车轮出轨,车辆可以继续当前圈。但如果三个车轮出轨,车辆将被判定为出轨。处罚:不记录圈数。 您可以在第 7 部分检查这一点。 回复:TFC 2015 全球锦标赛规则 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 如果汽车在行驶过程中触及线路,这是否算失败?触线和越线有区别吗? 我目前已报名参加 RIT 地区比赛,该赛事的开始时间已经确定了吗? 谢谢!
記事全体を表示
Session 2 - LinuxUserKernelEmbedded.pptx
記事全体を表示
培训:MCUXpresso for VS Code 演练 本视频系列展示了快速入门的步骤。 这是一段视频演练,旨在帮助可视化“适用于 VS Code 的 MCUXpresso 安装步骤”中详述的步骤。 第 1 部分:MCUXpresso for Visual Studio Code 恩智浦使开发人员能够更轻松地在 Visual Studio Code 中使用恩智浦微控制器。用户可以在 www.nxp.com/vscode 上获取恩智浦支持的高级概览。 您将需要以下软件: MCUXpresso 安装程序(Win;MacOS;Linux) Microsoft Visual Studio Code下载 (在 “我的视频” 中查看) 第 2 部分:MCUXpresso 安装程序准备的内容 为什么您需要使用MCUXpresso安装程序?在 Visual Studio Code 中进行嵌入式开发需要许多必备的工具。该程序会安装所需的工具,因此用户无需了解复杂的依赖关系即可配置不同的环境。 (在 “我的视频” 中查看) 第 3 部分:添加 MCUXpresso for VS Code 扩展 恩智浦扩展最终将通过访问 Visual Studio Code 中的扩展市场进行安装。 截至 2023 年 7 月正式发布前,该扩展程序可通过以下方式手动添加:点击扩展程序搜索栏右侧的省略号,然后在弹出的菜单中选择“添加扩展程序”。   您将需要最新的扩展程序。 下载:mcuxpresso-0.5.60.vsix (在 “我的视频” 中查看) 第 4 部分:回顾 MCUXpresso 视角 恩智浦扩展为 Visual Studio Code 让您能够轻松查看必要的信息、资源和工具。 (在 “我的视频” 中查看) 第 5 部分:添加软件仓库/SDK NXP 扩展提供了一种工具,可以从热门来源导入软件存储库。开发人员可以从远程存储库、NXP 存档文件或现有的本地存储库中导入。 (在 “我的视频” 中查看) 第 6 部分:导入第一个项目 恩智浦扩展提供了一个项目导入工具。 快速且简单地浏览可用项目并将其添加到当前工作区。 用户可以从资源库或现有的本地项目中导入。 (在 “我的视频” 中查看) 第 7 部分:在 VS Code 中构建项目 恩智浦安装程序和扩展程序为您的平台准备工具链。 完成安装程序和扩展程序后,恩智浦项目应能正常构建。 (在 “我的视频” 中查看) 第 8 部分:启动调试会话 恩智浦扩展已添加对通过流行调试探针在 VS Code 中启动默认工具的支持。 Segger J-Link、NXP LinkServer 和 PE Micro 调试探针已识别并配置。调试会话启动,用户能够分析他们的项目。 (在 “我的视频” 中查看) 文档 VS Code Re: Training: Walkthrough of MCUXpresso for VS Code 您好,我在使用 vscode 的此插件时遇到了问题。第一张图片是我的配置项目的屏幕截图,第二张图片是我在构建时报告的错误。 vae_1-1717051169546.png vae_0-1717051074103.png Re: 培训:MCUXpresso for VS Code 的演练 @sourabhmoitra 很高兴听到您已经顺利推进工作。我们还发现,路径中包含空格会导致问题。团队正致力于在用户使用工具选择会引发这些错误的目录时,向用户发出警告。 Re: 培训:MCUXpresso for VS Code 的演练 感谢 @kyledando 的建议。更改 Git 文件夹对我来说确实奏效,但奇怪的是,我无法选择目录层级超过三级的 Git 文件夹(例如 C:/folder1/folder2/folder3)。我猜这可能是由于 Python/West 的路径长度限制(某些 Windows 机器会有这个问题……)。再次感谢您的建议。 Re: 培训:MCUXpresso for VS Code 的演练 @sourabhmoitra 您尝试过将项目放在其他磁盘位置吗?我在旧的 git 文件夹上遇到了类似的 West 错误。我将文件移动到了新的文件夹位置,那个错误就消失了。 我已提交工单,以解决旧 Git 文件夹在使用 west 命令时出错的原因。不过,当我选择另一个文件夹(C:/mcux-sdk)以避免任何文件夹路径问题时,可以通过向导成功导入 mcux-sdk。 Re: 培训:MCUXpresso for VS Code 的演练 做得非常好! 视频清晰、简短且信息丰富。 此次扩展将成为我们发展的重要资产。 Re: 培训:MCUXpresso for VS Code 的演练 干得漂亮!让我及时掌握情况!
記事全体を表示
RT600 4 I2S input to 1 TDM output solution 1. Abstract This article aims to implement the simultaneous input of 4 groups of 48Khz 32bit 2ch audio data on the RT685 platform, and then assemble the received data into a 48Khz 32bit 8ch audio and output it through I2S. This solution is also done at the request of customers, because there are always harmonic problems when customers make it. After analyzing the customer's situation, it is found that the customer has two main problems: (1) Harmonic problem: After receiving 4 channels of 8 bytes, it is directly copied to the sending buffer. This will cause timing problems. It does not take into account the problem of buffering data in the audio data storage pool. The time required to receive enough audio data is at least greater than the time required for copying and sending. Therefore, the problem is reflected in the problem that the customer found harmonic problems when testing the output audio waveform. (2) Audio synchronization problem: After the customer received 4 channels of audio data, he tested the receiving buffer and found that the 4 channels of data were out of sync. Therefore, in order to help customers, I helped customers make this application demo directly, and made a matching test audio source to send a set of 48Khz sampling rate 32bit dual-channel, fixed increment audio data in a loop, such as 0X00-0XFF in a loop. The following is the block diagram of this application platform:   1.jpg Figure 1 System Block Diagram In the above figure, a MIMXRT685-EVK implements the function of outputting 48Khz, 32bit*2ch, and sends data in a loop: 0X00, 0X01….0XFF. Another MIMXRT685-EVK is the focus of this article, which implements 4 groups of I2S to receive data at a sampling rate of 48khz and 32bit*2ch, and then assembles the received data into audio data with a sampling rate of 48Khz and 32bit*8ch and sends it out. In the above figure, in order to reduce the connection of external lines, for BCLK and WS signals, only one group is directly connected to I2S3, and the other I2S2, I2S4, and I2S5 share the I2S3 signal internally. Then, for DATA data, a line is made externally with 4 heads, and connected to the data pins of each group of audio interfaces respectively. The following is a detailed description of this solution. 2. Hardware platform establish The pinouts of the two boards are given below. Because the platform uses many pins, specific allocation is required. 2.1 Audio source board A MIMXRT685-EVK is used as an audio source, and the pinouts for sending 48Khz 32bit*2ch are as follows:   2.jpg Figure 2 Pinout of audio source board 2.2 Audio transceiver board Another MIMXRT685-EVK is used as an audio transceiver board to receive 4-channel audio synchronization data sent by the audio source and assemble it into a 48Khz 32bit*8ch waveform for transmission.   3.jpg Figure 3 Pin assignment of audio transceiver board 2.3 Dual-board hardware connection The source and target connections of the two boards are as follows:   4.jpg Figure 4 Two board pin connection   5.jpg Figure 5 two board connection After the hardware is ready, the software solution and code are provided. 3. Software solution and software implementation In the process of writing the code, we tried many solutions, such as: (1) When receiving, directly assemble it into the TDM format buffer to be sent, and then send it. However, since it is assembled into TDM, one I2S needs to receive 8 byte per frame, and then do the offset to receive the next one. If the reception is carried out according to the 8-byte DMA, the callback of the 4 groups of I2S will enter frequently, resulting in a large CPU load, so this solution is abandoned. (2) The 4 groups of I2S are connected to each other, and the 10ms buffer is connected, and then the DMA method is used to copy from memory to memory. However, since the DMA of RT685 is relatively weak, it can only achieve a maximum offset of 32bit 4word=16byte, that is, a 16-byte offset. However, in fact, a group of audio data is 32bit*2, and 4 groups are 32bit*8=32byte offset, so DMA cannot meet the requirements. Therefore, the DMA memory-to-memory copy solution is abandoned and memcpy is used instead. (3) Use the I2S_RxTransferReceiveDMA function to perform DMA reception. However, in fact, when one group is called, it starts receiving directly, and waits until the next group of I2S interfaces calls I2S_RxTransferReceiveDMA. This has caused an asynchronous situation. Even if the I2S enable is turned off in I2S_RxTransferReceiveDMA, the 4th group of I2S is enabled after the several groups of I2S of I2S_RxTransferReceiveDMA are called. This method can only achieve the synchronization of the reception of the first group of data, because later, it is necessary to go to the callback to re-trigger the reception of the second frame of data. Therefore, the callback of the 4 groups of I2S calls I2S_RxTransferReceiveDMA, which will inevitably cause new synchronization problems. Therefore, this method is abandoned and it is considered to use two groups of DMA descriptors to do ping-pong. In this way, the reception will continue in a loop without the intervention of CPU code. 3.1 Solution Implementation Several solutions have been described above. Finally, we choose to use 4 audio channels to receive audio data and cache 10ms audio data buffer. The conversion from receiving buffer to sending buffer adopts memcpy method, and test whether this copy time can meet the actual needs, to ensure that the buffer pool of receiving buffer is greater than this copy time, which is enough to prepare the sending buffer. The solution for receiving data transfer is as follows:   6.jpg Figure 6 Data buffer transfer The above is 4 groups of I2S receiving their own 10ms data respectively. The buffer is actually prepared for 20ms. A single DMA receives a frame for 10ms, and the other 10ms is used for pingpong buffer. The sending buffer is used to copy the received 4 groups of I2S buffers into a 32bit*8ch array in TDM format, and then two groups of ping-pong buffers are also made. In fact, it is to cache 10ms data. The buffer prepares two groups of 10ms. When the first 10ms frame is received, the second buffer is used to receive it. At the same time, the data of the first buffer is copied to the first buffer of the sending buffer, and the first buffer is used for sending. After the sending is completed, it is transferred to the second buffer to receive and send. In this way, as long as the time is controlled well, there will be no data error problem. The data volume of 10ms is 3840Byte, because the receiving frequency is 48Khz, that is, there are 48000 frames in 1s, and each frame is 32bit*2=8Byte, then 10ms=>4800*8Byte=38400Byte. 3.2 Software code implementation The software code implementation part is mainly divided into 4 I2S receiving signal sharing, I2S DMA pingpong configuration, data transfer, sending I2S and other parts. The details are given below 3.2.1 4-way I2S receiving From the above, we can know that the 4 I2S receiving signal is not completely connected with wires, but adopts the method of sharing BCLK and WS signals and receiving DATA separately. I2S2, I2S4, I2S5 share the BCLK of I2S3, and the WS code is as follows: /* Set shared signal set 0: SCK, WS from Flexcomm1 */ I2S_BRIDGE_SetShareSignalSrc(kI2S_BRIDGE_ShareSet0, kI2S_BRIDGE_SignalSCK, kI2S_BRIDGE_Flexcomm3); I2S_BRIDGE_SetShareSignalSrc(kI2S_BRIDGE_ShareSet0, kI2S_BRIDGE_SignalWS, kI2S_BRIDGE_Flexcomm3); /* Set flexcomm3 SCK, WS from shared signal set 0 */ I2S_BRIDGE_SetFlexcommSignalShareSet(kI2S_BRIDGE_Flexcomm2, kI2S_BRIDGE_SignalSCK, kI2S_BRIDGE_ShareSet0); I2S_BRIDGE_SetFlexcommSignalShareSet(kI2S_BRIDGE_Flexcomm2, kI2S_BRIDGE_SignalWS, kI2S_BRIDGE_ShareSet0); I2S_BRIDGE_SetFlexcommSignalShareSet(kI2S_BRIDGE_Flexcomm4, kI2S_BRIDGE_SignalSCK, kI2S_BRIDGE_ShareSet0); I2S_BRIDGE_SetFlexcommSignalShareSet(kI2S_BRIDGE_Flexcomm4, kI2S_BRIDGE_SignalWS, kI2S_BRIDGE_ShareSet0); I2S_BRIDGE_SetFlexcommSignalShareSet(kI2S_BRIDGE_Flexcomm5, kI2S_BRIDGE_SignalSCK, kI2S_BRIDGE_ShareSet0); I2S_BRIDGE_SetFlexcommSignalShareSet(kI2S_BRIDGE_Flexcomm5, kI2S_BRIDGE_SignalWS, kI2S_BRIDGE_ShareSet0); 3.2.2 I2S DMA pingpong configuration In order to achieve 4-channel audio synchronization and receive 10ms audio buffer, two I2S DMA descriptors are used to implement the ping-pong function to collect data to two ping-pong buffers in turn. The code is as follows: #define I2S_BUFFER_SIZE 3840 //10ms SDK_ALIGN(static dma_descriptor_t I2S2_s_rxDmaDescriptors[2U], FSL_FEATURE_DMA_LINK_DESCRIPTOR_ALIGN_SIZE); SDK_ALIGN(static dma_descriptor_t I2S3_s_rxDmaDescriptors[2U], FSL_FEATURE_DMA_LINK_DESCRIPTOR_ALIGN_SIZE); SDK_ALIGN(static dma_descriptor_t I2S4_s_rxDmaDescriptors[2U], FSL_FEATURE_DMA_LINK_DESCRIPTOR_ALIGN_SIZE); SDK_ALIGN(static dma_descriptor_t I2S5_s_rxDmaDescriptors[2U], FSL_FEATURE_DMA_LINK_DESCRIPTOR_ALIGN_SIZE); SDK_ALIGN(static uint8_t I2S2_s_Buffer[2][I2S_BUFFER_SIZE], sizeof(uint32_t)); SDK_ALIGN(static uint8_t I2S3_s_Buffer[2][I2S_BUFFER_SIZE], sizeof(uint32_t)); SDK_ALIGN(static uint8_t I2S4_s_Buffer[2][I2S_BUFFER_SIZE], sizeof(uint32_t)); SDK_ALIGN(static uint8_t I2S5_s_Buffer[2][I2S_BUFFER_SIZE], sizeof(uint32_t)); static i2s_transfer_t I2S2_s_RxTransfer[2] = {{ .data = I2S2_s_Buffer[0], .dataSize = I2S_BUFFER_SIZE, }, { .data = I2S2_s_Buffer[1], .dataSize = I2S_BUFFER_SIZE, }}; static i2s_transfer_t I2S3_s_RxTransfer[2] = {{ .data = I2S3_s_Buffer[0], .dataSize = I2S_BUFFER_SIZE, }, { .data = I2S3_s_Buffer[1], .dataSize = I2S_BUFFER_SIZE, }}; static i2s_transfer_t I2S4_s_RxTransfer[2] = {{ .data = I2S4_s_Buffer[0], .dataSize = I2S_BUFFER_SIZE, }, { .data = I2S4_s_Buffer[1], .dataSize = I2S_BUFFER_SIZE, }}; static i2s_transfer_t I2S5_s_RxTransfer[2] = {{ .data = I2S5_s_Buffer[0], .dataSize = I2S_BUFFER_SIZE, }, { .data = I2S5_s_Buffer[1], .dataSize = I2S_BUFFER_SIZE, }}; I2S_RxGetDefaultConfig(&I2S2_s_RxConfig); I2S2_s_RxConfig.divider = DEMO_I2S_CLOCK_DIVIDER; I2S2_s_RxConfig.masterSlave = DEMO_I2S_TX_MODE;//DEMO_I2S_RX_MODE I2S_RxInit(DEMO_I2S2_RX, &I2S2_s_RxConfig); I2S_RxGetDefaultConfig(&I2S3_s_RxConfig); I2S3_s_RxConfig.divider = DEMO_I2S_CLOCK_DIVIDER; I2S3_s_RxConfig.masterSlave = DEMO_I2S_TX_MODE;//DEMO_I2S_RX_MODE I2S_RxInit(DEMO_I2S3_RX, &I2S3_s_RxConfig); I2S_RxGetDefaultConfig(&I2S4_s_RxConfig); I2S4_s_RxConfig.divider = DEMO_I2S_CLOCK_DIVIDER; I2S4_s_RxConfig.masterSlave = DEMO_I2S_TX_MODE;//DEMO_I2S_RX_MODE I2S_RxInit(DEMO_I2S4_RX, &I2S4_s_RxConfig); I2S_RxGetDefaultConfig(&I2S5_s_RxConfig); I2S5_s_RxConfig.divider = DEMO_I2S_CLOCK_DIVIDER; I2S5_s_RxConfig.masterSlave = DEMO_I2S_TX_MODE;//DEMO_I2S_RX_MODE I2S_RxInit(DEMO_I2S5_RX, &I2S5_s_RxConfig); DMA_Init(DEMO_DMA); DMA_EnableChannel(DEMO_DMA, DEMO_I2S2_RX_CHANNEL); DMA_SetChannelPriority(DEMO_DMA, DEMO_I2S2_RX_CHANNEL, kDMA_ChannelPriority1); DMA_CreateHandle(&I2S2_s_DmaRxHandle, DEMO_DMA, DEMO_I2S2_RX_CHANNEL); I2S_RxTransferCreateHandleDMA(DEMO_I2S2_RX, &I2S2_s_RxHandle, &I2S2_s_DmaRxHandle, I2S2_RxCallback, (void *)&I2S2_s_RxTransfer); DMA_EnableChannel(DEMO_DMA, DEMO_I2S3_RX_CHANNEL); DMA_SetChannelPriority(DEMO_DMA, DEMO_I2S3_RX_CHANNEL, kDMA_ChannelPriority1); DMA_CreateHandle(&I2S3_s_DmaRxHandle, DEMO_DMA, DEMO_I2S3_RX_CHANNEL); I2S_RxTransferCreateHandleDMA(DEMO_I2S3_RX, &I2S3_s_RxHandle, &I2S3_s_DmaRxHandle, I2S3_RxCallback, (void *)&I2S3_s_RxTransfer); DMA_EnableChannel(DEMO_DMA, DEMO_I2S4_RX_CHANNEL); DMA_SetChannelPriority(DEMO_DMA, DEMO_I2S4_RX_CHANNEL, kDMA_ChannelPriority1); DMA_CreateHandle(&I2S4_s_DmaRxHandle, DEMO_DMA, DEMO_I2S4_RX_CHANNEL); I2S_RxTransferCreateHandleDMA(DEMO_I2S4_RX, &I2S4_s_RxHandle, &I2S4_s_DmaRxHandle, I2S4_RxCallback, (void *)&I2S4_s_RxTransfer); DMA_EnableChannel(DEMO_DMA, DEMO_I2S5_RX_CHANNEL); DMA_SetChannelPriority(DEMO_DMA, DEMO_I2S5_RX_CHANNEL, kDMA_ChannelPriority2); DMA_CreateHandle(&I2S5_s_DmaRxHandle, DEMO_DMA, DEMO_I2S5_RX_CHANNEL); I2S_RxTransferCreateHandleDMA(DEMO_I2S5_RX, &I2S5_s_RxHandle, &I2S5_s_DmaRxHandle, I2S5_RxCallback, (void *)&I2S5_s_RxTransfer); I2S_TransferInstallLoopDMADescriptorMemory(&I2S2_s_RxHandle, I2S2_s_rxDmaDescriptors, 2U); I2S_TransferInstallLoopDMADescriptorMemory(&I2S3_s_RxHandle, I2S3_s_rxDmaDescriptors, 2U); I2S_TransferInstallLoopDMADescriptorMemory(&I2S4_s_RxHandle, I2S4_s_rxDmaDescriptors, 2U); I2S_TransferInstallLoopDMADescriptorMemory(&I2S5_s_RxHandle, I2S5_s_rxDmaDescriptors, 2U); if (I2S_TransferReceiveLoopDMA(DEMO_I2S2_RX, &I2S2_s_RxHandle, &I2S2_s_RxTransfer[0], 2U) != kStatus_Success) { assert(false); } if (I2S_TransferReceiveLoopDMA(DEMO_I2S3_RX, &I2S3_s_RxHandle, &I2S3_s_RxTransfer[0], 2U) != kStatus_Success) { assert(false); } if (I2S_TransferReceiveLoopDMA(DEMO_I2S4_RX, &I2S4_s_RxHandle, &I2S4_s_RxTransfer[0], 2U) != kStatus_Success) { assert(false); } if (I2S_TransferReceiveLoopDMA(DEMO_I2S5_RX, &I2S5_s_RxHandle, &I2S5_s_RxTransfer[0], 2U) != kStatus_Success) { assert(false); } I2S_Enable(DEMO_I2S2_RX); I2S_Enable(DEMO_I2S3_RX); I2S_Enable(DEMO_I2S4_RX); I2S_Enable(DEMO_I2S5_RX); Here, the code has been modified, mainly the I2S_TransferLoopDMA function in fsl_i2s_dma.c, which is blocked: I2S_Enable(base); In order to realize the function of 4-channel synchronous reception. 3.2.3 Audio data received and transferred Because when receiving, each audio interface takes turns to receive its own 2ch data, but when sending, it is necessary to send 4-channel received audio dual-channel data, that is, 32bit*8ch data, so after receiving ping, the ping data needs to be transferred to the sending ping buffer. The code for transfer is as follows: #define I2S_BUFFER_SIZE 3840 //10ms SDK_ALIGN(static uint8_t I2S2_s_Buffer[2][I2S_BUFFER_SIZE], sizeof(uint32_t)); SDK_ALIGN(static uint8_t I2S3_s_Buffer[2][I2S_BUFFER_SIZE], sizeof(uint32_t)); SDK_ALIGN(static uint8_t I2S4_s_Buffer[2][I2S_BUFFER_SIZE], sizeof(uint32_t)); SDK_ALIGN(static uint8_t I2S5_s_Buffer[2][I2S_BUFFER_SIZE], sizeof(uint32_t)); SDK_ALIGN(static uint8_t I2S1_s_Buffer[2][I2S_BUFFER_SIZE*4], sizeof(uint32_t)); if( s_pingpong == 1) { for(ch = 0;ch < 480; ch++) //480=I2S_BUFFER_SIZE(3840)/8 { memcpy(&I2S1_s_Buffer[0][0 + (32*ch)], &I2S2_s_Buffer[0][8*ch], 8); memcpy(&I2S1_s_Buffer[0][8 + (32*ch)], &I2S3_s_Buffer[0][8*ch], 8); memcpy(&I2S1_s_Buffer[0][16 + (32*ch)], &I2S4_s_Buffer[0][8*ch], 8); memcpy(&I2S1_s_Buffer[0][24 + (32*ch)], &I2S5_s_Buffer[0][8*ch], 8); } } else { for(ch = 0;ch < 480; ch++) { memcpy(&I2S1_s_Buffer[1][0 + (32*ch)], &I2S2_s_Buffer[1][8*ch], 8); memcpy(&I2S1_s_Buffer[1][8 + (32*ch)], &I2S3_s_Buffer[1][8*ch], 8); memcpy(&I2S1_s_Buffer[1][16 + (32*ch)], &I2S4_s_Buffer[1][8*ch], 8); memcpy(&I2S1_s_Buffer[1][24 + (32*ch)], &I2S5_s_Buffer[1][8*ch], 8); } } 3.2.4 Send TDM audio code The sending code also uses the I2S DMA method, but because there is no need to send multiple channels at the same time, only a single channel, there is no need to consider the synchronization problem, and no DMA descriptor is used. After the sending buffer is ready, the I2S_TxTransferSendDMA method is used. The code is as follows: I2S_TxGetDefaultConfig(&I2S1_s_TxConfig); I2S1_s_TxConfig.divider = DEMO_I2S1_CLOCK_DIVIDER; I2S1_s_TxConfig.masterSlave = kI2S_MasterSlaveNormalMaster; I2S1_s_TxConfig.wsPol = true; I2S1_s_TxConfig.mode = kI2S_ModeDspWsLong;//kI2S_ModeDspWsShort; I2S1_s_TxConfig.dataLength = 32U; I2S1_s_TxConfig.frameLength = 32 * 8U; I2S1_s_TxConfig.position = DEMO_TDM_DATA_START_POSITION; I2S1_s_TxConfig.pack48 = true; I2S_TxInit(DEMO_I2S1_TX, &I2S1_s_TxConfig); I2S_EnableSecondaryChannel(DEMO_I2S1_TX, kI2S_SecondaryChannel1, false, 64 + DEMO_TDM_DATA_START_POSITION); I2S_EnableSecondaryChannel(DEMO_I2S1_TX, kI2S_SecondaryChannel2, false, 128 + DEMO_TDM_DATA_START_POSITION); I2S_EnableSecondaryChannel(DEMO_I2S1_TX, kI2S_SecondaryChannel3, false, 192 + DEMO_TDM_DATA_START_POSITION); DMA_EnableChannel(DEMO_DMA, DEMO_I2S1_TX_CHANNEL); DMA_SetChannelPriority(DEMO_DMA, DEMO_I2S1_TX_CHANNEL, kDMA_ChannelPriority3); DMA_CreateHandle(&I2S1_s_DmaTxHandle, DEMO_DMA, DEMO_I2S1_TX_CHANNEL); I2S_TxTransferCreateHandleDMA(DEMO_I2S1_TX, &I2S1_s_TxHandle, &I2S1_s_DmaTxHandle, I2S1_TxCallback, (void *)&I2S1_s_TxTransfer); if( s_pingpong == 1) { I2S1_s_TxTransfer.data = I2S1_s_Buffer[0]; I2S1_s_TxTransfer.dataSize = I2S_BUFFER_SIZE*4; I2S_TxTransferSendDMA(DEMO_I2S1_TX, &I2S1_s_TxHandle, I2S1_s_TxTransfer); } else { I2S1_s_TxTransfer.data = I2S1_s_Buffer[1]; I2S1_s_TxTransfer.dataSize = I2S_BUFFER_SIZE*4; I2S_TxTransferSendDMA(DEMO_I2S1_TX, &I2S1_s_TxHandle, I2S1_s_TxTransfer); } 3.2.5 Send and receive I2S callback processing For the receiving I2S2, 3, 4, 5, there are 4 channels in total. Each time 10ms of data is received, a callback will be entered. In the callback, you only need to record the flag. When all 4 flags are recorded, it means that the 4 channels of the same 10ms data have been received, and the data can be copied to the sending buffer. Of course, in order to test whether the callback entry frequency is once every 10ms, this article makes a GPIO callback for testing. The following is the code for recording I2S callback static void I2S2_RxCallback(I2S_Type *base, i2s_dma_handle_t *handle, status_t completionStatus, void *userData) { s_allRXTriggerred |= 0x01; } static void I2S3_RxCallback(I2S_Type *base, i2s_dma_handle_t *handle, status_t completionStatus, void *userData) { s_allRXTriggerred |= 0x02; } static void I2S4_RxCallback(I2S_Type *base, i2s_dma_handle_t *handle, status_t completionStatus, void *userData) { s_allRXTriggerred |= 0x04; } static void I2S5_RxCallback(I2S_Type *base, i2s_dma_handle_t *handle, status_t completionStatus, void *userData) { /* Enqueue the same original buffer all over again */ s_allRXTriggerred |= 0x08; GPIO_PortToggle(GPIO, 1, 1<<0); if( s_pingpong == 0) { s_pingpong = 1; } else { s_pingpong = 0; } } static void I2S1_TxCallback(I2S_Type *base, i2s_dma_handle_t *handle, status_t completionStatus, void *userData) { GPIO_PortToggle(GPIO, 1, 1<<8); //__NOP(); } So far, all functions of a MIMXRT685-EVK for 4 I2S reception and 1 I2S TDM transmission have been completed. 3.2.6 Audio source code The audio source is made on another MIMXRT685-EVK to send 48Khz, 32bit*2ch audio data, and the data is sent in a loop from 0X00 to 0XFF. The code is as follows: int main(void) { BOARD_InitBootPins(); BOARD_InitBootClocks(); BOARD_InitDebugConsole(); BOARD_I3C_ReleaseBus(); BOARD_InitI3CPins(); CLOCK_EnableClock(kCLOCK_InputMux); /* attach main clock to I3C (500MHz / 20 = 25MHz). */ CLOCK_AttachClk(kMAIN_CLK_to_I3C_CLK); CLOCK_SetClkDiv(kCLOCK_DivI3cClk, 20); /* attach AUDIO PLL clock to FLEXCOMM1 (I2S1) */ CLOCK_AttachClk(kAUDIO_PLL_to_FLEXCOMM1); /* attach AUDIO PLL clock to FLEXCOMM3 (I2S3) */ CLOCK_AttachClk(kAUDIO_PLL_to_FLEXCOMM3); /* attach AUDIO PLL clock to MCLK */ CLOCK_AttachClk(kAUDIO_PLL_to_MCLK_CLK); CLOCK_SetClkDiv(kCLOCK_DivMclkClk, 1); SYSCTL1->MCLKPINDIR = SYSCTL1_MCLKPINDIR_MCLKPINDIR_MASK; wm8904Config.i2cConfig.codecI2CSourceClock = CLOCK_GetI3cClkFreq(); wm8904Config.mclk_HZ = CLOCK_GetMclkClkFreq(); /* Set shared signal set 0: SCK, WS from Flexcomm1 */ I2S_BRIDGE_SetShareSignalSrc(kI2S_BRIDGE_ShareSet0, kI2S_BRIDGE_SignalSCK, kI2S_BRIDGE_Flexcomm1); I2S_BRIDGE_SetShareSignalSrc(kI2S_BRIDGE_ShareSet0, kI2S_BRIDGE_SignalWS, kI2S_BRIDGE_Flexcomm1); /* Set flexcomm3 SCK, WS from shared signal set 0 */ I2S_BRIDGE_SetFlexcommSignalShareSet(kI2S_BRIDGE_Flexcomm3, kI2S_BRIDGE_SignalSCK, kI2S_BRIDGE_ShareSet0); I2S_BRIDGE_SetFlexcommSignalShareSet(kI2S_BRIDGE_Flexcomm3, kI2S_BRIDGE_SignalWS, kI2S_BRIDGE_ShareSet0); #if 1 PRINTF("Configure codec\r\n"); /* protocol: i2s * sampleRate: 48K * bitwidth:16 */ if (CODEC_Init(&codecHandle, &boardCodecConfig) != kStatus_Success) { PRINTF("codec_Init failed!\r\n"); assert(false); } /* Initial volume kept low for hearing safety. * Adjust it to your needs, 0-100, 0 for mute, 100 for maximum volume. */ if (CODEC_SetVolume(&codecHandle, kCODEC_PlayChannelHeadphoneLeft | kCODEC_PlayChannelHeadphoneRight, DEMO_CODEC_VOLUME) != kStatus_Success) { assert(false); } PRINTF("Configure I2S\r\n"); #endif /* * masterSlave = kI2S_MasterSlaveNormalMaster; * mode = kI2S_ModeI2sClassic; * rightLow = false; * leftJust = false; * pdmData = false; * sckPol = false; * wsPol = false; * divider = 1; * oneChannel = false; * dataLength = 16; * frameLength = 32; * position = 0; * watermark = 4; * txEmptyZero = true; * pack48 = false; */ I2S_TxGetDefaultConfig(&s_TxConfig); s_TxConfig.divider = DEMO_I2S_CLOCK_DIVIDER; s_TxConfig.masterSlave = DEMO_I2S_TX_MODE; I2S_TxInit(DEMO_I2S_TX, &s_TxConfig); DMA_Init(DEMO_DMA); DMA_EnableChannel(DEMO_DMA, DEMO_I2S_TX_CHANNEL); DMA_SetChannelPriority(DEMO_DMA, DEMO_I2S_TX_CHANNEL, kDMA_ChannelPriority3); DMA_CreateHandle(&s_DmaTxHandle, DEMO_DMA, DEMO_I2S_TX_CHANNEL); StartSoundPlayback(); while (1) { } } static void StartSoundPlayback(void) { PRINTF("Setup looping playback of sine wave\r\n"); s_TxTransfer.data = &g_Music[0]; s_TxTransfer.dataSize = sizeof(g_Music); I2S_TxTransferCreateHandleDMA(DEMO_I2S_TX, &s_TxHandle, &s_DmaTxHandle, TxCallback, (void *)&s_TxTransfer); /* need to queue two transmit buffers so when the first one * finishes transfer, the other immediatelly starts */ I2S_TxTransferSendDMA(DEMO_I2S_TX, &s_TxHandle, s_TxTransfer); I2S_TxTransferSendDMA(DEMO_I2S_TX, &s_TxHandle, s_TxTransfer); } static void TxCallback(I2S_Type *base, i2s_dma_handle_t *handle, status_t completionStatus, void *userData) { /* Enqueue the same original buffer all over again */ i2s_transfer_t *transfer = (i2s_transfer_t *)userData; I2S_TxTransferSendDMA(base, handle, *transfer); } Audio data buffer:   7.jpg Figure 7 Audio source sends buffer The corresponding test results are given:   8.jpg Figure 8 Audio source sending data test It can be seen that the data sent by the audio source is cyclical and can be sent in an increasing loop. 4. Test results There are several points to verify about the test results: (1) 4-channel audio receives pingpong buffer, whether a single buffer is 10ms, that is, a 10ms audio data pool. (2) How long is the data memory copy time, whether it will exceed the length of the receiving audio data pool. (3) Whether the received 4-channel data is synchronized, whether the assembled send buffer data is the 32bit*8ch data assembled from the corresponding 4-channel 2ch data. (4) Whether the sent audio waveform is the correct 32bit*8ch TDM data. The following are the verification test results for these points. 4.1 4 I2S audio 10ms data pool This verification is very simple. Define a pin GPIO, initialize the output to 0, and then reverse it in the received callback interrupt. This article chooses to reverse it in the I2S5 callback. The test results are as follows:   9.jpg Figure 9 ch1 10ms duration Channel 1 is the exact 10ms because of the callback reversal received. Here is a general picture of the test:   10.jpg Figure 10 Time test overview Ch1: I2S5 callback entry frequency Ch2: memory copy time Ch3: Send callback entry frequency It can be seen that the frequency of sending and receiving is 10ms, because the sending frequency is also 48Khz, but because it is 8ch, the data volume is 4 times that of receiving, and all the data of the 4 receiving channels need to be stuffed in. 4.2 Time consumption of receiving and copying to sending buffer For data copying, that is, assembling the data received from 4 I2S channels into 4 buffers into the sending buffer, this time test is on the second channel of the oscilloscope, and the results are as follows:   11.jpg Figure 11 copy data time It can be seen that the copying time is less than 500us, which is much shorter than the 10ms of the audio receiving data pool. Therefore, you can use memcpy casually without worrying about the copying time being too long. This also makes up for the regret that I wanted to use DMA for memory to memory copying before, but it could not be realized due to DMA performance issues. 4.3 Verification of the synchronization of the data received on the 4 I2S In order to verify the synchronization, this article closes the 4 I2S receiving channel after receiving 100times 10ms, and prints out the corresponding 4 I2S audio receiving buffer. The results of the 4 I2S buffer are as follows:   12.jpg Figure12 I2S2 receive buffer   13.jpg Figure 13 I2S3 receive buffer   14.jpg Figure 14 I2S4 receive buffer   15.jpg Figure 15 I2S5 receive buffer It can be seen that the receive buffer data of the 4 I2S are completely synchronized, and all start from 0XB8. 4.4 Send buffer corresponding to 4-channel audio TDM The send buffer is printed after 100 receptions, and then memcpy is performed to the send buffer, and the printout of the send buffer data is as follows:   16.jpg Figure 16 I2S1 transfer buffer It can be seen that the buffer also starts from 0XB8, and the 4 groups of received data are copied to the send buffer and assembled into 32bit*8ch data. It can be seen that the TDM send buffer is also correct. 4.5 Sending 48Khz 32bit 8ch audio data waveform   17.jpg Figure 17 Transmitting and receiving audio waveforms The upper group is the waveform of the audio source, and the lower group is the waveform of TDM transmission. Due to the limitation of the analysis software of the logic analyzer, it can only analyze 2ch 64bit data at most, so only part of the data can be seen here, but from the waveform, it can be seen that the waveform of sending TDM can achieve 32bit*8ch, and every 8byte data in a frame is the same, which also explains the synchronization of 4-channel audio reception. In the above figure, the data of ch2 is actually 00, 01, 02, 03, 04, 05, 06, 07, 4 groups of the same data in one frame, and the waveform can also be seen that there are 4 groups of the same data, and 4 groups of 2ch are enough to form 32bit 8ch TDM. Finally, here is another TDM waveform tested on the oscilloscope:   18.jpg Figure 18 Sending TDM waveform It can be seen that BCLK=12.28Mhz is consistent with the expected 48khz*32bit*8=12.288Mhz. The WS signal is also measured to be 48Khz, which meets the set 48Khz sampling rate. DATA is also transmitting with data changes, and it can be seen that the waveform pattern within a frame is repeated by about 4 groups, which also shows that the 4 groups of received data are synchronized. So far, the function of RT600 4-channel 48KHZ 32bit*2ch input and assembling into 48Khz 32bit*8ch output has been realized! i.MXRT 600 Re: RT600 4 I2S input to 1 TDM output solution Thanks so much for my colleage's help, my best internal Collaborators, my audio mentor!  @james_fan !!!  Also thanks my software colleague Qiangzhang( @Skybegonia  ), he is very familiar with the SDK, he shares the DMA pingpong demo which speed my application code and at last resolve my sync issues.
記事全体を表示
S32G_MAC_Address_Storage 本文说明了S32G如何储存mac地址,包括dts保存,systemd指定和fuse保存的办法: 目录 1 需要的软件................................................................. 2 2 背景说明 .................................................................... 2 3 PFE eMAC MAC地址说明 ......................................... 2 3.1 DTS配置 ................................................................. 2 3.2 源代码说明 ............................................................. 3 3.3 测试 ........................................................................ 4 4 GMAC0 MAC地址说明 .............................................. 4 4.1 DTS配置 ................................................................. 4 4.2 源代码说明 ............................................................. 4 4.3 SystemD脚本 ......................................................... 5 4.4 固定GMAC MAC地址的修改办法 ........................... 6 5 用Uboot命令烧写FUSE MAC地址项 .......................... 7 6 修改为从fuse中获得GMAC0 MAC地址 ...................... 9 6.1 Uboot代码修改 ....................................................... 9 6.2 Uboot写MAC寄存器说明 ...................................... 10 6.3 测试 ...................................................................... 10 Automotive
記事全体を表示
如何下载、安装、激活和使用 S32 Design Studio (在 “我的视频” 中查看) 这段短视频演示了如何从您的 NXP 用户账户获取 S32 Design Studio 3.6.0 版本,并将其安装到您的主机电脑上。 安装过程中,S32 Design Studio 3.6.0 需要一个激活码,该激活码可从下载安装文件的同一位置免费获取。 激活后,S32 Design Studio 3.6.0 即可用于以下微控制器和微处理器:S32K1xx、S32K3xx、S32M2xx、S32Z2xx、S32E2xx、S32G2xx、S32G3xx、S32R41 和 S32R45。 如何下载、安装、激活 S32 Design Studio 3.6.0 及其首次使用 激活 | 安装 | 许可 | 安装程序下载 Eclipse IDE 使用和设置 新建项目向导 - 项目管理和设置 SDK
記事全体を表示
S32K388 LPSPI SCKDIV 计算问题 - 为什么 1MHz 波特率下 SCKDIV=38? NXP社区的各位好, 我正在使用 S32K388,并配置 LPSPI 波特率。我有一个关于 SCKDIV 值计算的问题。 我的理解: 根据 S32K3xx 参考手册,LPSPI 波特率公式为: ``` SCK = LPSPI_CLK / (PRESCALE_DIV × (SCKDIV + 1)) ``` 我的配置: - LPSPI 时钟源:AIPS_SLOW_CLK = 40 MHz 目标波特率:1 MHz - PRESCALE = 0 (÷1) 我的计算结果: ``` SCDKIV = (LPSPI_CLK / 波特率) - 1 SCKDIV = (40 MHz / 1 MHz) - 1 = 39 ``` **S32DS 生成的代码:** 但是,当我使用 S32DS 生成配置时,却出现以下错误: ```c LPSPI_CCR_SCKDIV(38U) // SCKDIV = 38 ``` **问题:** 当 SCKDIV=38 时,实际除法系数为 39,这意味着: ``` 实际波特率 = 40 MHz / 39 = 1,025,641 Hz ≈ 1.026 MHz ``` 与目标 1 MHz 相比,误差约为 2.56%。 为什么 S32DS 使用 SCKDIV=38 而不是 SCKDIV=39?S32DS 配置中是否使用了不同的 LPSPI 时钟频率,或者选择这种频率还有其他原因? **补充背景信息:** 我使用的是 S32DS 3.5 - S32K388 参考手册 Rev. 6 - 该项目是使用默认时钟配置创建的 感谢您提前提供的任何解释! 顺祝商祺! Re: S32K388 LPSPI SCKDIV calculation question - why SCKDIV=38 for 1MHz baud rate? 嗨@xlele 首先,请注意,S32K3xx 参考手册的最新可用版本是 Rev. 12。您当前使用的版本包含有关 S32K310、S32K311 和 S32K3x8 设备的初步信息,这些设备在发布该文档时尚未发布。因此,我建议下载并参考RM的最新版本。 关于 LPSPI 波特率的计算,时钟配置寄存器 (CCR) 中 SCKDIV 字段的描述如下: 波特率 = 功能时钟 ÷ (2^预分频 × (SCKSET + SCKHLD + 2)) 其中 SCKSET 和 SCKHLD 由 SCKDIV ÷ 2 得出。 考虑到 SCKDIV = 38: SCKSET = SCKHLD = 38 ÷ 2 = 19 波特率 = 40 MHz ÷ (2^0 × (19 + 19 + 2)) = 1 MHz,与预期值相符。 BR,VaneB
記事全体を表示
iMX8M Plus - SW1 電源オン/オフボタン こんにちは、 iMX8M Plus EVK の開発に取り組んでおり、SW1 を約 5 秒間押し続けると EVK の電源がオフになり、約 1 秒間押すと再び電源がオンになることを確認しました。この動作がハードウェアやPMICによって処理されるのか、それともソフトウェアによって処理されているのかを確認してください。 また、SW3をON位置に移動させると、SW1を押さずに自動的に電源が入ります。これがi.MX8M Plus EVKの想定されるデフォルト動作であるかどうかをご確認ください。 Re: iMX8M Plus - SW1 ON/OFF Button こんにちは、@Govind1807。 NXPサポートまでご連絡いただきありがとうございます。 この挙動はプロセッサ内に実装された内部FSMに関連しています。 より理解を深めていただくために、FSMの動作と状態遷移を示す対応するブロック図を添付しました。 Chavira_0-1782509945998.png よろしくお願いします、 チャビラ
記事全体を表示
Codewarrior TAP 通过 JTAG 检测到了 MPC5200 你好, 我一直很苦恼,不知道如何将Codewarrior TAP调试器连接到配备MPC5200的定制应用板上。 探针是“ FREESCALE CodeWarrior USB TAP CWH-CTP-BASE-H E”。 探针尖端是我自己制作的。基本上,我在网站上找到了 2x15 连接器的引脚图/原理图,然后自己进行了板的接线。我在引脚 30 和地之间连接了一个 10 千欧姆的电阻。提示被识别为“电源架构/JTAG COP” 我一直只使用CCS控制台。我目前还没有使用过Codewarrior IDE。 当前状态: findcc 能正确检测到 TAP。 扫描板检测到 JTAG 链并报告: 设备 0:Altera FPGA(IDCODE 0x020B20DD) 设备 1:MPC5200B rev. 2.x(IDCODE 0x1001101D) 设备 2....7:IDCODE:FFFFFFFF,设备:未知设备。 OpenOCD 也检测到了完全相同的两个设备,因此 JTAG 链似乎是正确的。 目标设备已通电并正在运行其应用程序。 问题: 在CCS中配置处理器的任何尝试均失败: ccs::config_chain mgt5200 返回: mgt5200:未连接到目标或无法识别的处理器 ccs::get_config_chain总是报告“测试核心”而不是 mgt5200。 底层 JTAG 命令(如jtag::get_speed )总是返回:内部故障。 问题: MPC5200 是否支持任何硬件或软件机制,可以在禁用 JTAG 调试的同时仍然允许 IDCODE 扫描? CCS 识别 MPC5200 时,对 TRST、HRESET、引导程序或 BDM/JTAG 使能引脚是否有已知的要求? 是否有办法从 CCS 获取更详细的附件日志,以确定 IDCODE 扫描后哪个步骤失败? 非常感谢您抽出时间阅读本文。 米哈伊 Re: MPC5200 detected by Codewarrior TAP over JTAG 你好, 您观察到的行为(IDCODE 扫描工作但调试附加失败)与 MPC5200 架构一致。 根据 MPC5200 文档,该设备使用两级 JTAG 结构:一个主 TAP(用于标准 JTAG/IDCODE)和一个从 TAP(用于 CPU 调试,即 e300 COP 接口)。如果从设备 TAP 未启用或未正确选择,JTAG 检测可以工作,但调试器连接将失败。 建议查看: 正确处理 TRST 和复位信号(TAP 必须处于正确状态) 能够在连接过程中重置/固定设备 CPU调试(COP)接口可访问(未被硬件或配置阻止) 正确的 JTAG 链配置和 TAP 选择,尤其是在多设备链中 顺祝商祺! Peter
記事全体を表示
S32K144チップにはクロック構成の問題があり、クロックを変更するとタイミング周期が変わってしまう。 S32K144の開発中に、以下の問題に遭遇しました。 Ni__0-1782181934609.png 初期化タイマーの割り込みオーバーフロー期間は1秒に設定する必要があります。 前提として、私のクロック設定は8MHzです。 Ni__1-1782182016343.png Ni__2-1782182026827.png しかし、時計を20Mの時計に変えた後… Ni__3-1782182078529.png Ni__4-1782182086180.png タイマーのオーバーフロー期間が1秒ではなく、400ミリ秒になっていることに気づきました。 しかし、タイマーのクロック設定は依然として8MHzの内部クロックに設定されたままです。 PCC->PCCn[PCC_FTM1_INDEX] |= PCC_PCCn_PCS(0x01) /* クロックソース=1、8 MHz SIRCDIV1_CLK */ | PCC_PCCn_CGC_MASK; /* FTMレジスタのクロックを有効にする */ この問題の原因となっている設定上の問題が何なのか、私には分かりません。 Re: S32K144芯片的时钟配置问题,更改时钟后定时周期出现变化 ハイ 次の S32K1 RM の表 27-9 を参照してください。peripheral module clocking (continued),FTM具体選択哪个时钟源需要查看FTMn_SC[CLKS]和29.6.17 PCC FTM1 Register (PCC_FTM1)的PCS位。 Table 27-9. Peripheral module clocking FTM.png プロセッサ エキスパートがコンフィギュレーションを生成し、ベアメタル モードでレジスタを直接操作しました。SDK サイトを使用した API が原因でベアメタル プログラムがクラッシュしたかどうかはわかりません。 さらに、ProcessorExpert 搭載 SDK の API を使用する場合は、ベアメタルの直接操作レジスタの構築リファレンス S32K144_Project_FTM サンプル ftm_periodic_interrupt_s32k144 を参照してください。 よろしくお願いいたします ロビン
記事全体を表示
GPIO_EMC_B2_18をFLEXSPI1_A_DQSとして設定し、クロック周波数を133 MHzに設定するにはどうすればいいですか? こんにちは、 i.MX RT1175のGPIO_EMC_B2_18をFLEXSPI1_A_DQSとして設定し、クロック周波数を133MHzに設定したい。 GPIO_EMC_B2_18起動時にFLEXSPI1_A_DQSに設定できないことは理解しています。 そのため、起動時に60MHzで動作させて、アプリケーション内で133MHzに変更しようとしていますが、うまくいきません。 私はevkbmimxrt1170_flexspi_nor_polling_transferプロジェクトを使用しており、`flexspi_nor_flash_ops.c`内の`flexspi_nor_flash_init()`の関連セクションを変更しました。 「`」 IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_B2_18_FLEXSPI1_A_DQS, 1U); IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_B2_18_FLEXSPI1_A_DQS, 0x0AU); CLOCK_SetRootClockDiv(kCLOCK_Root_Flexspi1, 4); CLOCK_SetRootClockMux(kCLOCK_Root_Flexspi1, 5); config.rxSampleClock= kFLEXSPI_ReadSampleClkLoopbackFromDqsPad; 「`」 クロック周波数を133MHzに設定すると、システムがフリーズします。 「`」 CLOCK_SetRootClockDiv(kCLOCK_Root_Flexspi1, 5); CLOCK_SetRootClockMux(kCLOCK_Root_Flexspi1, 5); 「`」 クロック周波数を105MHzに設定すると動作します。 GPIO_EMC_B2_18をFLEXSPI1_A_DQSに設定し、クロック周波数を133 MHzに設定するにはどうすればいいですか? Re: How can I configure GPIO_EMC_B2_18 as FLEXSPI1_A_DQS and set the clock frequency to 133 MHz? こんにちは、@mayliu1 さん。 ご返信ありがとうございます。 セカンダリpingグループは100MHzでしか動作しないかもしれませんが、私はプライマリpingグループを使い、DQSだけをGPIO_EMC_B2_18に変更する予定です。理由は、USDHC2_CMD に GPIO_SD_B2_05 を使用しているためです。 ピン構成 FLEXSPI1_A_SS0_B GPIO_SD_B2_06 FLEXSPI1_A_SCLK GPIO_SD_B2_07 FLEXSPI1_A_DATA0 GPIO_SD_B2_08 FLEXSPI1_A_DATA1 GPIO_SD_B2_09 FLEXSPI1_A_DATA2 GPIO_SD_B2_10 FLEXSPI1_A_DATA3 GPIO_SD_B2_11 FLEXSPI1_A_DQS GPIO_SD_B2_05(ブーツ) アプリケーションでは、FLEXSPI1_A_DQSのみがGPIO_EMC_B2_18に変更されます。 FLEXSPI1_A_DQS GPIO_EMC_B2_18 テストとして、EVKのクロック周波数を60MHz(ブート時)から133MHzに変更しましたが、FLEXSPI1_A_DQSは変更せず、GPIO_SD_B2_05に設定したままにしました。すると、同じようにハングアップしました。 xip 設定が .readSampleClksrc=kFlexSPIReadSampleClk_LoopbackInternally に設定されているため、それをkFlexSPIReadSampleClk_LoopbackFromDqsPadに変更したところ、133MHzで動作させることができました。 次に、DQSをGPIO_EMC_B2_18に変更してみたところ、133MHzで動作させることができました。 このやり方は受け入れられるだろうか? また、起動時にはGPIO_SD_B2_05はフローティング状態ではありません。`kFlexSPIReadSampleClk_LoopbackFromDqsPad`に設定して60MHzで実行しても問題ありませんか? Re: How can I configure GPIO_EMC_B2_18 as FLEXSPI1_A_DQS and set the clock frequency to 133 MHz? こんにちは@Shuhei_Dさん 私たちの製品にご関心を寄せ、コミュニティをご利用いただき、本当にありがとうございます。 詳細については、以下の記事をご参照ください。 https://community.nxp.com/t5/i-MX-RT-Crossover-MCUs/RT-1176-FlexSPI-RW-frequency-DQS/mp/1871808 RT1170リファレンスマニュアルによると、セカンダリピングループを使用した場合、FlexSPIフラッシュの最大対応周波数は100 MHzです。 プロジェクトの構成を確認し、上記のリンクで説明されているシナリオに合致しているか確認していただけますか? お役に立てれば幸いです。 よろしくお願いいたします。 5月 Re: How can I configure GPIO_EMC_B2_18 as FLEXSPI1_A_DQS and set the clock frequency to 133 MHz? お返事ありがとうございます。 回路図を確認したところ、GPIO_EMC_B2_18がフローティング状態になっていることがわかりました。 Re: How can I configure GPIO_EMC_B2_18 as FLEXSPI1_A_DQS and set the clock frequency to 133 MHz? NORフラッシュの外付けを駆動するために、SPIのクロック周波数を60MHzから133MHzに変えたいようですね。しかし105MHzなら問題なさそうなので、SPI高周波数で信号の整合性をレイアウト側で確認する必要があるかもしれません。回路図を確認しますか? Re: How can I configure GPIO_EMC_B2_18 as FLEXSPI1_A_DQS and set the clock frequency to 133 MHz? こんにちは@Shuhei_Dさん ご辛抱いただきありがとうございます。 ご質問内容を再度確認しました。 プライマリDQS PINを使用し、セカンダリDQSオプションは使用しないでください。 mayliu1_0-1782368272303.png あなたの場合、もし主DQSピンがすでに別の機能に使われている場合、以下の構成を適用できます。ただし、この設定は最大60MHzまでしかサポートされていないことにご注意ください。 mayliu1_1-1782368409020.png お役に立てれば幸いです。 よろしくお願いいたします。 5月
記事全体を表示
S32K3の駆動力は高い S32K3XXのリファレンス・マニュアルには「ドライブ強度の有効化」ビットについて書かれていますが、その意味を明確に定義しているようには見えません。私が見つけた最も近い参考文献は、特定のピンがサポートする最大周波数と相関しているようです(S32K3XXRM/セクション4.4.1の42ページ)。 「drive-strength」を有効にすべきか否かを判断する上で、最大消費電流値やその他の注意点に関して、何か明確な規定はありますか? Re: High Drive Strength on S32K3 GPIO規格:最大10MHzのスイッチングに対応。高駆動強度には対応していません。スルーレート制御はサポートされていません。 — GPIO-Standard plus:最大25 MHzへの切り替え 高い駆動強度をサポートします。スルーレート制御はサポートされていません。 — GPIO-Medium:最大50 MHzまでの切り替えで高いドライブ強度をサポートします。スルーレート制御をサポートします。 — GPIO-Fast:最大120 MHzへの切り替え 高いドライブ強度をサポートします。スルーレート制御をサポートします。 Re: High Drive Strength on S32K3 はい、それはまさに私が質問で引用した箇所の文章です。それではなぜ「ドライブ強度」を有効にするべきか、あるいは有効でないかはわかりません。単に一部のピンがそれをサポートしていること、そして一部の切り替え速度がそれに関連していることを示しているだけです。 もしこれでLEDを駆動する場合、より多くの電流を流すことができるでしょうか?どれくらい最新の情報ですか? これは純粋にスルーレートの変更なのでしょうか? ピンがサポートしているなら、有効にしない理由はありますか?それを有効にすると、チップの放熱量は増えますか? Re: High Drive Strength on S32K3 S32K39x、S32K37x、S32K36xマイクロコントローラのハードウェア設計ガイドライン Re: High Drive Strength on S32K3 ハイ S32K3XXリファレンスマニュアル(S32K3XXRM)では、パッドタイプ「GPIO-Standard」は高駆動強度をサポートしない一方、「GPIO-Standard Plus」、「GPIO-Medium」、「GPIO-Fast」は高駆動力をサポートしていると記載されています。 GPIOパッドタイプについては、S32K3XXRMに付属のExcel添付ファイルS32K344_S32K324_S32K314_IOMUX.xlsxのS32K344_IO信号テーブル、特に列Hを参照してください。 drive-strength high current Pad Type.png よろしくお願いします、 ロビン ------------------------------------------------------------------------------- 注記: この投稿があなたの質問への回答になっている場合は、「解決策として承認」ボタンをクリックしてください。ありがとう! - 前回の投稿から7週間Threadをフォローしており、その後の返信は無視しています もし後で関連する質問があれば、新しいThreadを開き、閉じたThreadを参照してください。 ------------------------------------------------------------------------------- Re: High Drive Strength on S32K3 前の投稿者にも言いましたが、どのピンが「高い駆動強度」をサポートしているかは分かっていますが、それが問題ではありません! しかし幸いなことに、背景には関連する情報が詰まっていました。S32K3xx.pdf には、表27。GPIOのDC電気仕様には、私が求めているものが含まれているようです。 これは、ピンの出力電流を2倍にして、「DSE = 0」と「DSE = 1」を切り替えるようにしているようです。 Screenshot From 2026-07-06 09-18-58.png Screenshot From 2026-07-06 09-18-48.png
記事全体を表示
LPC553x 参考手册:表 315 SCT0 信号错误 (SCTIMER) 你好, 我想报告 LPC553x 参考手册(修订版)中似乎存在的一个重大错误。4) 将表 315“SCT0 信号(输出)”与数据表表 3 进行比较,并询问哪个来源是权威的。 这是 LPC553x 参考手册,修订版 4,表 315“SCT0 信号(输出)”: danielholala_0-1781768255327.png 下表列出了 34 个外部引脚(如果我数得没错的话)。快速浏览 LPC553x 数据手册,发现它只有 31 个引脚。此外,表 315 列出了 PIO2_2、PIO2_9、PIO2_15、PIO2_30 和 PIO2_31 作为 SCT0 输出引脚。从数据手册来看,LPC553x 只实现了 PIO2_0 和 PIO2_1,所以该设备上不存在 Port-2 引脚。 现在,如果您仔细查阅数据手册中的表 3 并提取所有 SCT0_OUT 引脚,那么您最终会得到一个完全不同的表格: SCT0 信号(输出)连接至 SCT0_OUT0 PIO0_2、PIO0_17、PIO1_4、PIO1_23 SCT0_OUT1 PIO0_3、PIO0_18、PIO1_8、PIO1_24 SCT0_OUT2 PIO0_10、PIO0_15、PIO0_19、PIO1_9、PIO1_25 SCT0_OUT3 PIO0_22、PIO0_31、PIO1_10、PIO1_26 SCT0_OUT4 PIO0_23、PIO1_3、PIO1_17 SCT0_OUT5 PIO0_26、PIO1_18 SCT0_OUT6 PIO0_6、PIO0_27、PIO1_31 SCT0_OUT7 PIO0_21、PIO0_28、PIO1_19 SCT0_OUT8 PIO0_29,PIO1_13 SCT0_OUT9 PIO0_30 我的设计以数据手册表 3 为依据。 请, 确认数据手册(修订版 5.0)表 3 是 SCT0 输出引脚的权威来源, 确认参考手册中的表315有误。 请确认我上面的表格是否正确。 谢谢。 担 Re: LPC553x reference manual: Table 315 SCT0 Signals wrong (SCTIMER) 你好, 请使用参考手册中附带的“引脚功能表”来确定 SCT0_OUT 功能的可用引脚。 luis_maravilla_1-1782229991489.png 顺祝商祺!   Re: LPC553x reference manual: Table 315 SCT0 Signals wrong (SCTIMER) 你好, 目前,请参考引脚功能表。 我将信息传递给团队。 此致敬礼,路易斯 Re: LPC553x reference manual: Table 315 SCT0 Signals wrong (SCTIMER) 你好@luis_maravilla , 感谢您指出“引脚功能表”。我不知道参考手册里竟然隐藏着一个电子表格文件。 我快速浏览了一下“引脚功能表”,证实参考手册中表 315 “SCT0 信号(输出)”的信息不正确。 请将此信息转交给文档团队进行更正。 如果对引脚功能还有其他疑问,权威来源是数据手册还是引脚功能表? 谢谢。 此致, 丹尼尔
記事全体を表示
PXIコントローラのMPU選び方 オープンソースのPXIシャーシコントローラを作りたいと思っています(ご存じない方のために説明すると、基本的にArm SBCで、PCIe経由でバックプレーンに接続し、ペリフェラルのPXIモジュールも同じですが、RCではなくPCIe EPが付いています) 例えば、Linux配信を動かせるMPUが必要です。Ubuntuはグラフィックモードで、まずまずのパフォーマンスを保ち、例えば特殊なソフトウェアが動作しているはずです。LabVIEWおよびカスタムペリフェラルモジュールはユーティリティを制御し、1秒あたり数GBの生データを処理します。PXI仕様で規定されているように、少なくとも2つの独立したPCIe RCを備えている必要があり、速度が速ければ速いほど良い。速度が十分であれば、例えばRF AWGでDACに生データを連続的に供給し、AWGのRAMサイズに制限されません。また、LPDDR4を大量に接続できる可能性も面白いです。典型的な32ビットバスだけでなく、64+も対応可能です。 新しいTI Am69aはかっこいいようですが、かなり高くなそうですし、しかも非常に新しいので、完全なエラッタやソフトウェアの例、ドライバなどはありません。ハードウェア開発者で趣味でコーディングしている私には難しすぎると思います もう一つの方法はRockchip RK3588で、より手頃で古いですが、PCIeが遅すぎて、Gen 3の2台だけです。確かに受け入れられるけど...もしかしたら、もっと良いアイデアがあるか、最近似たようなことをしたことがあるかもしれませんね?ぜひ聞かせていただきたいです 🙂 Re: Choosing an MPU for PXI controller LS1046AまたはLX2160Aをご検討ください。しかし、これらのSoCはGUI用のグラフィックスエンジンを統合していないため、外部ソリューション(例えばリモートGUIや個別GPUなど)が必要です。 ありがとうございます。
記事全体を表示
app_localizationとapp_localization_algoにおけるRAS転送処理に関する質問 こんにちは、 現在、KW47でチャネルサウンディングを使用しようとしており、MCUXpresso SDKドキュメントの「Bluetooth Low Energyチャネルサウンディングアプリケーション開発者ガイド」を参照しています。しかしながら、測距サービス(RAS)を実装する必要があるかどうか確信が持てないため、ご説明をいただきたく存じます。 具体的には、app_localization_algo共通モジュールに関して、ドキュメントには次のように記載されています。 app_localization_algoモジュールは、CS手順とRAS転送の結果として得られたデータを解凍する役割を担います。その後、モジュールはそれを距離測定アルゴリズムに渡してメートル単位の距離を取得し、その距離をアプリケーションに伝達します。 アプリケーションとこのモジュールの間には、他に直接的な相互作用はありません。そのAPIは主にapp_localizationモジュールで使用されています。 この説明に基づき、RASの移送に関して以下の点を明確にしたいと思います。 RAS転送はapp_localizationモジュール内で自動的に設定および処理されますか? それとも、app_localizationはapp_localization_algoモジュールとのみ連携し、RAS転送にはRAS APIを使用して別途実装する必要があるのでしょうか? 言い換えれば、アプリケーションはCSプロシージャ処理とRAS転送の両方においてapp_localizationに完全に依存すべきなのか、それともアプリケーションレベルでRAS APIを明示的に統合する必要があるのか、ということです。 参考までに、関連するドキュメントページは以下のとおりです。 https://mcuxpresso.nxp.com/mcuxsdk/26.03.00/html/middleware/wireless/bluetooth/doc/Bluetooth %20Low% 20Energy %20Channel% 20Sounding %20Application% 20Developers%20Guide/topics/application_common_modules.html#app-localization-algo-common-module ご説明いただけると幸いです。 よろしくお願いします、 Re: Question about RAS transfer handling in app_localization vs app_localization_algo こんにちは、 @t_hosomi 事例を作成していただきありがとうございます。 少々お時間をください。いただいた詳細情報を確認し、できるだけ早くご返信いたします。 よろしくお願いいたします。 Christine。 Re: Question about RAS transfer handling in app_localization vs app_localization_algo こんにちは、 @t_hosomi ご辛抱強くお待ちいただき、また詳細な情報を提供していただき、ありがとうございます。 私の回答は以下のとおりです。 ご提供のリンクに示されているように、RASはレンジャーサービスの略です。これは別のサービスです。「app_localization」は実際にRASプロファイルインターフェースを呼び出してデータを転送します。 「app_localization」はアプリケーションコードの一部と考えることができます。ここではRASと呼ばれ、他の一般的なアプリケーションコードでも同様です。`app_localization`の使用をお勧めします。 `app_localization`は、RASを介したクライアント・サーバー(CS)データの転送を実装します。 しかし、アプリケーション層はプロファイルの購読、通知の有効化、インジケーターなどの基本的なインターフェースを呼び出す必要があります。 ご理解いただけましたでしょうか? よろしくお願いいたします。 Christine。 Re: Question about RAS transfer handling in app_localization vs app_localization_algo こんにちは、 @Christine_Li さん。 ご回答ありがとうございます。 RASは独立したサービスであると理解しています。 app_localization内でCSデータを転送(すなわちRASを利用する)には、関連ドキュメントの「Ranging Service common module」セクションやwireless_ranging SDKサンプルで説明されているステップ、特に「アプリケーション層は基本的なインターフェースを呼び出す必要がある」という手順を追加で実装する必要があるという理解は正しいでしょうか。 例えば、プロフィールの購読、通知の有効化、指標など」などです。 よろしくお願いします、 Re: Question about RAS transfer handling in app_localization vs app_localization_algo こんにちは、 @t_hosomi はい、おっしゃる通りです。 よろしくお願いいたします。 Christine。 Re: Question about RAS transfer handling in app_localization vs app_localization_algo こんにちは、 @t_hosomi ご返信ありがとうございます。 誤解を避けるため、別の言葉を変えてみましょう。 RASはapp_localization内で処理されるのではなく、独立したサービスとして扱われます。 app_localizationはCSデータを転送するためにRASを呼び出す必要があります。 サンプルは必ずしもそのままでは使用できないわけではない。ただし、`app_localization` が RAS/プロファイルレベルの設定をすべて自動的に処理すると考えるべきではありません。カスタムアプリケーションに機能を統合する際には、プロファイルのサブスクリプションや通知・表示の有効化など、必要なアプリケーション層手順が適切に実装されていることを確認する必要があります。そうしないと、RASデータパスが意図したとおりに機能しない可能性があります。 これでより分かりやすくなったでしょうか。 もし何か不明な点があれば、遠慮なくお知らせください。 よろしくお願いいたします。 Christine。 Re: Question about RAS transfer handling in app_localization vs app_localization_algo こんにちは、 @Christine_Li さん。 ご回答ありがとうございます。 あなたの説明から理解すると、RASもapp_localization内で処理されますが、基本的なインターフェースはアプリケーション層から呼び出して設定する必要があるようです。 しかし、digital_key_car_anchor_csやdigital_key_device_csなどのSDKsサンプルコードでは、ドキュメントの「レンジングサービス共通モジュール」セクションで説明されているように、レンジングサービスの設定がアプリケーション層から明示的に呼び出されていないようです。 これらのサンプルは、現状のままでは直接使用できない(つまり、正しく機能しないか、精度が向上しない可能性がある)ということですか?アプリケーションレベルでの追加RAS構成が必要だということです 敬具
記事全体を表示
为什么模型大小限制为 1 MB? 我在 MIMRT700(NPU 模型)上运行了 tflm_cifar10 示例中的模型。在构建程序时,我可以看到模型的大小及其对应的区域大小。  在许多情况下,该区域的大小为 1 MB。据我所知,该模型的大小上限为 1 MB。是这样吗? nnxxpp_0-1781495142659.png 我不明白这一点。以下是关于 MIMRT700 EVK 的信息。 nnxxpp_2-1781495429888.png 我不知道模型在 MIMRT700 EVK 上保存在哪里。那么,区域大小的 1 MB 在哪里呢?这是模型大小的实际限制吗?或者,我们可以采用某些方法来扩大模型规模。 你对这个问题有什么看法吗?因为我试图部署一个更大的模型> 1 MB。我确实在等待您的回复。谢谢。 Re: Why model size is limited at 1 MB? @mayliu1  非常感谢。现在我明白了,我们可以通过设置区域大小来扩大模型的规模。 nnxxpp_0-1781514247437.png 或者如果我想在外部存储器上运行更大的模型,我可以关注这个文档 https://docs.nxp.com/bundle/AN14700/page/topics/external_memory.html Re: Why model size is limited at 1 MB? 你好@nnxxpp, 非常感谢您关注我们的产品并使用我们的社区。 问:我不知道模型在 MIMRT700 EVK 上保存在哪里。那么,区域大小的 1 MB 在哪里呢?这是模型大小的实际限制吗?或者,我们可以采用某些方法来扩大模型规模。 你对这个问题有什么看法吗? 因为我试图部署一个比> 1 MB 更大的模型。 答:modeldata 显示的 1 MB 并非 RT700 的硬件限制。 这只是示例项目中使用的默认链接器分配。 对于较大型号,可在项目设置中调整此分配,若需要更多存储空间,也可使用外部 XSPI 闪存。 如需更多详细信息,请参阅此 AN14700 文档。 https://docs.nxp.com/bundle/AN14700/page/topics/introduction.html mayliu1_0-1781507645284.png 因此,RT700 并非天生就仅限于 1 MB 型号。要支持更大的 NPU 模型,可以通过增加模型数据内存分配,或者使用相应的转换选项将模型放置在外部 XSPI 闪存中来实现。  希望对您有所帮助 顺祝商祺! 刘梅 Re: Why model size is limited at 1 MB? @mayliu1  我想重新讨论这个话题。现在我正尝试在RT700上部署更大的模型。下图是在用小型模型构建程序时捕获的。 我看到有 4 个内存区域: - QSPI_flash:外部存储器 - SRAM:我问过 chatgpt,它是用来存储程序运行时的数据的(例如 .data、.bss 等)。栈,堆)。是这样吗? - NCACHE_REGION:与 ktensorArena 相同(用于输入、中间输出和输出) - modeldata:用于保存模型权重 我在导入 SDK 示例时看到了内存配置信息。这意味着 SRAM、NCACHE_REGION 和来自 SRAM 的模型数据(7.5 MB)。 NCACHE_REGION 和 modeldata应该位于 0x2000_0000至0x2058_0000 ( 5.5 MB ) 可获得最佳性能(NPU 可访问的 SRAM 区域) 但 SRAM(名为 SRAM)的位置是0x20080000 (在第二张图片中) ==> 它也在0x2000_0000到0x2058_0000 的范围内。默认值约为 2.5 MB。这意味着NCACHE_REGION + modeldata应该小于 (5.5 - 2.5) = 3 MB。 我的模型大小约为 3.5 MB。除了可以将模型放在外部存储器上(这会导致推理时间更长)之外,我该如何配置内存,才能让我的模型(3.5 MB)仍然位于 NPU 可以访问的内存区域? 我很好奇我们是否可以缩小“SRAM”区域(在图像 1、2 中),或者我是否可以将其移动到 RAM 的另一个区域(7.5 - 5.5 = 2 MB - 图像 3 中的最后一个区域)? 我该如何估算“SRAM”区域的大小?在下面的图片中,它是 15560 字节。 不好意思,我的问题有点长。 nnxxpp_0-1782205318606.png nnxxpp_1-1782205742121.png nnxxpp_2-1782206037185.png Re: Why model size is limited at 1 MB? @mayliu1  早上好。 或许你错过了我上面提出的新问题。 Re: Why model size is limited at 1 MB? 嗨@nnxxpp , 很抱歉回复晚了。 如果您不介意的话,能否请您为您的新问题创建一个新的案例? 感谢您的理解与合作。 顺祝商祺! 5月 Re: Why model size is limited at 1 MB? 很高兴得知您的问题已经解决。 很抱歉回复晚了,感谢您的理解。 Re: Why model size is limited at 1 MB? @mayliu1  我的问题已经解决了。我们可以从 5.5 MB 区域中为 NPU 找到 SRAM。我将 modeldata 和 kTensorArena 放在 5.5 MB 的区域中,并且成功了。推理时间不错。 但如果你没有错过我的问题,我就可以尽快完成我的任务了。谢谢。 Re: Why model size is limited at 1 MB? 是的。祝您今天愉快。 Re: Why model size is limited at 1 MB? @mayliu1 好的。我来创建一个新问题。谢谢。
記事全体を表示
S32K3 出现间歇性引导加载程序 → 应用程序跳转故障(无法在所有主板上重现) 您好,NXP团队: 我继续前面关于 S32K3 设备中 S32K311 中 C40 闪存擦除/程序限制 C40 闪存擦除/从引导加载程序写入的讨论(相同闪存块执行): 在您的支持下,我们通过以下方法解决了闪存擦除/编程问题: 确保在操作过程中不执行目标闪存块的操作 本期 我们现在观察到启动加载程序 → 应用程序跳转过程中的间歇性问题。 在大多数情况下,同样的跳转实现方式都能可靠地工作: 在大约 20 块主板上测试 应用程序重新刷新>100 次 ECU RESET >1000 次 在这些情况下没有发现问题 但是,在 2 个板块中,我们偶尔会看到: 控件无法跳转到应用程序 设备仍停留在引导加载程序中 恢复方法: 使用调试器重新刷新组合 HEX(引导加载程序 + 应用程序)后,问题得到解决 关注: 在生产中(车辆安装的 ECU),通过调试器重新刷新是不现实的 使用的跳转功能 C void JumpToApplication(void) { uint32appStack= *(uint32 *)(APP_STARTADDR); uint32 func = *(uint32volatile*)(APP_STARTADDR + 0xC); func = *(uint32volatile*)(((uint32)func) + 0x4); DisableAllInterrupts(); s32_scb->vtor = app_startaddr; __asm volatile("msr msp,%0"::"r"(appStack)); __asm volatile("msr psp,%0"::"r"(appStack)); func = ((((uint32)func)& 0xFFFFFFFEU) | 1U); (*(void(*)(void))func)(); 而(1); } static void DisableAllInterrupts(void) { for (int i = DMATCD0_IRQn; i<= SoC_IRQn; i++)     { IntCtrl_Ip_DisableIrq((IRQn_Type)i); IntCtrl_Ip_ClearPending((IRQn_Type)i);     } S32_SysTick->CSRr = 0U; } 说明 问题无法持续重现 出现间歇性& ,随机发生。 全图像重新刷新(组合 HEX)恢复正常行为 请求指导 能否请您帮忙 在跳转到应用程序之前,还应增加哪些检查? 是否有任何已知情况(MPU、高速缓存、VTOR、障碍等)会导致这种间歇性行为? 这可能与 缓存状态(I/D 缓存未清理/禁用)? 闪存编程不完整或校准问题? 向量表或重置处理程序不一致? 跳转之前有推荐的产品级序列吗(屏障、缓存处理等)? 如果需要更多细节,请告诉我,并提前感谢您的支持。 致以最崇高的敬意, Yusup Khan S32DS-ARM S32K3 S32K31XEVB-Q100 @danielmartynek C40 在 S32K311 中的引导加载程序中擦除/写入闪存(执行相同的闪存块) Re: Intermittent Bootloader → Application Jump Failure on S32K3 (Not Reproducible on All Boards) 你好,尤苏普、 设备仍然停留在引导加载程序中意味着什么? 能否安装调试器,检查卡在哪里? 是故障异常还是软件循环? 真的有必要重新刷新吗? 关于 MPU 和缓存,良好的做法是清理并禁用缓存。应用程序会根据使用情况重新配置 MPU,因此无论如何都应清理并禁用缓存。 您可以添加内存屏障,也可以参阅 S32K3xx 参考手册第 3.8 节 “内存操作序列化”,并使用先写后读顺序。 此外,检查 DCM_GPR 寄存器是否存在故障。(RM,表 231)。产品系列中由 DCM 控制的功能和可用性。) 确保时钟配置与 RM 中列出的时钟选项之一相匹配,例如表 157.选项 A - 高性能模式(CORE_CLK @ 160 MHz)。 总之,关键是要找出引导程序卡住的循环。如果出现故障异常,则需要收集更多有关故障的信息。 https://community.nxp.com/t5/S32K-Knowledge-Base/Example-S32K312-HARDFAULT-Handling-Interrupt-DS3-5-RTD300/ta-p/1806259 https://community.nxp.com/t5/S32K-Knowledge-Base/How-To-Debug-A-Fault-Exception-On-ARM-Cortex-M-V7M-MCU-S32K3XX/ta-p/1595570 https://community.nxp.com/t5/S32K-Knowledge-Base/Fault-handling-on-S32K14x/ta-p/1114447 此致, 丹尼尔 Re: Intermittent Bootloader → Application Jump Failure on S32K3 (Not Reproducible on All Boards) 你好,@yusupkhan241、 你在许多主板上成功地对其进行了测试,但只有少数几个显示了这个问题。因此,这显然是偶发性的,我无法从现有信息中确定根本原因。可能的原因有很多,需要在故障主板(连接调试器)上进行适当的调试。 有趣的是,上电复位无济于事。如果这只是一个运行时问题(例如如出现高速缓存状态不良、IRQ 挂起、CPU 寄存器状态或剩余 RAM 内容等情况,则 POR 应将其清除。 在 POR 之后,其他工作板是否正常独立组网 (SA)? 如果是,则表示与非易失性存储器有关。我建议将闪存内容转储到故障主板上,然后逐字节将其与正常运行的主板进行比较。 此致, 丹尼尔   Re: Intermittent Bootloader → Application Jump Failure on S32K3 (Not Reproducible on All Boards) 你好@丹尼尔-马蒂内克 感谢您的回复。 说明一下,我们观察到两种间歇性行为: 1) 启动加载程序,但跳转失败: - 引导加载程序接收到更新命令,并成功对应用程序进行编程。 - 应用程序 CRC 校验通过。 - 但是,在发出跳转后,控制权并没有转移到应用程序。 2) 启动加载程序无反应: - 无 UART 响应,无 LED 指示。 -POR/软件RESET无法恢复。 - 只有通过调试器重新刷新才能恢复系统。 到目前为止,仅靠 POR 并不能解决问题。 对于跳跃序列,我们目前采用以下方法: - 跳转前验证申请: IVT 标记检查 堆栈指针(非 0x0 / 0xFFFFFFFF) RESET 处理器有效期 - 跳跃序列包括 禁用中断(单独清除) 禁用 SysTick 缓存清理 + 失效 VTOR 最新情况 MSP/PSP 最新情况 DSB/ISB 障碍 跳转到重置处理器 /* -------------------------------------------------------------------------- */ /* 闪存布局 */ /* -------------------------------------------------------------------------- */ /** @brief 内部闪存的基地址。*/ #define FLASH_BASE_ADDR (0x00400000U) /** @brief 闪存总容量(1 MB)。*/ #define FLASH_TOTAL_SIZE (0x00100000U) /** @brief 内部闪存的结束地址。*/ #define FLASH_END_ADDR (FLASH_BASE_ADDR + FLASH_TOTAL_SIZE) /** @brief 应用程序映像区域的起始地址。*/ #define APP_STARADDR (0x00422000U) /** @brief 支持的最大应用程序图像大小(以字节为单位) 。*/ #define APPLICATION_IMAGE_SIZE (FLASH_END_ADDR - APP_STARTADDR) /** @brief 每个传输步骤分配的最大有效载荷缓冲区。*/ #define FLASH_CHUNK_SIZE (512U) /** @brief RESET 后 CRC 验证期间使用的区块大小。*/ #define CRC_CHUNK_SIZE (4096U) /** @brief 应用程序图像基础的 IVT 标记预期值。*/ #define IVT_MARKER_MAGIC (0x5aa55a5U) /** @brief 保留是为了与现有应用程序映像版本实现布局兼容。 */ #define IVT_ENTRY_ADDR (APP_STARTADDR + 0x2000U) /* -------------------------------------------------------------------------- */ /* 应用程序跳转配置 */ /* -------------------------------------------------------------------------- */ /** @brief 从应用程序开始到核心入口地址的偏移量。*/ #define FLASH_APP_CORE_ENTRY_OFFSET (0x0CU) /** @brief 从核心入口地址重置处理程序的偏移量。 */ #define FLASH_APP_RESET_HANDLER_OFFSET (0x04U) /** @brief 有效应用程序映像的预期 IVT 标记魔法值。*/ #define FLASH_IVT_MARKER_MAGIC (0x5AA55AA5U) /** @brief 默认擦除的 32 位闪存值。*/ #define FLASH_ERASED_U32_VALUE (0xFFFFFFFFU) /** @brief 默认零 32 位值。*/ #define FLASH_ZERO_U32_VALUE (0x00000000U) /** * @brief 验证从应用程序闪存读取的地址。 * * @details * 该函数检查给定地址值是否有效和可用。 * 它过滤掉常见的无效值,例如: *-0x00000000(未编程/空值) *-0xFFFFFFF(擦除的闪存) * * 此函数用于验证堆栈指针和 RESET 处理程序。 * @Param 地址值从闪存(堆栈指针或重置处理程序)读取的地址。 * * 如果值有效,则返回 TRUE,否则返回 FALSE。 */ static boolean Flash_IsAddressValid(uint32 addressValue) { return ((addressValue != FLASH_ZERO_U32_VALUE)&& (addressValue != FLASH_ERASED_U32_VALUE)) ?true : false; } static AppJumpError_t Flash_PrecheckApplication(void) { uint32 appStack; uint32 coreEntry; uint32 resetHandler; /* IVT 标记验证 */ if ((*(volatile const uint32 *)APP_STARTADDR) != FLASH_IVT_MARKER_MAGIC) { return APP_JUMP_ERR_CORRUPT; } /* 堆栈指针验证 */ appStack = *(volatile const uint32 *)APP_STARTADDR; 如果 (Flash_IsAddressValid(appStack) == FALSE) { return APP_JUMP_ERR_STACKPTR; } /* 重置处理程序验证 */ coreEntry = * (volatile const uint32 *) (APP_STARADDR + FLASH_APP_CORE_ENTRY_OFFSET); resetHandler = * (volatile const uint32 *) (CoreEntry + FLASH_APP_RESET_ENTRY_OFFSET); if (Flash_IsAddressValid(resetHandler) == FALSE) { return APP_JUMP_ERR_RESETHANDLER; } return APP_JUMP_OK; } /** * @brief 将执行从引导程序转移到应用程序。 * @details * 此函数执行将控制权 *从引导加载程序转移到应用程序固件所需的最后步骤: * *-禁用所有中断 *-停止系统勾选 *-清除缓存并使其无效 *-设置主堆栈指针 (MSP) *-更新向量表 *-跳转到应用程序重置处理程序 * * 重要: *-必须在调用此函数之前完成所有验证。 * - 此函数不返回。 */ void JumpToApplication(void) { uint32 appStack; uint32 coreEntry; uint32 resetHandler; /* ------------------------------------------------------------------ */ /* 读取应用程序向量表 */ /* ------------------------------------------------------------------ */ appStack = *(volatile const uint32 *)(APP_STARTADDR); coreEntry = *(volatile const uint32 *)(APP_STARTADDR + FLASH_APP_CORE_ENTRY_OFFSET); resetHandler = *(volatile const uint32 *)(coreEntry + FLASH_APP_RESET_HANDLER_OFFSET); /* ------------------------------------------------------------------ */ /* 禁用中断 */ /* ------------------------------------------------------------------ */ Flash_DisableAllInterrupts(); /* 禁用 SysTick */ S32_SysTick->CSRr = 0x00000000; /* ------------------------------------------------------------------ */ /* 缓存处理 */ /* ------------------------------------------------------------------ */ Cache_Ip_Clean(CACHE_IP_CORE, CACHE_IP_DATA, TRUE); Cache_Ip_Invalidate(CACHE_IP_CORE, CACHE_IP_INSTRUCTION); /* ------------------------------------------------------------------ */ /* 设置向量表地址 */ /* ------------------------------------------------------------------ */ S32_SCB->VTOR = (uint32)APP_STARTADDR; /* ------------------------------------------------------------------ */ /* 设置主堆栈指针 */ /* ------------------------------------------------------------------ */ __asm volatile ("msr msp, %0" :: "r"(appStack)); __ asm volatile ("msr psp,%0"::"r"(appStack)); __asm__ __volatile__ ("dsb 0xF": :"memory"); __asm__ __volatile__ ("isb 0xF": :"memory"); /* 确保 Thumb 模式 */ resetHandler = (resetHandler& FLASH_THUMB_ADDRESS_MASK) | FLASH_THUMB_ADDRESS_BIT; /* ------------------------------------------------------------------ */ /* 跳转到应用程序 */ /* ------------------------------------------------------------------ */ ((void (*)(void))resetHandler)(); /* 不应到达此处 */ while (1) { /* 陷阱 */ } } 我们有几个具体问题: 1) 在这个验证/跳转序列中是否有任何关键的遗漏或错误? 2) 你是否建议进行更多检查(如更严格的 SP/PC 范围验证或校准检查)? 3) 即使使用此序列,缓存/MPU 状态或丢失的障碍是否仍会导致这种间歇性行为? 4) 是否存在任何已知的闪存对齐或 ECC 校正依赖性,可以解释为什么调试器重新刷新总是能解决问题? 5) 此外,我们观察到,使用全局中断禁用: __asm volatile("cpsid i"); 会导致跳转失败,而逐个禁用中断则能可靠地工作: for (irqIndex = DMATCD0_IRQn; irqIndex<= SoC_IRQn; irqIndex++)     { IntCtrl_Ip_DisableIrq((IRQn_Type)irqIndex); IntCtrl_Ip_ClearPending((IRQn_Type)irqIndex);     } 请问在这种情况下,全局中断禁用为何会影响跳转行为? S32DS-ARM S32K3 顺祝商祺! 尤苏普 Re: Intermittent Bootloader → Application Jump Failure on S32K3 (Not Reproducible on All Boards) 你好@danielmartynek 感谢您的支持与见解。 您对 POR 无法恢复系统的观察帮助我们专注于非易失性存储器。 我们已确定根本原因是正在进行的闪存写入操作期间发生重置导致的 NVM(数据闪存)损坏。这会导致部分编程和无法更正的 ECC 错误,从而导致在早期启动时出现 HardFault。 我们通过重现问题并比较工作板和故障主板之间的闪存数据来验证这一点。修复了重置处理并确保 NVM 操作在重置之前完成后,该问题不再可重现。 感谢您提供的指导,帮助我们缩小范围。 此致, 尤苏普·汗
記事全体を表示
imx93におけるSD3.DATA0のUART2サポート こんにちは、 私たちのプロジェクトでは、i.MX93プロセッサを使用しています。以前のi.mx91搭載デバイスでは、SD3.DATA0用のUARTオプションがありましたが、i.mx93では以下の4つのオプションしか利用できないことがわかりました。 パッドに使用する 4 つの iomux モードのうち 1 つを選択してください: SD1_STROBE。 000 - マルチプレクサモードを選択: ALT0 マルチプレクサポート: USDHC1_STROBE インスタンス: usdhc1 001 - マルチプレクサモードの選択: ALT1 マルチプレクサポート: FLEXSPI1_A_DQS (インスタンス: flexspi1) 100 - マルチプレクサモードを選択: ALT4 マルチプレクサポート: FLEXIO1_FLEXIO18 インスタンス: flexio1 101 - マルチプレクサモードの選択: ALT5 マルチプレクサポート: インスタンスのGPIO3_IO18: gpio3 これに関して、UARTマルチプレクサオプションを有効にする方法はありますか? よろしくお願いいたします。 アヌシュリー Re: UART2 support for SD3.DATA0 in imx93 いいえ、i.MX93 の SD1_STROBE (または SDx_DATA ピン) で UART マルチプレクサを有効にすることは、IOMUX テーブルに記載されていない場合はできません。 i.MX93では、ピン多重化オプションはハードウェアによって固定されており、リファレンスマニュアルに記載されています。 SD1_STROBE(またはSDx_DATA)ピンにはUARTの代替機能が含まれていないため、ソフトウェア設定によってこれらのピンにUARTをマッピングすることはできません。 これはi.MX91とは異なり、i.MX91では一部のUART多重化オプションがSDHCピンで利用可能でした。 代替案として、以下をご利用ください。 ネイティブLPUARTピン、または FlexIO(UARTエミュレーションが許容される場合)
記事全体を表示
マルチタスクのプリエンプションによりMAC生成に異常が生じた SOCモデル:S32G399A、RTDバージョン4.0.2、HSEバージョン2.22.0、コンパイラ:GHS SecOC機能を実装する際、顧客はHSEを使用してMACアドレスを生成しました。このプロジェクトでは、同じコア上の複数のタスクで同じキースロットが使用され、MACアドレスはCrypto_ProcessJob()関数を呼び出すことで生成されました。CANパケットを監視したところ、MACアドレスが更新されない異常が時折発生することが判明しました(パケットデータは更新されましたが、MACアドレスは更新されず、関数はE_OKを返しました)。 1. 添付ファイル「MAC value not updated.png」は、問題が再現された際にCANメッセージのMAC値に対応する信号が更新されていないことを示す波形図です。 2. 添付文書「S32G_MAC Generation Anomaly Analysis.7z」は、この異常に関するプロジェクトコードの概要です。 テストの結果、MAC生成関連の処理を同一タスクにまとめることで、MACが更新されない問題が解消されることが明らかになった。現在の分析では、この異常は複数のタスクでグローバルデータが上書きされることが原因である可能性が示唆されている。 MACアドレスを生成するためにcryptoを呼び出すという現在のマルチタスク機能を維持するために、 cryptoドライバを更新するか、設定を再構成することでこの問題を解決することは可能でしょうか? Re: 多任务抢占导致MAC生成异常 こんにちは、 @RoseRice こんにちは。暗号化ドライバの観点から言うと、関連するAPIは後続バージョンでも変更されていません。トラブルシューティングの履歴を見ると、CSMレイヤーで競合状態を解決するのが良いと思います。これはCSMレイヤーの定義にも合致しています。 BR チェイン
記事全体を表示
EMIOS/IPWM测量PWM的频率 您好:         我现在使用IPWM模式去测量外部的PWM脉冲,实际测试中我发现当我满足测量低频的PWM信号要求时几HZ的频率,测量高频的PWM信号误差会非常的大,当满足高频信号的测量精度,则测量低频信号会出现溢出事件,有没有什么办法可以让我同时满足低频和高频PWM脉冲的测量。希望能得到些许建议。 Re: EMIOS/IPWM测量PWM的频率 IPWM 定时器值为 16 位 65536。因此,您可能需要更改 5Hz 和 30KHz 的值设置,因为 5Hz 和 30KHz 之间的动态频率范围相当大 Re: EMIOS/IPWM测量PWM的频率 当我实现稳定采集3-10HZ的PWM脉冲,测量30KHZ甚至40KHZ时误差可能会超过20% Re: EMIOS/IPWM测量PWM的频率       我现在想要实现5HZ-30KHZ的PWM脉冲采集(占空比50%),当前配置我获取到的5HZ情况下的周期为50000所以我的相对应的时钟频率大致为250000此时我采集30KHZ的PWM脉冲获取的周期为8,9,此时换算过来频率为27777-31250,误差是比较大的如果我想提高采集精度就需要减小Clock Divider Value;Master Bus Prescaler;Master Bus Alternate Prescaler的值,相应的当测量5HZ时就可能会出现溢出事件,不知道我的理解是否正确。 Re: EMIOS/IPWM测量PWM的频率 Hi@xuanming 请看一下这个帖子,如果还有任何问题,请告诉我、 https://community.nxp.com/t5/S32M-Knowledge-Base/S32M27x-S32K3-eMIOS-Usage/ta-p/2129760 Re: EMIOS/IPWM测量PWM的频率 PWM 测量误差有多大?在测量 PWM 脉冲宽度(例如预分频器值等)时,您可能需要检查所依赖的计数器总线通道。
記事全体を表示