Funpack3-5: 使用beagleboard black中的PRU控制按键和LED
该项目使用了beagleboard black中的PRU,实现了按键和LED控制的设计,它的主要功能为:通过按键改变LED呼吸灯的频率。
标签
Funpack活动
PRU
呼吸灯控制
BBB开发板
小熊熊
更新2025-01-13
60

项目描述

项目使用了beagleboard black中的PRU模块,实现了按键和LED控制的设计,主要功能为通过按键改变LED呼吸灯的频率。

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

image.png

代码比较短,在运行前需要先配置一下引脚,使用以下两条命令可以修改:

config-pin P9_27 pruin
config-pin P9_30 pruout

引脚配置完成后,就可以直接编写代码:

/*
config-pin P9_27 pruin
config-pin P9_30 pruout
*/

#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 main(void)
{
CT_CFG.SYSCFG_bit.STANDBY_INIT = 0;

uint32_t delay_cycles = 200;
uint32_t previous_btn = 0;
uint32_t i;
uint8_t b;
while (1)
{
if (!previous_btn)
{
if (__R31 & P9_27)
{
previous_btn = 1;
delay_cycles = delay_cycles * 2;
if (delay_cycles > 1000)
{
delay_cycles = 200;
}
}
}
else
{
if (!(__R31 & P9_27))
{
previous_btn = 0;
}
}

for(b=0;b<255;b++)
{
for(i=0;i<delay_cycles;i++)
{
__R30 ^= P9_30;
uint8_t j = 0;
while (j < b)
{
j++;
__delay_cycles(1);
}
__R30 ^= P9_30;
j = 0;
while (j < 255-b)
{
j++;
__delay_cycles(1);
}

}
}

for(b=0;b<255;b++)
{
for(i=0;i<delay_cycles;i++)
{
__R30 ^= P9_30;
uint8_t j = 0;
while (j < 255-b)
{
j++;
__delay_cycles(1);
}
__R30 ^= P9_30;
j = 0;
while (j < b)
{
j++;
__delay_cycles(1);
}
}
}
}
}

代码的主要功能是在死循环中用while循环次数来控制延时,以此控制呼吸灯的频率;再通过判断按钮的状态来更改延时函数的循环次数。通过每次按下按钮将延迟函数的循环次数翻倍,以此实现呼吸灯的频率的减半;同时对呼吸灯的频率设定下限,也就是对循环次数设置上限,当触及上限时,把循环次数修正为初始值,就可以进入下一轮频率设定的循环。


代码注意要放在原本pru example文件夹下,这样才可以使用示例项目中的Makefile文件。同时,代码保存的文件名非常讲究,必须以.pru0.c结尾,这是在makefile里面规定好的。然后直接输入make命令,就可以完成自动的编译上传以及运行。

make TARGET=task1.pru0​

代码上传完成后会自动运行。

功能展示及说明

522ba19efa1b2fa1b15e993550f1c68.jpg

将按键和LED连接到面包板上,可以使用按键来控制LED呼吸灯的频率。具体参见视频。


对本活动的心得体会

这次活动的开发板把MCU和LINUX结合在一起使用,由Linux切换引脚复用的功能,非常新颖好玩。

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