Funpack3-5使用beagleboard black内置PRU来使用按键控制板载LED
该项目使用了beagleboard black,实现了PRU控制LED的设计,它的主要功能为:通过开发板内的PRU来控制板载LED实现呼吸灯功能,并通过按键修改呼吸灯的频率。。
标签
Funpack活动
按键控制
呼吸灯
PRU
beagleboard black
饺子sama
更新2025-01-13
94

项目描述

项目使用了beagleboard black,实现了PRU LED的设计,主要功能为通过开发板内的PRU来控制板载LED实现呼吸灯功能,并通过按键修改呼吸灯的频率。

软件流程图及各功能对应的主要代码片段及说明

image.png

代码分为两部分,第一部分是主程序部分,这里的功能是通过检测P_30引脚的寄存器,如果按钮状态发生改变,则修改呼吸灯频率,并驱动LED以指定频率来控制板载呼吸灯。由于PRU并没有PWM功能,因此这里需要完全靠代码来实现PWM控制。这里我将亮度步长定义为100,通过在100个循环周期中点亮LED和关闭LED的时间占比差异来实现软件PWM控制:

////////////////////////////////////////
// Reads input in P9_30 via the R31 register and blinks the USR3 LED
// Wiring: A switch between P9_30 and 3.3V (P9_3 or P9_4)
// Setup: config-pin P9_30 pruin
// See: prugpio.h to see which pins attach to R31
// PRU: pru0
////////////////////////////////////////
#include <stdint.h>
#include <pru_cfg.h>
#include "resource_table_empty.h"
#include "prugpio.h"

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

void delay(uint32_t t)
{
for(;t>0;t--)
__delay_cycles(1);
}

void main(void)
{
uint32_t *gpio1 = (uint32_t *)GPIO1;
CT_CFG.SYSCFG_bit.STANDBY_INIT = 0;

const uint32_t button_pin = P9_30;
const uint32_t init_delay_cycles = 10000;
uint32_t delay_cycles = init_delay_cycles;
uint32_t counter;
uint8_t last_button_state = 0;
int level;


while (1)
{
uint32_t button_state = __R31 & button_pin;
if (button_state && !last_button_state)
{
// Button was just pressed
delay_cycles /= 2; // Double the blink frequency
if (delay_cycles < init_delay_cycles / 2 / 2 / 2 / 2)
{
delay_cycles = init_delay_cycles;
}
}
last_button_state = button_state;

for(level=0;level<=100;level++)
{
for(counter=0;counter<delay_cycles;counter++)
{
gpio1[GPIO_SETDATAOUT] = USR0; // Turn on LED
delay(level);
gpio1[GPIO_CLEARDATAOUT] = USR0; // Turn off LED
delay(100-level);
}
}
for(level=100;level>=0;level--)
{
for(counter=0;counter<delay_cycles;counter++)
{
gpio1[GPIO_SETDATAOUT] = USR0; // Turn on LED
delay(level);
gpio1[GPIO_CLEARDATAOUT] = USR0; // Turn off LED
delay(100-level);
}
}
}
}

第二部分是配置引脚及LED功能,这部分代码可以重新配置板载LED及GPIO的功能,让我们可以通过pru来进行访问。

// Turns off triggers and sets pinmux
#pragma DATA_SECTION(init_pins, ".init_pins")
#pragma RETAIN(init_pins)
const char init_pins[] =
"/sys/devices/platform/leds/leds/beaglebone:green:usr0/trigger\0none\0" \
"/sys/devices/platform/ocp/ocp:P9_30_pinmux/state\0pruin\0" \
"\0\0";

功能展示及说明

上面的代码要想使用,需要先进入开发环境。把BBB开发板通过USB连接到电脑,电脑会自动识别一个网络设备,我们可以通过这个设备来访问到开发板。输入以下地址即可:

http://192.168.7.2/

然后进入下面文件夹,创建好代码文件,注意文件名要和下图一致,然后贴入代码即可。

image.png

外接的按钮接在P9_30引脚上,另一头接3.3V,可以使用P9_3或P9_4。

2350de557a323399e3f69148195baff.jpg

对本活动的心得体会

这次活动有机会体会到在国外很火,但国内并不常见的开发板BBB,非常有趣。

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