gpt4 book ai didi

c - 在 C 中按下 GPIO 按钮

转载 作者:太空狗 更新时间:2023-10-29 15:52:28 36 4
gpt4 key购买 nike

我在嵌入式领域相对较新,所以问这个问题可能是个新手。

我无法理解 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 运算符。哪个反转truefalse在条件语句中。同样重要的是要了解,在 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/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com