玩转树莓派(六)使用C语言 通过BCM2835库控制GPIO

玩转树莓派(六)使用C语言 通过BCM2835库控制GPIO

一、创建环境

因为BCM2835 Library在Raspberry Pi OS系统中没有内置,所以需要用户自行下载。

  • 新建CWorkSpace文件夹
  • 新建bcm2835文件夹
pi@raspberrypi:~ $ mkdir CWorkSpace
pi@raspberrypi:~ $ cd CWorkSpace/
pi@raspberrypi:~/CWorkSpace $ mkdir bcm2835
pi@raspberrypi:~/CWorkSpace $ cd bcm2835/
  • 下载bcm2835-1.50.tar.gz(BCM2835 Library)
pi@raspberrypi:~/CWorkSpace/bcm2835 $ wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.50.tar.gz
--2021-02-04 00:08:38--  http://www.airspayce.com/mikem/bcm2835/bcm2835-1.50.tar.gz
正在解析主机 www.airspayce.com (www.airspayce.com)... 192.185.48.187
正在连接 www.airspayce.com (www.airspayce.com)|192.185.48.187|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:252178 (246K) [application/x-gzip]
正在保存至: “bcm2835-1.50.tar.gz”

bcm2835-1.50.tar.gz                  100%[=====================================================================>] 246.27K  7.96KB/s  用时 23s     

2021-02-04 00:09:03 (10.5 KB/s) - 已保存 “bcm2835-1.50.tar.gz” [252178/252178])

pi@raspberrypi:~/CWorkSpace/bcm2835 $ ls
bcm2835-1.50.tar.gz
  • 解压缩bcm2835-1.50.tar.gz
pi@raspberrypi:~/CWorkSpace/bcm2835 $ tar -zxvf bcm2835-1.50.tar.gz
  • 配置、编译、安装
pi@raspberrypi:~/CWorkSpace/bcm2835 $ cd bcm2835-1.50/
pi@raspberrypi:~/CWorkSpace/bcm2835/bcm2835-1.50 $ ls
aclocal.m4  ChangeLog     config.h.in  configure     COPYING  doc       INSTALL     ltmain.sh    Makefile.in  NEWS    src
AUTHORS     config.guess  config.sub   configure.ac  depcomp  examples  install-sh  Makefile.am  missing      README  test-driver
pi@raspberrypi:~/CWorkSpace/bcm2835/bcm2835-1.50 $ ./configure && make
pi@raspberrypi:~/CWorkSpace/bcm2835/bcm2835-1.50 $ sudo make install

二、编写代码

  • 编辑gpio_out_bcm2835.c
#include <bcm2835.h>
#include <stdio.h>

#define PIN 18
int main(void)
{
	int i=0;
	
	if (!bcm2835_init())
		return 1;
	
	bcm2835_gpio_fsel(PIN, BCM2835_GPIO_FSEL_OUTP);
	for(i=0;i<10;i++)
	{
		printf("gpio out: %d\r\n", i);
		bcm2835_gpio_write(PIN, i%2);
		delay(3000);
	}
	bcm2835_close();
	printf("gpio out end\r\n");
	return 0;
}

三、编译运行

  • 编译,编译时要连接bcm2835的库
  • 运行
pi@raspberrypi:~/CWorkSpace/bcm2835 $ vim gpio_out_bcm2835.c
pi@raspberrypi:~/CWorkSpace/bcm2835 $ gcc -o gpio_out_bcm2835 gpio_out_bcm2835.c -l bcm2835
pi@raspberrypi:~/CWorkSpace/bcm2835 $ ./gpio_out_bcm2835 
gpio out: 0
gpio out: 1
gpio out: 2
gpio out: 3
gpio out: 4
gpio out: 5
gpio out: 6
gpio out: 7
gpio out: 8
gpio out: 9
gpio out end

四、查看效果

用万用表量下BCM编号18的GPIO.1的引脚,可以发现其间隔3s的高低电平变换了10次。

pi@raspberrypi:~/PythonWorkSpace $ gpio readall
 +-----+-----+---------+------+---+---Pi 3B--+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 |     |     |    3.3v |      |   |  1 || 2  |   |      | 5v      |     |     |
 |   2 |   8 |   SDA.1 |   IN | 1 |  3 || 4  |   |      | 5v      |     |     |
 |   3 |   9 |   SCL.1 |   IN | 1 |  5 || 6  |   |      | 0v      |     |     |
 |   4 |   7 | GPIO. 7 |   IN | 1 |  7 || 8  | 0 | IN   | TxD     | 15  | 14  |
 |     |     |      0v |      |   |  9 || 10 | 1 | IN   | RxD     | 16  | 15  |
 |  17 |   0 | GPIO. 0 |   IN | 0 | 11 || 12 | 1 | OUT  | GPIO. 1 | 1   | 18  |
 |  27 |   2 | GPIO. 2 |   IN | 0 | 13 || 14 |   |      | 0v      |     |     |
 |  22 |   3 | GPIO. 3 |   IN | 0 | 15 || 16 | 0 | IN   | GPIO. 4 | 4   | 23  |
 |     |     |    3.3v |      |   | 17 || 18 | 0 | IN   | GPIO. 5 | 5   | 24  |
 |  10 |  12 |    MOSI |   IN | 0 | 19 || 20 |   |      | 0v      |     |     |
 |   9 |  13 |    MISO |   IN | 0 | 21 || 22 | 0 | IN   | GPIO. 6 | 6   | 25  |
 |  11 |  14 |    SCLK |   IN | 0 | 23 || 24 | 1 | IN   | CE0     | 10  | 8   |
 |     |     |      0v |      |   | 25 || 26 | 1 | IN   | CE1     | 11  | 7   |
 |   0 |  30 |   SDA.0 |   IN | 1 | 27 || 28 | 1 | IN   | SCL.0   | 31  | 1   |
 |   5 |  21 | GPIO.21 |   IN | 1 | 29 || 30 |   |      | 0v      |     |     |
 |   6 |  22 | GPIO.22 |   IN | 1 | 31 || 32 | 0 | IN   | GPIO.26 | 26  | 12  |
 |  13 |  23 | GPIO.23 |   IN | 0 | 33 || 34 |   |      | 0v      |     |     |
 |  19 |  24 | GPIO.24 |   IN | 0 | 35 || 36 | 0 | IN   | GPIO.27 | 27  | 16  |
 |  26 |  25 | GPIO.25 |   IN | 0 | 37 || 38 | 0 | IN   | GPIO.28 | 28  | 20  |
 |     |     |      0v |      |   | 39 || 40 | 0 | IN   | GPIO.29 | 29  | 21  |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+---Pi 3B--+---+------+---------+-----+-----+

五、BCM2835库简单介绍

函数int bcm2835_init(void)
说明Initialise this library.
返回1:成功;0:失败
函数int bcm2835_close(void)
说明Close this library and deallocate everything
返回1:成功;0:失败
函数void bcm2835_gpio_fsel(uint8_t pin, uint8_t mode)
说明Each control register has 10 sets of 3 bits per GPIO pin
输入pin:BCM系统的引脚编号
——mode: Each control register has 10 sets of 3 bits per GPIO pin(如下)
//      000 = GPIO Pin X is an input
//      001 = GPIO Pin X is an output
//      100 = GPIO Pin X takes alternate function 0
//      101 = GPIO Pin X takes alternate function 1
//      110 = GPIO Pin X takes alternate function 2
//      111 = GPIO Pin X takes alternate function 3
//      011 = GPIO Pin X takes alternate function 4
//      010 = GPIO Pin X takes alternate function 5
函数void bcm2835_gpio_write(uint8_t pin, uint8_t on)
说明Set the state of an output
输入pin:BCM系统的引脚编号
——on: 1:高电平;0:低电平

六、漂亮的Ending

觉得好,就打个赏呗
觉得好,就一键三连呗
在这里插入图片描述

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: #include <wiringPi.h> int main (void) { wiringPiSetup(); pinMode (0, OUTPUT); digitalWrite(0, HIGH); delay(1000); digitalWrite(0, LOW); return 0; } ### 回答2: 为了使用树莓派控制GPIO,可以使用WiringPi编写C语言代码。以下是使用WiringPi控制GPIO的示例代码: ```c #include <wiringPi.h> int main() { // 初始化WiringPi if (wiringPiSetup() == -1) { return 1; } // 设置GPIO引脚模式 pinMode(0, OUTPUT); pinMode(1, INPUT); // 控制LED digitalWrite(0, HIGH); // 打开LED // 读取按钮状态 int buttonState = digitalRead(1); // 输出按钮状态 printf("按钮状态: %d\n", buttonState); // 清理引脚状态 digitalWrite(0, LOW); // 关闭LED return 0; } ``` 上述代码使用WiringPi中的函数进行初始化、配置和控制GPIO引脚。在示例中,我们将GPIO引脚0设置为输出模式,GPIO引脚1设置为输入模式。通过调用`digitalWrite()`函数,我们可以控制GPIO引脚的电平状态,例如打开或关闭LED。`digitalRead()`函数用于读取输入引脚的状态。 此代码仅为一个简单示例,你可以根据特定的需求和电路配置进行适当的修改。同时,确保在编译代码之前已经安装了WiringPi。 ### 回答3: 树莓派是一款非常受欢迎的单板电脑,它搭载的是Linux操作系统,并且拥有丰富的GPIO接口。要运用wiringpi控制GPIO,需要先在树莓派上安装wiringpi。下面是一个简单的示例,演示了如何使用C语言代码来控制GPIO。 首先,确保你的树莓派上已经安装了wiringpi。如果没有安装,可以使用以下命令进行安装: sudo apt-get update sudo apt-get install wiringpi 然后,创建一个名为gpio_control.c的文件,并将以下代码粘贴到该文件中: #include <stdio.h> #include <wiringPi.h> #define LED_PIN 0 // 这里的0表示使用GPIO引脚编号为0,也可以根据实际情况更改 int main(void) { if (wiringPiSetup() == -1) { // 初始化wiringPi,若失败则退出程序 printf("初始化wiringPi失败!\n"); return 1; } pinMode(LED_PIN, OUTPUT); // 设置GPIO为输出模式 while(1) { digitalWrite(LED_PIN, HIGH); // 将GPIO置高电平 delay(1000); // 延迟1秒 digitalWrite(LED_PIN, LOW); // 将GPIO置低电平 delay(1000); // 延迟1秒 } return 0; } 保存并关闭文件后,打开终端,进入文件所在目录。然后使用以下命令编译该文件并运行: gcc -o gpio_control gpio_control.c -lwiringPi sudo ./gpio_control 这样,你就可以通过GPIO控制树莓派上的LED灯了。这个示例中,LED连接到GPIO引脚0(即物理引脚11),程序会不断循环地让LED灯亮一秒,熄灭一秒。你也可以根据需要更改引脚和控制逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小康师兄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值