微控制器一种高成本效益的方法及构建、UART器件

在过去的几十年中,微控制器的内部外围设备发生了巨大变化。最初,许多微控制器只包含 RAM、ROM,也许还有一个基本定时器。随着微控制器的发展,设备中内置了更多外围设备,每个设备的成本不到一美元。定时器/计数器、PWM 和标准串行接口(包括 UART、SPI 和 I2C)通常用于这些廉价的微控制器中。另一个重大变化是 32 位 CPU 正在取代相同价格范围内的 8 位设备。

但即使拥有如此丰富的功能集,微控制器供应商也无法快速支持的廉价微控制器始终存在项目特定的硬件接口或新的第三方接口。这通常要求设计人员使用外部硬件或通过位拆分在固件中实现接口。分位使用固件触发IO口,一般可以用来实现串口。当监视端口以解码串行数据时,也可以使用此方法。无论接口是使用外部硬件还是位拆分来实现,都会产生额外的设计成本。虽然添加外部硬件的成本是显而易见的,但在软件中实现串行接口可能还需要使用更快且因此更昂贵的 CPU。

目前大多数通用微控制器都支持 SPI、UART 和 I2C 接口,但仍有很多时候一些内部用户可编程逻辑非常有用。包括 Atmel、Cypress、Microchip 和 NXP 在内的几家公司已在其部件中添加了一些用户可定义的逻辑来解决其中的一些问题。这些设备主要是带有附加逻辑的微控制器。CPU仍然是主要的处理设备,附加逻辑的作用是提高CPU的工作效率。此类设备常见于对成本敏感的产品中,但也用作低级任务中的小型协处理器,以减轻主处理器的负担,从而提高效率。

另一方面,FPGA 正朝着类似的目标前进,尽管是从另一个方向。多年来,Xilinx 和 Altera 一直在添加硬核和软核处理器来创建片上系统。FPGA 方法通常更昂贵,但如果项目需要大量自定义逻辑,它是一种具有成本效益的方法。这些设备对于 ASIC、小批量产品的原型设计非常有价值。这些类型的应用程序的上市时间至关重要,而大型产品则需要持续的硬件灵活性。

微控制器与逻辑配对,FPGA 与 CPU 配对,这两种设备类型都在现场提供了硬件灵活性。一旦基于闪存的设备成为常态,现场升级将成为常态。最初设计人员只能升级固件,但现在硬件(逻辑)和固件都可以在现场轻松升级。通过重新编程设备的固件和硬件,可以对从计算机鼠标到高速网络路由器的设备进行现场升级。

上面提到的所有四家公司(Atmel、Cypress、Microchip 和 NXP)都提供“胶水”逻辑来帮助卸载主处理器或消除对外部逻辑的需求。每家公司在提供的逻辑模块类型以及这些逻辑模块如何相互连接以及与定时器、UART 和 IO 引脚等板载模块的互连方式方面都采取了不同的方法。

因此,有必要了解这些供应商如何实现内部可编程逻辑d触发器的逻辑功能,以便做出最佳决策,选择最适合其项目的解决方案。一个简单的内部 AND 或 OR 门控足以避免外部组件,或提高 CPU 性能。所有四种方法都支持使用自定义逻辑选通输入和输出信号。这种方法使用时钟门控输入来使用计数器测量外部时钟的频率。所有四种类型的逻辑块都支持的一个简单示例是调制 UART 输出以用于 IR 通信的方法。在此示例中,不仅有如下图所示的内部与门,而且还能够将来自时钟或计数器的信号和 UARTTX 输出路由到与门。

简单调制UART

AtmelXMEGA 自定义逻辑 (XCL)

AtmelXCL 模块有两个内置 LUT(查找表)模块,支持两个 8 位定时器/计数器模块。这两个 LUT 不必连接到定时器/计数器模块,而是连接到 UART、EVENT 模块或 IO 引脚。这两个 LUT 可用作两个独立的 2 输入单元或单个 3 输入单元。逻辑块可以配置为组合逻辑,例如 AND、NAND、OR、NOR、XOR、XNOR、NOT 或 MUX 功能。它们还可以配置为时序逻辑功能,例如 D 触发器、D 锁存器或 RS 锁存器。这些简单的 LUT 模块能够方便地与其他逻辑模块和 IO 引脚互连,从而方便设计人员避免使用某些外部逻辑,或节省 CPU 周期。例如,Atmel XCL 模块应用笔记(AT01084) 解释了如何配置 XCL 模块以避免对 UART 输出进行曼彻斯特编码,而不会产生额外的 CPU 开销或使用外部逻辑。AVRXMEGAE 设备有一个内置的 XCL 模块。

Atmel 的 XMEGA 自定义逻辑 (XCL)

Microchip 可配置逻辑单元 (CLC)

MicrochipCLC 允许用户从八个输入中选择最多四个信号。这些输入可以是两个 IO 引脚、内部时钟、外设或寄存器位的组合。然后将这四个信号路由到可编程逻辑块中。逻辑块可以编程为 AND-OR、OR-XOR、4 输入 AND、SR 锁存器的 8 种组合之一,也可以配置为 4 种其他触发器组合之一。Microchip 在其 Configurable Logic Cell Tips and Tricks 应用笔记中提供了一些示例。其中一个示例显示了如何配置这些模块来解码正交信号。如果没有这些额外的逻辑块,CPU 将需要以更高的速率对信号进行采样,以避免处于转换阶段的信号发生虚假旋转,从而使 CPU 仅被有效转换中断。

Microchip 的可配置逻辑单元

恩智浦模式匹配引擎

NXP 提供的用户可配置逻辑称为模式匹配引擎。此逻辑块的输入可以选择多达 8 个 GPIO 输入。这八个输入可以为复杂的布尔表达式生成乘积项。这些输出可用于触发中断、驱动特殊 IO 引脚或路由到下一个逻辑块或片。其他功能支持上升或下降信号和反相信号的边沿检测。此附加硬件配置为仅在发生复杂(或简单)事件组合时才中断 CPU。NXPLPC81x 器件具有内置模式匹配引擎。

NXP 引脚中断/模式匹配引擎

赛普拉斯 PSoC 通用数字模块 (UDB)

赛普拉斯通过使用通用数字模块或 UDB 采用更先进的方法来区分其他三个供应商的方法和上述 FPGA。一个 UDB 由两个 12C4PLD 和一个数据路径组成。PLD 可用于控制数据路径和数据流的操作,也可用作通用逻辑和状态机。数据路径是一个定制模块,提供 8 位函数(AND、OR、ADD、SUB、INC、DEC、XOR)、移位函数(左和右)和两个用于数据排队的 4 字节 FIFO。这些模块也可以组合起来提供 16 位、24 位或 32 位功能。

UDB 的输入和输出可以路由到任何 GPIO、外设/组件 IO、中断等。UDB、固定功能模拟和数字模块以及 GPIO 之间的互连使用数字信号接口 (DSI) 处理。UDB 可以被编程以执行任何功能,从简单的逻辑门到计数器和 PWM 以及通用串行接口,例如 UART 和 I2C 外设。

图片[1]-微控制器一种高成本效益的方法及构建、UART器件-老王博客

至于使用 UDB 实现设计,用户可以从多种选项中进行选择。可以在原理图中布置简单的逻辑门,或者可以在 Verilog 中实现设计。还提供自定义图形界面,无需使用 Verilog 即可进行设计。PSoC3、PSoC4 和 PSoC5 系列微控制器可以包含 4 到 24 个这些逻辑块 (UDB)。

自定义接口实例

最近我注意到 Worldsemi 的一些有趣的 RGB LED。部件号是 WS2811、WS2812 和 WS2812B,但它们的工作方式相同。只需一个 GPIO 引脚,您就可以驱动 1,000 个或更多这样的部件。这很有趣,因为我能够用一个 GPIO 引脚控制如此大量的 RGBLED。连接这些 LED 的接口不是 SPI、UART 或 I2C,而是自定义接口。通信信号是异步的,每一位都以上升沿开始。数据为 1 或 0 由高脉冲长度决定​​,如下图所示。

WS2811/12数据0/1时序

每个部分需要 24 位数据,每种颜色(红、绿、蓝)为 8 位,格式如下。

WS2811/12 数据格式

WS2811/12 部件使用 DIN(数据输入)和 DOUT(数据输出)信号以方便串行连接。每个部分保留它看到的前 24 位数据,然后在 DOUT 引脚上输出剩余的数据,见下图。

连接多个 WS2811/12 部件

当数据流开始时,每个组件都会看到连续的数据流。如果数据信号的上升沿不超过 50 微秒,则该部分锁存数据,将接下来的 24 位数据视为自己的数据,并重新发送其余数据。

可以看到,原理并不复杂,但并不容易适应标准的单片机硬件。我确实发现有人使用 SPI 接口来维持时序,但这需要每个实际数据位至少三个 SPI 数据位,这对于从位拆分中获得 CPU 性能并没有太大优势。由于时序并不重要,如果您在固件中实现接口(位拆分),CPU 将专门用于翻转驱动信号,直到 LED 全部更新。这意味着您需要在整个过程中禁用所有中断并且不响应任何其他输入。如果您有 1,000 个 LED,则更新时间为 (0.40 微秒+0.85)*24bits*1,000LEDs=30,000 微秒或 30ms。这可能不是问题,但如果您以 30Hz 的频率更新 LED,

在编写代码时,我习惯于避免阻塞代码或必须长时间禁用中断的情况,尤其是在系统具有用户界面或需要与其他处理器通信的情况下。我的目的是尽可能减轻 CPU 的重量,让硬件完成大部分工作,这在当今内部 UART 或 SPI 模块中很常见。赛普拉斯 PSoCUDB 有几个特性使这项工作变得非常容易。每个 UDB 在数据路径中有两个 4 字节 FIFO 和一个移位器。在实现 UART 时,您可以使用一个 FIFO 作为 TX 缓冲区,而另一个作为 RX 缓冲区。对于 WS2811/12,我只需要一个输出 FIFO 和移位器。我决定将硬件配置为每次为每个设备生成一个中断。中断处理程序将加载 24 位(3 个字节)的数据,并在 FIFO 为空时返回。使用这种方法,可以每 30 微秒产生一次中断,而不必以 150 纳秒或更短的时间间隔禁用所有中断和位剥离。我决定使用的微控制器是 Cypress PSoCCY8C4245AXI。该微控制器的大批量价格约为 1 美元,有四个运行频率为 48MHz 的 UDB,对于这项工作来说,速度和硬件已经绰绰有余。

该设计使用 PSoC 提供的四个 UDB 中的两个。一种用于使用 FIFO 缓冲和移位数据,以便可以一次写入每个设备的所有 24 位(3 个字节)。第二个 UDB 使用两个比较输出创建一个 PWM。一个比较输出用于创建逻辑 0,另一个用于创建逻辑 1。此串行数据可用于控制数字多路复用器,选择波形 1 或 0。请参见下面的框图。

使用 PSoCUDB 的 WS2811/12 接口框图

UDB 中四个 PLD 的大部分乘积项(每个 UDB 2 个)可用于控制数据通路、产生中断、提供状态和控制功能,但这也使用了这个低成本微控制器中一半的 UDB 资源。

下一项工作是确定这个额外的硬件可以节省多少 CPU 开销。以 1000 个 LED 的阵列为例,刷新率为 30Hz。如果设计使用固件对接口进行位分割,将占用几乎 100% 的 CPU 资源。使用 PSoC 器件中的可编程硬件仍然可以每 30 微秒中断一次,虽然这也是一个较重的负载,但运行在 48MHz 的 ARM Cortex-M0 就足够了。为了测试 CPU 开销,我创建了一个简单的循环来以大约 30Hz 的频率刷新显示。在主循环中,我触发一个引脚,然后用示波器统计40ms内的触发次数。然后我禁用中断,再次运行项目,并比较结果。与使用固件中的位拆分几乎 100% 的 CPU 使用率相比d触发器的逻辑功能,持续的显示刷新仅占用大约 12% 的 CPU 资源。这使得另外 88% 的 CPU 周期可用于外部通信和用户界面。如果将 DMA 添加到设计中,此开销可能会从 12% 下降到 2% 或更少。我用过的最便宜的 PSoC(约 1 美元)只有 UDB,但没有 DMA,尽管一些较大的部件确实内置了 DMA。

然后我实际上制作了一个由 60×16 LED(960 LED)网格组成的真正的 RGBLED 板来测试组件。该组件的行为符合预期,可用作显示基本线条、矩形、圆形和文本的图形界面。

由 960 个 RGBLED 制成的广告牌

无论是大型 LED 板还是简单的自定义接口,一些内部可编程硬件都会对设计性能产生重大影响。并非每个自定义接口都需要多字节 FIFO 或完整的硬件状态机,但拥有这种灵活性可以为您提供更多设计选项、提高性能或快速使现有设计适应生产需求。

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论