标签: gpio

如何在 Linux 上通过 GPIO 获取边缘事件而不需要繁忙循环?

我正在使用嵌入式 Linux(内核 2.6.31)的系统。

内部是一颗AT91SAM9G20芯片,部分Pin转发到外部。

现在我想将它们用作 GPIO 输入。

我阅读了有关通过文件系统使用 GPIO 的 gpio.txt 文档,直到这里为止它都运行良好。我将一些开关连接到 gpio 引脚,我可以在/sys/class/gpio/gpioX/value. 但现在我想对更改做出反应,而不是在循环中忙等待。(即回显“Switch1 被按下”)。

我想我在这里需要中断,但是如果不编写自己的内核驱动程序,我无法找到如何使用它们。我对 Linux 和 C 比较陌生(我通常用 Java 编程),所以我也想通过 sysfs 处理中断。但我的问题是,我的 GPIO 目录中没有“edge”文件(我猜是因为这只是从内核版本 2.6.33+ 开始)。是对的吗?我在那里有一个uevent文件,而不是“edge”,该文件在gpio.txt.

在 gpio.txt 文档中提到了一个标准内核驱动程序:“gpio_keys”。可以用这个来解决我的问题吗?

我想使用这个驱动程序比允许用户空间程序操纵内核任务更好。我找到了很多用于编写自己的驱动程序的代码片段,但我什至无法找出gpio.h要包含的 600 个文件中的哪些,以及如何引用该库(交叉编译器找不到 gpio.h 文件) 。

新手问题请多多指教,希望大家多多指教。

提前致谢

linux gpio

5
推荐指数
1
解决办法
9395
查看次数

通过单个 GPIO 引脚转储闪存

我正在使用 Infineon 的 XMC4500 Relax Kit,我正在尝试通过单个 GPIO 引脚提取固件。

我非常天真的想法是通过 GPIO 引脚一次转储一位,然后用逻辑分析仪以某种方式“嗅探”数据。

伪代码:

while(word by word memory copy hasn't finished)
  ...
  register = value;
  temp_value = value AND 0x1;
  pin = temp_value;
  value = value >> 1;
  ...
Run Code Online (Sandbox Code Playgroud)

我在正确的轨道上吗?有没有人有更好/更好的想法如何存档?

### 编辑 ###

实际上我的(shell)代码的一个要求是它需要非常小。我发现了这个关于如何通过闪烁 LED 转储固件的绝妙技巧。

但是,我正在努力使用 Saleae Logic Analyzer 接收正确的值。

基本上我正在做的是:

  1. 设置GPIO引脚方向输出
  2. 用时钟(SPI 串行时钟)闪烁 LED1(引脚 1.1)
  3. 用数据位 (SPI MOSI) 闪烁 LED2(引脚 1.0)
  4. 使用逻辑分析仪嗅探引脚

这是我的 C 代码:

#include "XMC4500.h"

#define DEL 1260

void init() 
{
  // P1.0 output, push pull …
Run Code Online (Sandbox Code Playgroud)

c embedded reverse-engineering firmware gpio

5
推荐指数
2
解决办法
952
查看次数

与树莓派的 GPIO 回调函数共享变量

我在 python 中编写了这个简单的测试程序来检查当我按下 Raspberry Pi 中的按钮时是否发生了什么:

import RPi.GPIO as GPIO
from time import sleep

GPIO.setmode(GPIO.BCM)
GPIO.setup(24, GPIO.IN, pull_up_down = GPIO.PUD_UP)

testVar=0

def my_callback(channel):
  print "Pressed!"
  testVar= 32

GPIO.add_event_detect(24, GPIO.FALLING, callback=my_callback, bouncetime=200)
while True:
    print str(testVar)
    sleep(0.5)
Run Code Online (Sandbox Code Playgroud)

我只读取 0 个值,当我按下按钮时,我看到“按下!” 但变量没有改变。据我了解,原因是回调函数作为新线程被午餐,当然变量无法正确设置。有没有办法以某种方式将共享变量发送到回调函数?

非常感谢任何好的建议。

python gpio raspberry-pi raspberry-pi2

5
推荐指数
1
解决办法
2763
查看次数

按钮 GPIO.FALLING 事件被触发两次

这是我第一次尝试对 Raspberry Pi 和面包板上的硬件按钮进行编码。程序很简单,当检测到按下按钮时,打开面包板上的 LED 1 秒钟。我的代码似乎有效,但奇怪的是,每隔一个按钮就会触发回调函数两次。我是一个完全的编程菜鸟,所以我不确定问题是否出在我的代码上,或者硬件或按钮是否实际上以某种方式掉落了两次。我希望这里有人能帮助我解决这个奇怪的问题。这是我的代码:

#!/usr/bin/env python
import RPi.GPIO as GPIO
import time


LedPin = 11    # pin11 --- led
BtnPin = 12    # pin12 --- button

def setup():
    GPIO.setmode(GPIO.BOARD)       # Numbers GPIOs by physical location
    GPIO.setup(LedPin, GPIO.OUT)   # Set LedPin's mode is output
    GPIO.setup(BtnPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)    # Set BtnPin's mode is input, and pull up to high level(3.3V)
    GPIO.output(LedPin, GPIO.HIGH) # Set LedPin high(+3.3V) to off led

def Light(ev=None):
        print 'A button press was detected'
        GPIO.output(LedPin, 0) …
Run Code Online (Sandbox Code Playgroud)

python gpio raspberry-pi raspberry-pi2

5
推荐指数
1
解决办法
4500
查看次数

虚拟GPIO仿真

是否存在用于编程需求的虚拟GPIO驱动程序?

我必须在我的Linux PC上开发一个软件,然后在一些带有物理GPIO的嵌入式系统上试用它(CHIP,OpenWRT等等)?

谢谢!

linux emulation gpio

5
推荐指数
1
解决办法
2848
查看次数

在 ARM 上的 Linux 中写入和读取内存映射设备寄存器

我正在尝试按照以下步骤在我的 ARM9 (SAM9X25) 上读写寄存器:http ://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka3750.html
我结束了使用以下代码:

#include "stdio.h"

#define PIO_WPMR_BANK_D                     0xFFFFFAE4  // PIO Write Protection Mode Register Bank D
#define PIO_PUER_BANK_D                     0xFFFFFA64  // PIO Pull-Up Enable Register Bank D
#define PIO_PUSR_BANK_D                     0xFFFFFA68  // PIO Pull-Up Status Register Bank D

#define MASK_LED7                           0xFFDFFFFF  // LED7 Mask
#define DESABLE_WRITE_PROTECTION_BANK_D     0x50494F00  // Desable write protection Bank D

int main(void) {
    printf("test");
    unsigned int volatile * const register_PIO_WPMR_BANK_D = (unsigned int *) PIO_WPMR_BANK_D;

    unsigned int volatile * const register_PIO_PUSR_BANK_D = (unsigned int *) …
Run Code Online (Sandbox Code Playgroud)

c linux arm cpu-registers gpio

5
推荐指数
2
解决办法
1万
查看次数

USB 转 GPIO/SPI/I2C/UART 适用于常规 Windows 10 PC?类似于 Raspberry Pi 40 针接头

有谁知道有一家公司销售适用于普通非物联网 Windows 10 PC 的 USB 电缆,该电缆可以将 USB 转换为 40 针 Raspberry pi 接头上的所有以下总线?示例:USB->GPIO、I2C、SPI、UART 等。

我能找到的最接近的是:

Digilentinc.com 的数字发现逻辑分析仪

这可以将 PC USB 转换为 GPIO/I2C/SPI 等...除了我正在寻找更小、电线更少的东西...只有 40 针接头或更少...类似于树莓派 40 针接头,除了被驱动从连接到 PC 的 USB 改为...有人见过这种类型的待售产品,它可以通过所有列出的总线从 PC-USB 转换为 40 针接头吗?

另外,我希望能够使用“Windows.Devices”Api 而不是专有驱动程序 DLL API 通过Windows UWP对该 USB 转换设备进行编程...还没有真正找到...示例:

// C# Program GPIO connected to USB dongle of regular PC...
using Windows.Devices.GPIO;
...
private void InitGPIO()
{
    var gpio_ctrl = GpioController.GetDefault();
    // Check GPIO state
    if (gpio_ctrl == null)
    {
        this.pin = null; …
Run Code Online (Sandbox Code Playgroud)

c# windows spi i2c gpio

5
推荐指数
1
解决办法
9578
查看次数

树莓派 RS485/Uart Modbus

我正在尝试在 UART 上连接一个 RS485 适配器,以便通过 Raspberry Pi 上的 modbus 进行通信。我的最终目标是让所有这些都与 Node 应用程序一起工作,但到目前为止,我的开发人员一直在使用 Python。

我的硬件连接看起来像:

[Modbus 设备] <===> [RS485 芯片 <==> Raspberry PI GPIO] 引脚。RS485 有三根线(发送、接收、方向),它们的连接方式如下

RaspiPi <=>适配器

GPIO 14 (8) - Tx <=> 数据+

GPIO 15 (10)- Rx <=>- 数据-

GPIO 18 (12) - 方向

RS485 不是典型的 9 针适配器。我的芯片上有三根电线。用作差分集和地线的双绞线。

通过手动翻转 GPIO18 进行发送/接收,我已经能够在此适配器和 USB-RS485 适配器之间发送串行通信。(代码如下)[1]。此代码纯粹用于证明适配器工作

我坚持让 modbus 在 GPIO 适配器上工作。我试过使用minimalmodbus,它与USB-RS485 适配器配合良好,但与GPIO 适配器配合使用时失败了。我怀疑这是因为没有设置方向销。

理想的解决方案是在 pi 上为 GPIO 找到一个 RS485 驱动程序,但除此之外,我看到了三个选项

1 - 制作我自己的驱动程序(我完全不熟悉的东西) 2 - 以某种方式获得一个 modbus 库来翻转内核空间中的 GPIO 引脚 3 …

python modbus rs485 gpio raspberry-pi

5
推荐指数
1
解决办法
8173
查看次数

使用显示总线接口将 TFT 屏幕与 STM32F446 接口

我试图了解如何在定制 PCB 上将 TFT 屏幕模块与 STM32F4 芯片连接起来。 这是模块及其基本信息。

为了将命令和数据写入屏幕,屏幕模块上的 ILI9481 驱动程序使用显示总线接口 (DBI),其中数据通过数据线发送 8 位或 16 位。

查看库示例,我明白(如果我错了,请纠正我),为了发送一个字节的命令,它只是根据命令将芯片的数字引脚设置为高电平或低电平。例如,8 位通信中的命令 0x2 将是 00000010,其中 0 将是芯片 GPIO 引脚上的数字低电平,1 将是数字高电平,这意味着 8 条线中的 1 条处于活动状态(逻辑高)。我希望,我理解正确。

现在,当我查看示例时,通常这些数字引脚位于同一个 GPIO 端口上。如果我理解正确的话,GPIO 端口有一个寄存器,称为 BSRR,您可以在其中操作 GPIO 端口引脚的逻辑电平。如果数据引脚都在同一个 GPIO 端口上,我认为这会起作用(从示例中,其中 c 是命令字节):

void STM32_TFT_8bit::write8(uint8_t c) {

  // BRR or BSRR avoid read, mask write cycle time
  // BSRR is 32 bits wide. 1's in the most significant 16 bits signify pins to reset (clear)
  // 1's in least significant …
Run Code Online (Sandbox Code Playgroud)

microcontroller stm32 gpio stm32f4

5
推荐指数
1
解决办法
86
查看次数

我可以为STM32F103ZE芯片上的GPIO引脚配置中断吗?

STM32F103ZE有没有可用的GPIO中断?我浏览了数据表,但没有发现任何相关内容.我是这款处理器的新手,但最近使用的是TI的MSP430.在MSP430中,我们可以使用一些GPIO寄存器配置中断.谁能告诉我怎么办?

embedded arm interrupt gpio

4
推荐指数
1
解决办法
2473
查看次数