一、项目介绍
本项目旨在设计一个基于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亮度的变化
六、心得体会
通过本次活动,我学会了控制BeagleBone® Black的基本操作,并自己制作了一个通过PRU控制的LED呼吸灯,感谢硬禾学堂和Digitkey的支持。