Ускорьте мигание светодиодов через 2 секунды

В моем ST32L c Приложение Я хочу ускорить мигание светодиодов. С кодом ниже я могу нажать кнопку, и светодиоды будут мигать быстрее. Когда я отпущу, светодиоды будут нормально мигать.

Как я могу проверить, нажата ли кнопка как минимум на 2 секунды и после этого ускорить светодиоды?

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 ответа

Вам необходимо использовать встроенные аппаратные таймеры в микроконтроллере. Самый простой способ - использовать повторяющийся таймер, который увеличивает счетчик каждые 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
}

Таким образом, вы также получаете сигнал отскока кнопки бесплатно. Вы должны всегда иметь де-прыгуны, и в вашем текущем коде этого, похоже, нет.

Без ISR у вас должно быть что-то в цикле, которое, по крайней мере, гарантирует, что прошло определенное время (сон / ожидание / задержка в течение нескольких миллисекунд) и счетчики.

Другие вопросы по тегам