Funpack3-3---基于BeagleBone® Black的PRU呼吸灯
该项目使用了BeagleBone® Black,实现了PRU呼吸灯的设计,它的主要功能为:BeagleBone® Black控制PRU呼吸灯。
标签
Funpack活动
呼吸灯
FunPack3-5
BeagleBone® Black
PRU
冷月烟
更新2025-01-14
12

项目描述

项目介绍

点灯!使用PRU控制一个LED实现呼吸灯,并且使用一个按键按下后切换闪烁的速度

设计思路

参考官方文档完成即可。

硬件介绍

BeagleBone Black

BeagleBone Black 是一款面向开发人员和业余爱好者的低成本、高扩展、社区支持的开发平台,板卡处理器选用的是 TI 公司 AM3358 芯片, 处理器集成了高达 1GHz 的 ARM Cortex™ A8 内核,具有强大的处理能力并提供了丰富的外设接口BeagleBone® Black面向开源社区用户、开源硬件爱好者和任何对Arm Cortex-A8低成本处理器感兴趣的人而设计,配备精简,旨在为不需要搭建完整开发平台并想体验Arm处理器功能的用户提供入门的捷径。它配备了最低限度的外设,使用户能够体验处理器的强大功能,还提供了许多接口,用户还可以开发自己的电路板或添加自己的电路。

1722565549565.jpg

  • 处理器 TI Sitara 处理器:AM3358BZCZ100
    • 1GHz ARM® Cortex-A8 处理器
    • SGX 3D 图形引擎
    • NEON 浮点加速器
    • 2×32 位 200MHz 可编程实时单元 (PRU)
  • 内存
    • SDRAM:512MB DDR3L 800MHZ
    • 板载闪存:4GB,8 位嵌入式 MMC (eMMC)
  • 电源管理:使用 TPS65217C PMIC 和单独的 LDO 为系统供电
  • 调试支持: 可选板载 20 引脚 CTI JTAG、串行接头
  • 电源
    • miniUSB接口或直流插孔
    • 通过扩展头提供 5VDC 外部电源
  • 接口
    • 高速 USB 2.0 客户端端口: 通过 miniUSB 访问 USB0,客户端模式
    • 高速 USB 2.0 主机端口: 访问 USB1,A 型插座,500mA LS/FS/HS
    • 串行端口: UART0 通过 6 针 3.3V TTL 接头访问。接头已填充
    • 10/100M 以太网接口(RJ45)
  • 用户输入/输出
    • 复位按钮
    • 启动按钮
    • 电源按钮
    • LED 电源指示灯
    • 4 个用户可配置的 LED
  • 视频/音频接口
    • HDMI D 型接口
    • LCD 接口
    • HDMI 接口立体声音频
  • 2x 46 针针座扩展接口
    • LCD、UART、eMMC
    • ADC、I2C、SPI、PWM

软件部分

软件流程图

未命名绘图.drawio (1).png

PRU介绍

linux为我们提供了丰富的设备驱动程序;支持很多编程语言以及脚本语言,C,C++,shell,Python等等;还有以及一些丰富的库,比如Qt,OpenCV......

但是一般使用的linux都不是实时的,也就是不能够在限定时间内完成给定任务或者及时响应外部中断任务。由于内核中对于进程的调度不分优先级,原本应该及时的响应的任务,然而内核却让执行其他任务的进程时间片先执行完,才会回到我们的任务,导致任务执行的时间不具有可预测性。

为了解决这个问题大家也许可以想到各种各样的解决方案:可以移植其他的嵌入式实时系统到BBB上,可以搞裸机开发,可以外接一个单片机辅助处理,而AM335X处理器就相当自带了块单片机。

PRU = The Programmable Real‐Time Unit,在BBB的AM335X处理器中包含了2个32位的PRU,每一个PRU的运行频率是200MHz,另外每个PRU有8KB的instrction RAM和8KB的Data RAM,以及两个PRU之间有一块共享的12KB内存,每个PRU可以控制P8/P9上的部分IO口,可以触发一些中断,另外,BBB板子上面的512MB内存芯片是被PRU和CPU(或者称为host device)共享的,这给数据的传递带来大大的便利!总结为一句:PRU相当于一块内置于CPU中的200MHz的单片机。


主要代码片段及说明

配置文件

该部分代码主要实现配置P9_27引脚为pru输入引脚,关闭原有板子上四个LED的框架控制

#!/bin/bash

export TARGET=hello.pru0
echo TARGET=$TARGET

echo " Found"
    config-pin P9_27 pruin
    config-pin -q P9_27

echo none > /sys/class/leds/beaglebone\:green\:usr0/trigger
echo none > /sys/class/leds/beaglebone\:green\:usr1/trigger
echo none > /sys/class/leds/beaglebone\:green\:usr2/trigger
echo none > /sys/class/leds/beaglebone\:green\:usr3/trigger


代码文件

该部分代码实现了具体的业务逻辑,包括呼吸灯控制,按键输入检测

#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) {
    uint32_t sw;
    uint32_t i;
    uint32_t delayed;
    uint32_t *gpio1 = (uint32_t *)GPIO1;
    CT_CFG.SYSCFG_bit.STANDBY_INIT = 0;

    sw = 0x1<<5;    // P9_27
       
    while (1) {
        for(i=0; i<1000; i++)
        {
            gpio1[GPIO_SETDATAOUT] = USR0;  // Turn the USR0 LED on
            if((__R31&sw)){
                for(delayed=0; delayed < i; delayed++)
                    __delay_cycles(500/5);
            }
            else{
                for(delayed=0; delayed < i; delayed++)
                    __delay_cycles(1000/5);
            }
            gpio1[GPIO_CLEARDATAOUT] = USR0;    // Turn the USR0 LED on
            if((__R31&sw)){
                for(delayed=0; delayed < (1000-i); delayed++)
                    __delay_cycles(500/5);
            }
            else{
                for(delayed=0; delayed < (1000-i); delayed++)
                    __delay_cycles(1000/5);
            }
        }
        for(i=1000; i>0; i--)
        {
            gpio1[GPIO_SETDATAOUT] = USR0;  // Turn the USR0 LED on
            if((__R31&sw)){
                for(delayed=0; delayed < i; delayed++)
                    __delay_cycles(500/5);
            }
            else{
                for(delayed=0; delayed < i; delayed++)
                    __delay_cycles(1000/5);
            }
            gpio1[GPIO_CLEARDATAOUT] = USR0;    // Turn the USR0 LED on
            if((__R31&sw)){
                for(delayed=0; delayed < (1000-i); delayed++)
                    __delay_cycles(500/5);
            }
            else{
                for(delayed=0; delayed < (1000-i); delayed++)
                    __delay_cycles(1000/5);
            }
        }
       
    }
    __halt();
}

实现的功能及图片展示

工作模式


微信截图_20241227183859.png

后记

遇到的主要难题及解决方法

对本活动的心得体会

这次题目还是很有意思的,了解了AM335X处理器中PRU的开发方式,也为以后处理同时具有高性能和高实时要求的项目提供了思路

未来的计划或建议

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