2秒后加速闪烁的LED

时间:2016-11-03 15:48:13

标签: c microcontroller stm32 stm32ldiscovery

在我的ST32L c应用程序中,我想加快闪烁的LED。使用下面的代码,我可以按下按钮,LED将更快地闪烁。当我释放时,LED将正常闪烁。

如何检查按钮是否按下最少2秒,然后加速LED?

int i = 0;
    while (1) {
        bool wasSwitchClosedThisPeriod = false;
        while (i++ < speed) {
            // Poll the switch to see if it is closed.
            // The Button is pressed here
            if ((*(int*)(0x40020010) & 0x0001) != 0) {
                wasSwitchClosedThisPeriod = true;
            }
        }
        // Blinking led
        *(int*) (0x40020414) ^= 0xC0; 

        i = 0;

        if (wasSwitchClosedThisPeriod) {

            speed = speed * 2;

            if (speed > 400000) {

                speed = 100000;
            }  
        }   
    }

2 个答案:

答案 0 :(得分:1)

您需要在微控制器中使用片上硬件定时器。最简单的方法是使用重复计时器,每隔x个时间单位增加一个计数器。让计时器ISR轮询按钮端口。如果发现按钮处于非活动状态,请重置计数器,否则增加计数器。例如:

static volatile uint16_t button_count = 0;

void timer_isr (void)  // called once per 1ms or so
{
  // clear interrupt source here

  if((button_port & mask) == 0)
  {
    button_count = 0;
  }
  else
  {
    if(button_count < MAX)
    {
      button_count++;
    }
  }
}

...

if(button_count > 2000)
{
  change speed
}

这样你也可以免费获得按钮的信号去抖动。去弹跳是你必须经常拥有的东西,你现在的代码似乎缺乏它。

答案 1 :(得分:1)

如果没有ISR,你的循环中应该有一些东西,至少可以保证已经过了一段时间(睡眠/等待/延迟几毫秒)和计数器。