Funpack3-5-基于BeagleBone® Black使用PRU实现LED呼吸灯
该项目使用了BeagleBone® Black,实现了使用PRU制作LED呼吸灯的设计,它的主要功能为:基于BeagleBone® Black,使用PRU控制一个LED实现呼吸灯,并且使用一个按键按下后切换闪烁的速度。
标签
Funpack活动
Linux
BeagleBone® Black
taotie
更新2025-01-15
12

一、项目介绍

本项目旨在设计一个基于BeagleBone® Black的系统,该系统使用PRU控制一个LED实现呼吸灯,并且使用一个按键按下后切换闪烁的速度。

二、硬件介绍

BeagleBone® Black(简称BBB)是一款由BeagleBoard.org基金会开发的开源硬件单板计算机(SBC)。它基于Texas Instruments(TI)的AM335x系列处理器,具有强大的处理能力和丰富的外围设备接口,适用于各种嵌入式系统和物联网(IoT)项目。

三、设计思路

PRU是“Programmable Realtime Unit”的缩写,意为“可编程实时单元”。这是一种专用的微控制器,集成在某些德州仪器(Texas Instruments,简称TI)的处理器中,如AM335x系列和AM43x系列处理器。PRU设计用于执行实时任务,能够直接控制处理器的外设,而不需要中央处理单元(CPU)的干预,从而实现快速响应和低延迟。

系统需要使用PRU控制LED来实现呼吸灯,并且使用一个按键按下后切换闪烁的速度,故设计以下流程图

四、代码分析

本项目代码基于BeagleBone® Black中的pru的例程inputR31.pru0.c上有所修改,下面是对修改后的代码作简要分析。

#include <stdint.h>
#include <pru_cfg.h>
#include "resource_table_empty.h"
#include "prugpio.h"

stdint.h:标准整数类型头文件。

pru_cfg.h:PRU配置头文件。

resource_table_empty.h:空资源表头文件,用于PRU程序。

prugpio.h:PRU GPIO操作头文件。

volatile register unsigned int __R30;
volatile register unsigned int __R31;

定义了PRU的两个寄存器,用于存储PRU程序的输入和输出。

void delay_(signed int m)
{
for(;m>0;m--)
__delay_cycles(1);
}

定义了一个延迟循环函数,用于获取需要的延迟时间,为后面实现呼吸灯做准备。

下面是主函数,也就是本次项目的核心代码。

void main(void) {
uint32_t *gpio1 = (uint32_t *)GPIO1;

/* Clear SYSCFG[STANDBY_INIT] to enable OCP master port */
CT_CFG.SYSCFG_bit.STANDBY_INIT = 0;
signed int aaa=0;
signed int aa;
signed int a4;
signed int a;
while(1) {

for(a=1;a<50;a+=1)
{
for(aa=1;aa<10000-1000*aaa;aa++)
{
if(__R31 & P9_25){if(aaa>7)aaa=0;else aaa+=2;delay_(100000);}
gpio1[GPIO_SETDATAOUT] = USR3;
delay_(50-a);
gpio1[GPIO_CLEARDATAOUT] = USR3; // Turn off LED
delay_(a*a);
}

}
for(a=49;a>0;a-=1)
{
for(aa=1;aa<10000-1000*aaa;aa++)
{
if(__R31 & P9_25){if(aaa>7)aaa=0;else aaa+=2;delay_(100000);}
gpio1[GPIO_SETDATAOUT] = USR3;
delay_(50-a);
gpio1[GPIO_CLEARDATAOUT] = USR3; // Turn off LED
delay_(a*a);
}

}
}
__halt();
}

在主函数中,首先定义了一个指向GPIO1的指针 gpio1,然后清除 CT_CFG.SYSCFG_bit.STANDBY_INIT 位,以启用OCP(On-Chip Peripheral)总线主端口。然后定义了一系列变量,读取了P9_25引脚上的值,并通过之前的循环延迟函数来更改LED闪烁的占空比变化速度,然后实现了按键控制呼吸灯。

下面是对引脚的初始化

const char init_pins[] =  
"/sys/class/leds/beaglebone:green:usr3/trigger\0none\0" \
"/sys/class/leds/beaglebone:green:usr1/trigger\0none\0" \
"/sys/class/leds/beaglebone:green:usr2/trigger\0none\0" \
"/sys/class/leds/beaglebone:green:usr0/trigger\0none\0" \
"/sys/devices/platform/ocp/ocp:P9_25_pinmux/state\0pruin\0" \
"\0\0";

本次实验中只用到了LEDuser3,初始化其他LED以便于观察LED3的变化。

五、实物展示

可以看到LED亮度的变化

873005605fbae5228387468ea24a8e42.jpeg

b21d988fc5078537aaa63a17aba9ef6c.jpeg

9a40d0d09d44b81f8cc723cd24e4ebe6.jpeg

六、心得体会

通过本次活动,我学会了控制BeagleBone® Black的基本操作,并自己制作了一个通过PRU控制的LED呼吸灯,感谢硬禾学堂和Digitkey的支持。


附件下载
inputR31.pru0.c
团队介绍
小田
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号