2023年 beagle bone black教程3-点灯的三种方式

2024-01-07 03:40

本文主要是介绍2023年 beagle bone black教程3-点灯的三种方式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

beagle bone black点灯的三种方式

  • 1 基于上下拉的点灯
    • 1.1 终端控制
    • 1.2 代码控制
  • 2 基于电平控制的点灯
    • 2.1 认识引脚
    • 2.2 编程控制
  • 3 基于PWM的控制
    • 3.1 PWM引脚定义
    • 3.2 终端控制
    • 3.3 编程控制

1 基于上下拉的点灯

1.1 终端控制

在linxu中,为了控制引脚输出,我们需要各种初始化,比较麻烦。侯然想了一种方法:引脚是可以配置为上拉或下拉的,这样在默认的时候,它便输出高低电平。这样一句话就搞定。

引脚配置语句:

config-pin <pin> <filename> #配置引脚为对应filename的功能
config-pin -l <pin># 查询引脚支持的模式
config-pin -q <pin> #查看引脚目前配置模式

我们随便取一个引脚为:p9.14,先查询引脚当前模式和可以设置的模式

config-pin -q p9.14
config-pin  -l  p9.14

在这里插入图片描述
当前模式:默认 可以配置的模式:gpio_pu(上拉) / gpio_pu(下拉)
因此,我们将其配置为上拉,它就默认是高电平了。

sudo config-pin p9.14 gpio_pu

同理,我们将其配置为下拉,它就默认是低电平了。

sudo config-pin p9.14 gpio_pd

拿万用变测试一下确实ok。

1.2 代码控制

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <unistd.h>void led_on(void)
{system("config-pin p9.14 gpio_pd");
}void led_off(void)
{system("config-pin p9.14 gpio_pu");
}void main(void)
{while(1){sleep(1);led_on();sleep(1);led_off();} 
}

实际观察确实ok,就是终端一直输出如下数据,比较烦人
在这里插入图片描述

2 基于电平控制的点灯

2.1 认识引脚

老实讲,网上的beaglebone black的引脚图很多,但是!!!你得知道哪个是对的
在这里插入图片描述我们使用P9.16 作为led进行控制。它是GPIO_51。

首先我们先将引脚模式配置为gpio( gpio_pu 或者gpio_pd都行,就是默认上拉还是下拉)

config-pin p9.16 gpio_pu

其次,到gpio类中进行实现。

cd /sys/class/gpio/
 echo 51 > export #变成用户可用的状态
cd gpio51
echo out > direction
echo 1 > value //高电平echo 0 > value //低电平

观察没有问题。

2.2 编程控制

我这里用了三个引脚进行操作,其中两个LED,一个蜂鸣器。

引脚编号用途
P9.14gpio50LED0
P9.16gpio51LED1
P8.19gpio22BEEP

你要问我这LED和蜂鸣器哪里来的? 我在板子上外接的。你们没有就用万用表去测也行,就是不那么直观…

控制LED和蜂鸣器每过一段时间亮/响一下,代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>char export_path[]="/sys/class/gpio";
char led0_path[]="/sys/class/gpio/gpio50";
char led1_path[]="/sys/class/gpio/gpio51";
char beep_path[]="/sys/class/gpio/gpio22";#define led0_on()  file_config(led0_path,"value","0")
#define led0_off() file_config(led0_path,"value","1")
#define led1_on()  file_config(led1_path,"value","0")
#define led1_off() file_config(led1_path,"value","1")
#define beep_on()  file_config(beep_path,"value","0")
#define beep_off() file_config(beep_path,"value","1")static void  file_config(char* path,char* file,const char* val)
{char file_path[100];//文件路径 = 文件夹路径 + 文件名sprintf(file_path,"%s/%s",path,file);int fd = open(file_path, O_WRONLY);int len=strlen(val);if (len != write(fd, val,len)) {perror("write error");printf("%s\r\n",file_path);}close(fd); //关闭文件}int main(void)
{printf("hello\r\n");int ret;system("config-pin p9.14 gpio_pu");//led0 默认不亮system("config-pin p9.16 gpio_pu");//led1 默认不亮system("config-pin p8.19 gpio_pd");//beep 默认不响if(access(led0_path,F_OK)==-1)判断不存在file_config(export_path,"export","50");if(access(led1_path,F_OK)==-1)file_config(export_path,"export","51");if(access(beep_path,F_OK)==-1)file_config(beep_path,"export","22");file_config(led0_path,"direction","out");file_config(led1_path,"direction","out");file_config(beep_path,"direction","out");led1_off();while(1){led0_off();sleep(1); led0_on();sleep(1);     }return 0;}

3 基于PWM的控制

3.1 PWM引脚定义

上边的控制方式是比较通用的,但是偶尔也会出现bug,比如没有操作权限。但是使用PWM就不会有该问题,因为只需要往里面输入数据就行。

本人所使用的镜像为2020年的debian 10.3,且为flash版本。

引脚定义为:

9.14pwm4 :0
9.16pwm4:1

查看pwm引脚定义:bb.org-overlays/cape-unversal-pwm.txt at master · beagleboard/bb.org-overlays (github.com)

不管版本如何,我们都可以使用以下指令查看引脚属于哪个pwm
使用以下指令查看引脚属于哪个pwm

#P9.21/P9.22
#ls -lh /sys/devices/platform/ocp/48300000.epwmss/48300200.pwm/pwm/#P9.14/P9.16
#ls -lh /sys/devices/platform/ocp/48302000.epwmss/48302200.pwm/pwm/

我们查看p9.14
在这里插入图片描述
如图,说明p9.14 和p9.16是属于pwmchip4 。至于具体哪个是4.0 和4.1 需要测试一下。

3.2 终端控制

首先,查询引脚现在模式以及可以配置的模式

 config-pin -l  p9.14config-pin -l  p9.16config-pin -q  p9.14config-pin -q  p9.16

在这里插入图片描述
可以看到,现在模式为gpio_pu(这是是啥都不重要) 以及可以配置的模式(包括pwm)。

将引脚配置为pwm模式

config-pin   p9.14 pwm
config-pin   p9.16 pwm

在这里插入图片描述
PWM接口已经配置好了!

进入pwm对应的类文件夹中。

cd /sys/class/pwm/
ls

在这里插入图片描述

可以看到pwm4:0和pwm4:1 已经被系统导出,就不需要我们导出了。可以直接操作对应功能了。

cd pwm-4:0
ls

在这里插入图片描述

这里只需要关注几个参数

参数说明
period一个周期的总时间大小
duty_cycle周期里有效输出的时间
enable使能
polarity输出极性 0:有效输出为高电平(默认)
1:有效输出为高电平

假如说,我们要输出50%的占空比。可以将period设置为100,duty_cycle设置为50,enable=1

echo 100 > peroid
echo 50 > duty_cycle
echo 1 > enable

然后外部可以使用万用表去测电压(将是50%)。

3.3 编程控制

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>char export_path[]="/sys/class/pwm/pwmchip4";
char led0_path[]="/sys/class/pwm/pwm-4:0";
char led1_path[]="/sys/class/pwm/pwm-4:1";#define led0_on()  file_config(led0_path,"duty_cycle","100")
#define led0_off() file_config(led0_path,"duty_cycle","0")static void  file_config(char* path,char* file,const char* val)
{char file_path[100];//文件路径 = 文件夹路径 + 文件名sprintf(file_path,"%s/%s",path,file);int fd = open(file_path, O_WRONLY);int len=strlen(val);if (len != write(fd, val,len)) {perror("write error");printf("%s\r\n",file_path);}close(fd); //关闭文件
}void led0_set(int val)
{char temp[10];sprintf(temp,"%d",val);file_config(led0_path,"duty_cycle",temp);
}
void led1_set(int val)
{char temp[10];sprintf(temp,"%d",val);file_config(led1_path,"duty_cycle",temp);
}int main(void)
{printf("hello\r\n");int ret;system("config-pin p9.14 pwm");//led0 system("config-pin p9.16 pwm");//led1 if(access(led0_path,F_OK)==-1)判断不存在file_config(export_path,"export","0");if(access(led1_path,F_OK)==-1)file_config(export_path,"export","1");file_config(led0_path,"period","100");file_config(led1_path,"period","100");file_config(led0_path,"duty_cycle","100");//默认100%高电平file_config(led1_path,"duty_cycle","100");file_config(led0_path,"enable","1");//使能file_config(led1_path,"enable","1");while(1){static int a=0;a=a+5;led0_set(a);led1_set(a);sleep(1); if(a==50) a=0;}return 0;    
}

个人在外部连接了两个led,这两个引脚的电平,从0%增加到50%。不停往复。

gcc -o pwm pwm.c
./pwm

用pwm的好处是,执行不需要sudo权限。上边的gpio操作不给容易出问题。

另外,添加了一个蜂鸣器P8.19:pwm7.9

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdbool.h>
char export_path[]="/sys/class/pwm/pwmchip4";
char led0_path[]="/sys/class/pwm/pwm-4:0";
char led1_path[]="/sys/class/pwm/pwm-4:1";
char beep_path[]="/sys/class/pwm/pwm-7:0";#define led0_on()  file_config(led0_path,"duty_cycle","100")
#define led0_off() file_config(led0_path,"duty_cycle","0")#define beep_on()  file_config(beep_path,"duty_cycle","100")
#define beep_off() file_config(beep_path,"duty_cycle","0")static void  file_config(char* path,char* file,const char* val)
{char file_path[100];//文件路径 = 文件夹路径 + 文件名sprintf(file_path,"%s/%s",path,file);int fd = open(file_path, O_WRONLY);int len=strlen(val);if (len != write(fd, val,len)) {perror("write error");printf("%s\r\n",file_path);}close(fd); //关闭文件
}void led0_set(int val)
{char temp[10];sprintf(temp,"%d",val);file_config(led0_path,"duty_cycle",temp);
}
void led1_set(int val)
{char temp[10];sprintf(temp,"%d",val);file_config(led1_path,"duty_cycle",temp);
}int main(void)
{printf("hello\r\n");int ret;system("config-pin p9.14 pwm");//led0 system("config-pin p9.16 pwm");//led1 system("config-pin p8.19 pwm");//beepif(access(led0_path,F_OK)==-1)判断不存在file_config(export_path,"export","0");if(access(led1_path,F_OK)==-1)file_config(export_path,"export","1");file_config(led0_path,"period","100");file_config(led1_path,"period","100");file_config(beep_path,"period","100");file_config(led0_path,"duty_cycle","100");//默认100%高电平file_config(led1_path,"duty_cycle","100");file_config(beep_path,"duty_cycle","0");  file_config(led0_path,"enable","1");//使能file_config(led1_path,"enable","1");file_config(beep_path,"enable","1");while(1){static int a=0;static bool b=true;a=a+5;led0_set(a);led1_set(a);if(b)beep_on();else beep_off(); b=!b;sleep(1); if(a==50) a=0;}return 0;
}

蜂鸣器将隔1s响一次。

这篇关于2023年 beagle bone black教程3-点灯的三种方式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/578608

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

内核启动时减少log的方式

内核引导选项 内核引导选项大体上可以分为两类:一类与设备无关、另一类与设备有关。与设备有关的引导选项多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导选项。比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导选项,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导选项说明。大多数选项是通过"_

用命令行的方式启动.netcore webapi

用命令行的方式启动.netcore web项目 进入指定的项目文件夹,比如我发布后的代码放在下面文件夹中 在此地址栏中输入“cmd”,打开命令提示符,进入到发布代码目录 命令行启动.netcore项目的命令为:  dotnet 项目启动文件.dll --urls="http://*:对外端口" --ip="本机ip" --port=项目内部端口 例: dotnet Imagine.M

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念

【即时通讯】轮询方式实现

技术栈 LayUI、jQuery实现前端效果。django4.2、django-ninja实现后端接口。 代码仓 - 后端 代码仓 - 前端 实现功能 首次访问页面并发送消息时需要设置昵称发送内容为空时要提示用户不能发送空消息前端定时获取消息,然后展示在页面上。 效果展示 首次发送需要设置昵称 发送消息与消息展示 提示用户不能发送空消息 后端接口 发送消息 DB = []@ro

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

沁恒CH32在MounRiver Studio上环境配置以及使用详细教程

目录 1.  RISC-V简介 2.  CPU架构现状 3.  MounRiver Studio软件下载 4.  MounRiver Studio软件安装 5.  MounRiver Studio软件介绍 6.  创建工程 7.  编译代码 1.  RISC-V简介         RISC就是精简指令集计算机(Reduced Instruction SetCom

脏页的标记方式详解

脏页的标记方式 一、引言 在数据库系统中,脏页是指那些被修改过但还未写入磁盘的数据页。为了有效地管理这些脏页并确保数据的一致性,数据库需要对脏页进行标记。了解脏页的标记方式对于理解数据库的内部工作机制和优化性能至关重要。 二、脏页产生的过程 当数据库中的数据被修改时,这些修改首先会在内存中的缓冲池(Buffer Pool)中进行。例如,执行一条 UPDATE 语句修改了某一行数据,对应的缓