我正在使用beaglebone使用sysfs接口从特定引脚访问数字输入.我可以改变输出状态而不是输入:(.我做的是,我有两个引脚pinA和pinB.pinA我做了输出而pinB我做了输入.将pinA连接到pinB.通过发送将pinA配置为输出引脚通过传入将sysf和pinB中的direction属性作为输入.然后我将PinA的值更改为1并将其作为输出给出1(我使用LED测试).但是当我读取PinB的值时,它仅给出0,即使我将0传递给pinA的值.可能是什么原因?
谢谢 :)
假设gpio X可以作为输入引脚在sysfs中导出,在这之后,将在/ sys/class/gpio /中创建一个名为gpioX的目录.gpioX /包含少量文件,例如"value",表示gpio X的当前状态(高或低).
当施加到引脚X的信号改变其状态(例如从低到高)时会发生什么(在内核空间中)?
我的意思是,在转换之前,gpioX/value包含"low",但之后它将包含"high"值.操作系统如何更新此文件?
我认为需要一个中断机制.它是否使用中断机制来更新sysfs?
我正在我的 Raspberry Pi 上运行以下 python 脚本:
\n\nhttp://www.skpang.co.uk/dl/rfid.py
\n\n我在最后修改了脚本以访问 GPIO 引脚 15 并打开和关闭它。这是我的代码在底部:
\n\ndef example():\n\nrfid = SL030()\nfw = rfid.get_firmware()\nprint("RFID reader firmware:" + fw)\nprint()\n\nGPIO.setmode(GPIO.BOARD)\nGPIO.setup(15, GPIO.OUT)\nGPIO.output(15,True)\n\n\nwhile True:\n rfid.wait_tag()\n print("card present")\n\n if rfid.select_mifare():\n type = rfid.get_type()\n print("type:" + rfid.get_typename(type))\n\n id = rfid.get_uidstr()\n try:\n user = cards[id]\n print(user)\n #os.system("aplay " + user)\n except KeyError:\n print("Unknown card:" + id)\n\n rfid.wait_notag()\n print("card removed")\n print()\nRun Code Online (Sandbox Code Playgroud)\n\n我面临的问题是,虽然它操作引脚 15,但脚本会因以下错误而停止:
\n\nTraceback (most recent call last):\n File "./rfid.py", line 212, in <module>\n example()\n File "./rfid.py", line 182, …Run Code Online (Sandbox Code Playgroud) 我使用Atmel uC将输入切换到BeagleBone上的GPIO线,每500 ms从高到低.我在我的Linux内核模块中为此注册了一个处理程序,但由于某种原因没有调用处理程序.
我的模块代码是 -
#define GPIO 54
#define GPIO_INT_NAME "gpio_int"
#define GPIO_HIGH gpio_get_value(GPIO)
#define GPIO_LOW (gpio_get_value(GPIO) == 0)
short int irq_any_gpio = 0;
int count =0;
enum { falling, rising } type;
static irqreturn_t r_irq_handler(int irq, void *dev_id)
{
count++;
printk(KERN_DEBUG "interrupt received (irq: %d)\n", irq);
if (irq == gpio_to_irq(GPIO))
{
type = GPIO_LOW ? falling : rising;
if(type == falling)
{
printk("gpio pin is low\n");
}
else
printk("gpio pin is high\n");
}
return IRQ_HANDLED;
}
void r_int_config(void) { …Run Code Online (Sandbox Code Playgroud) 我编写了一些代码来获取GPIO的传感器读数.为了确保测量结果与特定时间相对应,我想知道python是否以恒定速度迭代(以便迭代之间的间隙是恒定的) - 以及迭代之间的最小时间间隔是多少.
如果他们不是,有人可以告诉我如何使时间间隔保持不变.谢谢!
有没有一种方法可以在不使用无限循环的情况下检测树莓派 GPIO 的变化?
您可以使用以下方法检测上升或下降:
GPIO.add_event_detect(channel, GPIO.RISING, callback=my_callback)
Run Code Online (Sandbox Code Playgroud)
但您只能将事件检测器设置为一次下降或上升。有没有办法在不检查无限循环中的输入的情况下做到这一点?
我目前遇到了Beaglebone黑色的GPIO引脚问题。
我正在寻找一种从C中的GPIO引脚p8_4读取值的正确方法。如果我正确理解的话,我尝试使用一个库,该库从引入设备树之前一直使用一种不支持的旧方法。
我试图找到解决问题的其他方法,但似乎找不到。有没有人能让我在C的正确轨道上前进?
我尝试为基于 TI am335x SoC 的电路板创建裸机应用程序。我需要做的一件事是callback1在上升沿和callback2下降沿调用。从我发现的数据表中,可以通过写入1 << pinRISINGDETECT 和 FALLINGDETECT GPIO 寄存器来启用对上升沿和下降沿的同时检测。但是,我不明白(在数据表中没有看到它的迹象),我如何确定当前出现的中断是由 GPIO 的上升沿还是下降沿引起的?
我有这个简单的内联汇编代码:
__asm__ volatile (
".equ GPIOA_ODR, 0x4001080C \n\t" //GPIOA base address is 0x40010800 and ODR offset is 0x0C
//turns on PA8
"ldr r1, =(1 << 8) \n\t"
"ldr r2, =#GPIOA_ODR \n\t"
"str r1, [r2] \n\t"
//turn off PA8
"ldr r1, =0 \n\t"
"ldr r2, =#GPIOA_ODR \n\t"
"str r1, [r2] \n\t"
);
Run Code Online (Sandbox Code Playgroud)
PA8只振荡2.4MHz,我想要36MHz的速度。我之前尝试过使用计时器并达到 36MHz 的速度,但由于一些限制,我想避免使用它们。
我不明白为什么 TIMER1 通道 1 (PA8) 可以配置为 36MHz 开关速度,但是当我尝试在组装中执行相同操作时,我在同一引脚上只能达到 2.4MHz 的速度。
我也在使用 PinMode(PA8, OUTPUT);
我尝试了这个汇编代码的其他变体,但在 PA8 上只达到了 2.8MHz 的最大值。我的问题是:STM32f103C8 上的 GPIO 引脚上的开关速度是否不可能高于 2.4-2.8MHz?
我想用 java 控制我的树莓派 pi4 上的 16*2 液晶显示器。问题是 Pi4J - 用 java 修改 gpios 的解决方案没有更新到 pi4。还有其他解决方案吗?启动程序时出现此错误:
pi@raspberrypi:~/desktop/gpio $ sudo ./start.sh
Run Code Online (Sandbox Code Playgroud)
<--Pi4J--> GPIO 控制示例...开始。Maista 无法确定硬件版本。我看到:硬件:BCM2711,