BeagleBone 可编程实时单元(PRU)控制 GPIO 和 UART

概述

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 中断控制器

详情参阅 亚图跨际

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值