- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在嵌入式领域相对较新,所以问这个问题可能是个新手。
我无法理解 C 语言示例程序的语法,该程序检查按钮是否被按下,如果按下则打开 LED。我使用的是 STM32F207VCT6 (Cortex-M3) 微 Controller 。
我难以理解的程序部分如下:
if(!(GPIOA->IDR & (1<<4)))
Key=1;
来自 GPIOA
的端口 4设置为带上拉寄存器的输入。一旦按下按钮,来自按钮的信号就会转到 GND。 IDR
是输入数据寄存器。
所以我的问题是:
我不明白这段代码中为什么使用 NOT 符号 !
, 在 if
里面需要声明。而且我不知道在if
里面做了什么比较,因为没有相等的符号。有人可以帮我吗?
PS:我已经知道(1<<4)
是将bit 1左移四次的逐位运算。
最佳答案
STM32F207VCT6 中每个端口有 16 个引脚。此操作试图确定端口 A 的单个引脚(编号 4)的状态。让我们展开每个部分以更好地理解发生了什么。
我们从表达式开始:
if(!(GPIOA->IDR & (1<<4)))
我们正在使用 16 位数字来说明 16 个引脚。展开这个我们得到:
if(!(GPIOA->IDR & ((0000 0000 0000 0001) << 4)))
您已经知道 <<
是按位左移。应用这个我们得到:
if(!(GPIOA->IDR & (0000 0000 0001 0000)))
展开 IDR
, 我会用 X
用于我们不关心的位和 ?
对于我们正在测试的未知位:
if(!((XXXX XXXX XXX? XXXX) & (0000 0000 0001 0000)))
接下来我们有一个 &
这是按位与运算符。如果您还记得您的 AND 真值表:
& 0 1
- -
0 | 0 0
1 | 0 1
所以我们有操作:
XXXX XXXX XXX? XXXX
& 0000 0000 0001 0000
---------------------
0000 0000 000? 0000
如果端口 A 中的位 4 是 0
, 结果将是 0000 0000 0000 0000
.如果端口 A 中的位 4 是 1
, 结果将是 0000 0000 0001 0000
.
如果按下开关,输入将被拉至 GND,位 4 将设置为 0
.如果未按下开关,则内部上拉电阻会将输入拉高,位 4 将设置为 1
。 .
所以我们有两种可能:
//Button is pressed
if(!(0000 0000 0000 0000))
或者:
//Button is not pressed
if(!(0000 0000 0001 0000))
现在了解 !
很重要是逻辑 NOT 运算符。哪个反转true
和 false
在条件语句中。同样重要的是要了解,在 C language :
Logical operators (
&&
,||
,!
, etc.) and condition-testing statements (if
,while
) assume that zero is false and all other values are true.
强调我的
所以我们真正拥有的是:
//Button is pressed
if(!(false))
或者:
//Button is not pressed
if(!(true))
应用 NOT:
//Button is pressed
if(true)
Key=1;
或者:
//Button is not pressed
if(false)
Key=1;
关于c - 在 C 中按下 GPIO 按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19820517/
虽然找到了许多关于如何使用 GPIO.BCM 模式设置 gpio 的示例(其中引脚编号等效于 RPI(参见图像和 nvidia/jetson-gpio),但我找不到在 GPIO.TEGRA_SOC 模
我一直在努力编写一个脚本,该脚本将 Pi 的 BCM 引脚 17、27 和 10 打开 1 秒,然后关闭 1 秒,连续 100 次。当我运行脚本时,LED1 会亮起然后熄灭,程序因以下错误而关闭: T
我想使用 linux GPIO 驱动程序来处理 mpc8308 处理器的 GPIO 引脚之一作为输出。所以我启用了 GPIO 驱动程序并在以下位置进行调试: Device Drivers ---> G
我正在开发一个项目,需要我配置 GPIO 引脚并向原子板添加传感器。内核已配置 gpio ... CONFIG_GPIO_SYSFS=y 是内核选项之一。 我使用的是fedora版本2.6.29-10
我真的很担心我的 GPIO 可能被烧坏了,因为即使是这个 super 简单的代码也会导致错误 import RPi.GPIO as io import time io.setmode(io.BCM)
我尝试将 RPi.GPIO 与 Python 3.6 一起使用。 我安装了 RPi.GPIO,它适用于 Python 3.4,但不适用于 Python 3.6 我得到这个错误: ModuleNotFo
默认情况下,/sys/class/gpio 只能作为 root 访问。所以我喜欢一个新组gpio可以使用/sys/class/gpio下的文件和目录。为此,我将以下行添加到 /etc/rc.local
我已经阅读了 RPi.GPIO 的文档,并在谷歌和 SO 上进行了搜索,但无法完全找到可能是一个非常愚蠢的问题的解决方案。我试图只检测按下按钮的边缘。但无论我是否指定寻找“下降”或“上升”边缘,Pi
我正在编写一个程序来读取 GPIO 引脚的温度。不幸的是,访问这些总是会抛出 ModuleNotFoundError:没有名为“RPi”的模块。 我尝试重新安装它们,但没有成功。 异常(excepti
我正在使用 Raspberry pi 和 java 来使用 pi4j 使 LED 闪烁,一切都已清除并且工作正常,LED 按照代码闪烁但是当我第二次运行时它会导致以下错误,我搜索了很多有很多相同的问题
所以我一直在尝试通过使用命令行和 sysfs 写入和读取 /sys/class/gpio/ 让我的 Raspberry Pi GPIO 正常运行。根据以下教程,我无法复制将 GPIO 设置为输出并将其
我正在使用 Q7 模块 (x86) 并尝试在 Linux 上使用 ACPI SSDT 覆盖配置我们的外围设备。但我与它斗争。我想我误解了 ACPI 的一些核心概念。 问题 CPU -> I2C ->
我正在尝试在 Raspberry PI 上使用 nodejs 从连接的光传感器读取值。我可以读取 python 程序的读数,并可以确认我的设置是正确的。 下面是程序 var gpio = requir
我正在从事密室逃脱项目。实际上,我试图创建的行为如下: 网络浏览器以通常的方式显示网络应用程序的一部分。从此时起,客户端上将不再有键盘/鼠标的输入。我已经使用 JS 解决了基于时间的更改,因此我可以加
我的代码在使用 raspberry pi 时遇到问题。我刚开始使用 Python,所以我需要一些帮助。 这是代码: import RPi.GPIO as GPIO import time GPIO.s
我遇到了和这个问题一样的问题, python import fails when called from PHP但现在是我的另一个导入。 脚本在命令行 (python uit.py) 和一个 test
现在使用旧方法 gpio-sunxi 如何在 OrangePi PC plus ( SoC H3 ) 上访问 Armbian 3.4.113 上的 GPIO并编辑 .fex -file 已过时(想分享
在 Android 和 Linux 下使用传统的 sysfs GPIO 过程的第一步是脚趾 export您要使用的特定 GPIO 引脚。当您完成 GPIO 引脚到 unexport它。 我一直在寻找关
PHYTEC 的内核版本 3.12.30-AM335x-PD15.1.1。 如果我使用/sys/class/gpio 方式,我可以看到按钮输入引脚(AM3359 的 gpio103)值从 0 变为 1
从以前已知的 sysfs 接口(interface),任何人都可以设置合理配置的 GPIO 线的输出,并且此输出将保持该值,直到 SoC 重置或有人更改线值。使用 GPIOlib,当消费者关闭 gpi
我是一名优秀的程序员,十分优秀!