问题标签 [lpc]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
embedded - 嵌入式 MCU 的 USB 设备设计
我正在使用需要以下 USB 功能的 LPC1788 开发产品:
- 固件下载(从主机 PC 到设备,而不是通过 USB 密钥)。
- 文件上传(从设备到主机)。
- 理想情况下,我们还可以从设备中获取一些信息,例如序列号等。
该设备应仅与自定义 Windows 应用程序一起使用,因此仅按原样使用大容量存储设备是行不通的。有相当多的数据要上传(200MB +),所以使用 USB 批量传输对我来说似乎是必要的。
解决这个问题的最佳方法是什么?我想我需要创建某种 USB 复合设备(?)。但是,我希望使用 nxpUSBlib 或 winUSB,这样我就不必通过 Windows 驱动程序验证过程......我有什么选择?也许有什么方法可以让大容量存储设备对 Windows 不可见?
谢谢!
短剑
serial-port - 带有 ARM keil 的 USB CDC
我想将 USB CDC 作为我项目的一部分,最简单的方法是什么?
我在 keil arm 中尝试了一些项目,但速度太慢,而且有很多问题!
c - Storing CRC into an AXF/ELF file
I'm currently working on a C program in the LPCXpresso (eclipse-based) tool-chain on Windows 7, an IDE with gcc targeting the an NXP Cortex M3 microprocessor. It provides a simple way to compile-link-program the microprocessor over JTAG. The result of a build is an AXF file (ELF format) that is loaded by a debug configuration.
The loaded program resides in Flash memory from 0x00000 to 0x3FFFB. I'd like to include a 4-byte CRC-32 at 0x3FFFC to validate the program at start-up. I added another section and use the gcc __attribute__
directive to access that memory location.
To compute and store the CRC-32 value, my plan was to use SRecord with the following post-build steps:
This creates a binary with a checksum (necessary for bootloader) and then computes the CRC over the used Flash memory, storing the CRC value at 0x3FFFC.
However, I don't think I can load the binary file using the debugger. There is a built in programming utility with LPCXpresso that can load the modified binary file, however, that doesn't let me debug. I believe I can then try to start a debugging session with the original AXF file using "attach-only" mode, however, this becomes cumbersome.
I've been able to use readelf to inspect the crc32_build
variable in the AXF file. Is there a way to edit the variable in the AXF file? Is there an industry-standard approach to inserting a CRC as a post-build step?
arm - 如何消除 CAN 中的 ACK 插槽错误?
我正在使用 CAN 总线连接两个 LPC2129 微控制器。立即从发送器发送消息,但在接收器侧,接收中断正在连续执行。
我在开始时收到 ACK 错误,因为它是接收中断的优先级较低的中断,但稍后接收中断将连续发生,并且即使我只从发送器发送一次,数据也将被正确接收。
更多细节是:
如何消除此 ACK 错误?
networking - 如果使用外部 DNS 服务器,uIP DNS 客户端会失败
我使用 uIP 堆栈将 HTTP 帖子发送到带有一些传感器数据的远程网络服务器。我使用 resolv.c(包含在 uIP 中)作为 DNS 客户端,将远程 Web 服务器域名解析为 IP 地址。只要我使用路由器 (192.168.1.1) 作为 DNS 服务器地址,一切都很好。但如果我尝试使用任何外部 DNS 服务器地址(例如 Google 的公共 DNS 服务器 8.8.8.8),则无法解析。路由器防火墙被排除在外,因为我尝试在手动配置网络设置并且工作正常的计算机上使用相同的外部 DNS 服务器。很长一段时间以来我一直对这个问题感到震惊,如果有人可以帮助我解决这个问题,我将不胜感激!
我的平台使用 RDB1768(基于 LPC1768)+ LPCxpresso。如果您需要任何进一步的信息,请告诉我。
arm - LPC1114重定向中断处理
LPC1114 引导加载程序(位置 0-0x2000)和用户应用程序(位置 0x2000-0x6000),其中引导加载程序使用轮询,用户应用程序使用中断。
说明 - 引导加载程序运行 systick 轮询正常,根据 systick 计数超时并跳转到 0x2000 处的用户应用程序,其中使用了 systick 中断。
问题
- 如果在跳转到用户应用程序之前在引导加载程序中调用了 __disable_irq(),则用户应用程序运行正常(未按预期使用中断,但至少它运行)。
如果在用户应用跳转前没有__disable_irq(),用户应用失败,在startup_LPC11xx.s 中的default_handler 结束。
添加了确定中断源的代码 - 这是一个 HardFault
c - 在 LPC1788 的 USB ISR 中使用 embOS 功能
我正在为 NXP LPC1788 微控制器开发软件,我正在使用 embOS RTOS。每当通过 USB 接收到消息时,我想使用 OS_PutMailCond() 函数将 USB 消息存储在处理函数正在等待的邮箱中。换句话说,我想让消息处理由中断驱动。
embOS 用户手册可以在这里找到。第 145 页描述了 OS_PutMailCond() 函数。
每当接收到 USB 消息时,它都会触发 LPC 上的 USB 中断服务例程,但是为了让 embOS 知道这是一个 ISR,我必须将 OS_EnterInterrupt() 和 OS_LeaveInterrupt() 分别放在 ISR 的开头和结尾。如果我想在其中调用 embOS 函数,包括 OS_PutMailCond(),这是必要的。
问题是,如果我将 OS_EnterInterrupt()/OS_LeaveInterrupt() 放在 USB ISR 中的任何位置,USB 将停止正常工作,并且 Windows 会通知我设备出现故障。
我不知道为什么会这样。我们已经尝试过类似的方法来处理 CAN 上的消息,如下所示,并且效果很好。
OS_EnterInterrupt() 和 OS_LeaveInterrupt() 在链接手册的第 252 和 253 页上进行了描述。从前者的附加信息部分:
如果使用 OS_EnterInterrupt(),它应该是在中断处理程序中调用的第一个函数。它必须与 OS_LeaveInterrupt() 一起使用,作为最后调用的函数。使用该功能有以下效果,它:
- 禁用任务开关
- 保持内部程序中的中断被禁用
编辑
我进行了进一步调查,发现在 USB ISR 中使用 OS_EnterInterrupt() 和 OS_LeaveInterrupt()(以及在引脚上检测到上升沿或下降沿时用于 GPIO 的其他 ISR)会导致操作系统错误。错误值为 166,表示“从 ISR 调用的具有高优先级的 OS 函数”。
如果我发现任何其他内容,我会更新。
c - LPC1788 微控制器间歇性地不发送 USB 消息
我正在为 NXP LPC1788 微控制器开发代码,我的部分工作是使基于它的产品与 USB 兼容。大部分工作都已完成,通常通过 USB 进行的通信几乎与通过 CAN 进行的通信一样好。
但是,我遇到的一个问题是,当从微控制器产生持续输出的 USB 消息时,这些消息非常接近发送,其中一些消息偶尔会丢失。
我正在使用基于WinUSB编写的自定义驱动程序来接收PC端的消息,我最初怀疑问题出在事物的接收端。但是,使用 USBLyzer,我现在确信问题出在发送端 - USBLyzer 日志与我从WinUsb_ReadPipe()得到的日志完全匹配。
LPC1788 使用 USB 2.0 全速协议,我已经确认使用探头以大约 12 MHz 的频率发送和接收信息,这是应该的。
该设备配置为使用两个端点:逻辑端点 2 IN 和逻辑端点 2 OUT。这两个都配置为批量传输,最大数据包大小为 64 字节。
我认为消息的发送间隔至少为 500-600 微秒(我在线程中引入了 500 微秒的人为延迟,消息传输所需的时间应该比这少得多)。这是关于我上周得到的;我现在无法检查,因为我的调试工具正在运行。
这是微控制器的 USB 初始化代码:
这是微控制器用于通过 USB 发送消息的代码:
编辑
为了了解正在发生的事情,这是一个从我的 USB 驱动程序的接收函数生成的日志文件(来自 USBLyzer 的那个实际上是相同的):
我应该在以下周期收到消息:
您可以从此日志中看到循环中的一些消息被跳过。
编辑 2
以下是 USBLyzer 生成的原始和过滤捕获日志的摘录。原始日志主要包含取消的请求,因为我的驱动程序是轮询驱动的并且使用超时。
原始日志:
过滤的日志:
c - 如何为 LPC1788 使用 USB DMA 引擎?
我正在为 NXP LPC1788 微控制器开发代码,最近我一直在尝试改进 USB 的工作方式。我目前对 USB 的问题是它被配置为从属模式,并且由于在正常操作中必须发送和接收大量消息,CPU 大部分时间都在处理 USB,这造成了瓶颈。
我一直试图通过从从模式配置切换到 DMA 模式来解决这个问题。我一直在使用示例项目来提供帮助,我认为我需要的大部分代码都已到位。
USB 初始化工作正常,和以前一样。问题是,一旦我尝试将 USB 消息发送到我在 DMA 模式下配置的端点(通过启用寄存器中的适当位EpDMAEn
),我就会得到该端点的 USB 系统错误中断。我能得到的唯一信息是:
如果在传输数据或获取或更新 DD 时发生系统错误(AHB 总线错误),则在该寄存器中设置相应的位。SysErrIntSt 是一个只读寄存器。
在程序的这一点上,我还没有触及 UDCA 或设置任何 DMA 描述符或类似过去初始化的任何东西。我相信,在我需要执行任何操作之前,一旦在 USB 总线上收到第一条消息,就会发生此错误。
我正在使用端点 2 IN 和 OUT,它们是双缓冲批量端点,最大数据包大小为 64 字节。
如果我不使用 DMA,我已经确认 USB 工作正常。
如果我通过初始化 DMA 引擎的过程但将端点配置为从属模式而不是 DMA 模式,我已经确认 USB 工作正常。
如果我使用默认配置,我已经确认Example Projects
-> NXP
-> LP17xx
->下的 USB 大容量存储示例可以正常工作:177x_8x CMSIS
但如果我将其更改为:
在USB硬件源文件的开头,我放了以下内容:
我使用以下代码初始化 USB 外围设备:
我的 USB 重置代码:
准备就绪后,它用于运行 USB:
最后,我的 USB 中断程序:
如果您可以在我的任何代码或可以在 LPC1788 上运行的工作示例程序中发现错误,我理想地寻找的是一种解决方案,该 LPC1788 演示了使用 DMA 引擎进行 USB 消息传输和接收。
我也很感激有关可能导致 AHB 总线错误的任何信息。
编辑
针对以下 Turbo J 的回答:
检查UDCA的地址。要求的对齐非常严格,256 字节的 IIRC,所以地址必须以 0x00 结尾作为 LDB。GCC 需要支持链接描述文件中的 USB_RAM 部分。
在我的 USB 硬件头文件中,我有:
LPC_PERI_RAM_BASE
值为 0x20000000UL。
在我的源文件中,我有:
USB_EP_NUM
32在哪里。
因此,我相信 UDCA 应该是一个 128 字节的数组,从 RAM 内存块的开头开始。
c - 微控制器中的图像接收
我已经购买了 LinkSprite JPEG 彩色相机和一个 LPC1768 mbed 微控制器。通过“LinkSprite”相机,我可以拍摄 jpeg 格式的图像,根据他们提供的教程,我可以传输并在桌面上查看这些图像。但我想在“LPC1768 mbed”微控制器中处理这些图像。例如,我想循环通过该图像的每一行和每一列来匹配一种颜色。谁能告诉我如何将整个图像接收到二维数组中,然后循环遍历数组以匹配红色等颜色。当我传输图像时,数据看起来像另一个问题。ff d8 ff e0 00 10 .........40 c6 81 90 b9 aa ee 68 19 ff d9。我知道 jpeg 图像以 ff d9 开头并以 ff d9 结尾。但是我如何在这些值中识别一个像素,我如何比较颜色是否与红色匹配???
摄像头拍照并逐字节传输图像的代码
在 JPEGCamera.cpp
}
有什么方法可以将图像字节存储在“processPicture”函数的数组中?有什么方法可以让我简单地读取存储的图像???