查看gpio状态_在树莓派上玩转 Rust :使用 GPIO 点亮 LED

上一节我们已经配置好了交叉编译环境,并成功运行了“Hello, world!”。不过,我记得在我刚开始学习 Arduino 的时候,也有一个非常经典的程序——Blink,这似乎也是算是 “Hello, world!” ?于是,我们今天的主题是,使用 Rust 点亮 LED。这是 Arduino 的 Blink 代码:

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
 pinMode(LED_BUILTIN, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
 digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
 delay(1000);                       // wait for a second
 digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
 delay(1000);                       // wait for a second
}

接下来我们用 Rust 实现看起来差不多的代码。有两个选择,其一是直接使用 rppal 和 sysfs_gpio 等库,其二是在不借助第三方库的情况下,直接调用 Linux 内核提供的接口——GPIO Sysfs Interface for Userspace。为了一探究竟,我们选择第二种。

接下来,先用ssh登录到树莓派,然后运行以下两条命令:

$ sudo mount -t debugfs debugfs /tmp
$ sudo cat /tmp/gpio
gpiochip0: GPIOs 0-53, parent: platform/20200000.gpio, pinctrl-bcm2835:
 gpio-47 (                    |led0                ) out lo 

debugfs 是一种用于内核调试的虚拟文件系统。通过第一条命令,我们将其挂载到了 /tmp 下面,用后通过查看 gpio 文件的内容,就得到了 gpio的使用状态。可以看到这个树莓派有 0-53gpio,其中gpio-47已经被使用。不过,我们可以使用的也只有0-27号,其他的

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
抱歉,我之前给出的代码存在错误。GD32F1x0系列微控制器的GPIO库中并没有定义 `GPIO_MODE_OUT_PP` 这个宏。在使用GPIO库进行初始化时,应使用 `gpio_mode_set` 函数进行设置。 以下是修正后的代码示例: ```c #include "gd32f1x0.h" #define LED_NUM 8 // LED灯的数量 void delay_us(uint32_t us) { uint32_t i; for(i = 0; i < us; i++) { uint32_t j; for(j = 0; j < 21; j++) // 循环次数根据实际情况调整 { __NOP(); // 使用 __NOP() 函数进行延时 } } } void ws2812_set_color(uint8_t red, uint8_t green, uint8_t blue) { // 将颜色数据写入相应的寄存器 // 具体的寄存器操作根据实际硬件情况进行修改 GPIO_BOP(GPIOA) = GPIO_PIN_5; // 将PA5引脚设为低电平 delay_us(50); // 延时一段时间,根据实际情况调整 for(uint8_t i = 0; i < 8; i++) { if(green & (1 << (7 - i))) { GPIO_BC(GPIOA) = GPIO_PIN_5; // 将PA5引脚设为高电平 delay_us(35); // 高电平保持时间,根据实际情况调整 GPIO_BOP(GPIOA) = GPIO_PIN_5; // 将PA5引脚设为低电平 delay_us(12); // 低电平保持时间,根据实际情况调整 } else { GPIO_BC(GPIOA) = GPIO_PIN_5; // 将PA5引脚设为高电平 delay_us(12); // 高电平保持时间,根据实际情况调整 GPIO_BOP(GPIOA) = GPIO_PIN_5; // 将PA5引脚设为低电平 delay_us(35); // 低电平保持时间,根据实际情况调整 } } // 以下代码类似地处理red和blue颜色数据 } int main(void) { // 初始化相关硬件和引脚,确保WS2812B的数据引脚PA5连接到正确的GPIO引脚上 rcu_periph_clock_enable(RCU_GPIOA); // 使能GPIOA时钟 gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_5); // 初始化PA5引脚为推挽输出模式 while(1) { for(int i = 0; i < LED_NUM; i++) { uint8_t red = 255; uint8_t green = 0; uint8_t blue = 0; ws2812_set_color(red, green, blue); // 设置红色光 // 延时一段时间,使灯点亮 // 根据实际情况调整延时时间 for(int j = 0; j < 200000; j++) { __NOP(); } red = 0; green = 0; blue = 0; ws2812_set_color(red, green, blue); // 关闭LED灯 // 延时一段时间,使灯熄灭 // 根据实际情况调整延时时间 for(int j = 0; j < 200000; j++) { __NOP(); } } } } ``` 在修正后的代码中,我们使用 `gpio_mode_set` 函数来初始化引脚为推挽输出模式。`GPIO_BOP` 和 `GPIO_BC` 分别用于设置引脚为高电平和低电平。`GPIO_PIN_5` 定义了PA5引脚。 请注意,上述代码仅为示例,具体的设置和控制方式可能根据实际硬件而有所区别。你需要根据实际情况修改 `ws2812_set_color` 函数中的寄存器操作来实现正确的引脚控制,并确保WS2812B的数据引脚PA5连接到正确的GPIO引脚上。 希望这个修正后的示例对你有所帮助!如果有任何问题,请随时向我提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值