概述
BeagleBone(及其底层 TI Sitara SoC)最独特的功能是其 PRU,它们是与 ARM 内核完美集成的实时微控制器。您有两个选项可以对 PRU 进行编程:
基础用法
要将编译后的固件加载到 PRU 中,首先将编译后的代码复制到 /lib/firmware 中:
示例
PRU 固件源的最小工作示例如下:
PRU 可以通过操作寄存器 #30 中的位,在单个周期内直接切换 BeagleBone 的 GPIO 引脚子集。 该寄存器在 C 中公开为 __R30,因此,修改该寄存器的内容会直接触发一个或多个 GPIO 引脚状态的更改。
编译 PRU 固件
可以使用官方 TI 工具链(clpru 编译器和 lnkpru 链接器)或 PRU 的 GCC 前端为 PRU 编译此代码。 我还没有尝试过 GCC,所以让我们坚持使用 TI 工具链。 上面的最小生成文件如下所示:
这将执行以下操作:
这会将 C 源代码编译成一个对象,然后,将该对象与一个特殊的链接器命令文件 (AM335x_PRU.cmd) 链接起来,以创建一个 PRU 可以执行的完整固件。该固件名为 am335x-pru0-fw。
配置 GPIO 引脚
在上面的例子中,我们想让 PRU 通过它的 __R30 寄存器来控制 P9_31。为此,我们必须确保 P9_31 配置为公开其 PRU 输出模式功能:
开始代码
并通过查看 LED 确认它以四分之一秒的时间间隔闪烁来验证它是否正在运行:
或者让 Linux 检查它的状态:
如果状态仍处于离线状态,则存在问题。检查 journalctl 是否有错误:
在上面的示例中,我尝试启动缺少资源表数据结构的代码。
PRU GPIO
PRU 可以通过 __R30 和 __R31 寄存器直接访问 BeagleBone Black 上可用的 GPIO 子集。这是一个方便的花花公子表,将这些寄存器中的低位映射到 BeagleBone Black 上的物理头管脚:
直接通用输出
如果您想在 pru0 上运行代码并使用 __R30 的第 0 位打开 LED(就像我们在 hello world 示例中所做的那样),上表说明您应该将 LED 插入 P9_31。 不过,要在 pru1 上运行相同的代码,您必须将 LED 插入 P8_45。 不经修改就不能在两个 PRU 上运行相同的固件,这有点烦人,但这就是 BeagleBone Black 的接线方式。
直接通用输入
在上面的 hello world 示例中,我们看到可以通过翻转 __R30 中的第一位来打开连接到 P9_31 的 LED:
PRU UART
初始化
发送数据
接收数据
PRU 中断控制器
详情参阅 亚图跨际