首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌入式C编程中GPIO状态的检测

嵌入式C编程中GPIO状态的检测
EN

Stack Overflow用户
提问于 2019-04-03 15:11:58
回答 4查看 772关注 1票数 0

我们有一个嵌入式C编程任务,我们必须实现一个状态机,该状态机根据操纵杆的输入改变一系列LED。其中两种情况是:“如果左LED亮起并按下Down,则更改为右LED”和“如果右LED亮起并按下Down,则更改为左LED”。我知道如何打开某些LED的on按钮,但我不知道如何检查GPIO引脚/LED的状态,并根据使用操纵杆时的状态更改另一个LED。我基本上只想知道如何“调用”LED的状态。

这是到目前为止的状态机示例代码:

代码语言:javascript
复制
void
StateMachine ()
{
  // REPLACE THE FOLLOW CODE WITH YOUR SOLUTION
  // This code just toggles top LED and set left or right LED.
  //
  // Solution.

  uint8_t Joystick;
  uint8_t Toggle = 0;

  while (1)
  {
    Joystick = GetJoystick();

    if (Joystick == 'L')
    {
      WriteLED ('L', LED_ON);
      WriteLED ('R', LED_OFF);
    }
    else if (Joystick == 'R')
    {
      WriteLED ('L', LED_OFF);
      WriteLED ('R', LED_ON);
    }

    if (Toggle == 0)
    {
      WriteLED ('T', LED_ON);
      Toggle = 1;
    }
    else
    {
      WriteLED ('T', LED_OFF);
      Toggle = 0;
    }
  }
}

更新:这是我的WriteLED方法

代码语言:javascript
复制
void
WriteLED (uint8_t LED, uint8_t State)
{
  // Check for correct state
  if ((State != LED_OFF) && (State != LED_ON))
  {
    return;
  }

  // Turn on/off the LED
  switch (LED)
    {
    case 'L':
      HAL_GPIO_WritePin (LD4_GPIO_Port, LD4_Pin, State);
      break;
    case 'T':
      HAL_GPIO_WritePin (LD3_GPIO_Port, LD3_Pin, State);
      break;
    case 'B':
      HAL_GPIO_WritePin (LD6_GPIO_Port, LD6_Pin, State);
      break;
    case 'R':
      HAL_GPIO_WritePin (LD5_GPIO_Port, LD5_Pin, State);
      break;
    }

  return;
}
EN

回答 4

Stack Overflow用户

发布于 2019-04-03 17:08:00

如果分配特别要求一个“状态机”,那么软件应该以某种方式具有不同的内部“状态”,对应于不同的LED输出要求。表示状态机的方法有很多种-- (您看过吗?) --例如:

代码语言:javascript
复制
// enumeration of the required states
enum OutputState {
    stateAllOff, // I'm *guessing* this is the required initial state?
    stateLeftLED,
    stateRightLED,
    // ... any other states that are specified.
    // ... but *not* random combinations of LEDs that are not part of the specification.
};

enum OutputState currentState = stateAllOff; // or whatever initial state is required

// [...] I'm not going to do the actual assignment here

状态机不需要读取发光二极管的状态,它只需要在currentState变量中“记住”它们。现在,代码的其余部分变成了对给定条件的直接实现,所以……

“如果左侧指示灯亮起并按下向下按钮,则更改为右侧指示灯”

代码语言:javascript
复制
    if (currentState == stateLeftLED) {
        if (Joystick == "D") {
            WriteLED ('R', LED_ON);
            WriteLED ('L', LED_OFF);
            currentState = stateRightLED;
        }
    }
票数 3
EN

Stack Overflow用户

发布于 2019-04-03 16:25:33

STM的HAL库提供了一个与您已经使用的WritePin函数类似的ReadPin函数。

它的声明如下所示:

代码语言:javascript
复制
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

这意味着你可以像这样读取某个引脚的状态:

代码语言:javascript
复制
GPIO_PinState ld6_state = HAL_GPIO_ReadPin(LD6_GPIO_Port, LD6_Pin);

GPIO_PinState是一个枚举:

代码语言:javascript
复制
typedef enum
{
  GPIO_PIN_RESET = 0,
  GPIO_PIN_SET
}GPIO_PinState;

剩下的工作就是将read函数(ld6_state)的返回值与枚举值进行比较。正如第一个答案所提到的,您很可能会遇到一些输入的跳动,这是由按钮的机械结构造成的。我想找出如何解决这个问题是任务的一部分,所以我会把它留给你。要查找的关键字:去抖动或去抖动

票数 2
EN

Stack Overflow用户

发布于 2019-04-03 15:26:08

通常,GPIO的状态保存在寄存器变量中。您要么需要这个变量的定义,要么需要一个指向它的地址的向量来直接读取(或操作)它。您有WriteLED方法的文档吗?它可以给你一个提示。

如果您没有找到任何东西,您仍然可以实现一个标志来指示您最近打开的是哪个LED。

通常,嵌入式编程在很大程度上依赖于您正在使用的芯片和相应的编译器。因此,为了给你一个更好的答案,你应该首先提供重要的信息,比如你正在使用的硬件和软件以及你想要实现的库。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55489106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档