STM32F407VG6按钮LED闪烁速度

时间:2017-10-14 17:39:08

标签: c arm embedded stm32 stm32f4discovery

我想配置我的按钮并配置LED闪烁速度,这样当我第一次按下按钮时,LED闪烁得更慢。当我再次按下时,LED指示灯仍然缓慢闪烁,当我第三次按下时,LED指示灯闪烁最慢。

毕竟当我第四次按下按钮时我想关闭LED(即直到我按下按钮才闪烁)。我以为我可以用mod运算符(a % 3 == 0 ???)

来做到这一点

这是我更新后的代码:

unsigned int rate = 1000000;
int NUM_STATES = 4 ;
unsigned int counter=1;
for(;;)
{
  if( buttonPressed() )
  {
    rate += 2000000;
    counter++;
  }
  if(counter  % 4 == 0)
  {
  rate = 0;
  }

  flashSequence(rate);
}
}
int buttonPressed(void)
{
    if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0))
   return 1;
else
 return 0;
}
void flashSequence (int rating)
{              
          if (rating == 0)
            GPIO_ResetBits(GPIOD, 
 GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
        else
          {
            /* PD12 to be toggled */
            GPIO_SetBits(GPIOD, GPIO_Pin_12);
            /* Insert delay */
            Delay(rating);
            /* PD13 to be toggled */
            GPIO_SetBits(GPIOD, GPIO_Pin_13); 
            /* Insert delay */
            Delay(rating);
            /* PD14 to be toggled */
            GPIO_SetBits(GPIOD, GPIO_Pin_14);
            /* Insert delay */
            Delay(rating); 
            /* PD15 to be toggled */
            GPIO_SetBits(GPIOD, GPIO_Pin_15);     
            /* Insert delay */
            Delay(rating);
            GPIO_ResetBits(GPIOD, 
 GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
            Delay(rating);
          }
  }

2 个答案:

答案 0 :(得分:0)

counter % 3将产生0,1或2,但您已描述了四种状态,因此需要counter % 4。实际上你没有在第一次按下之前描述状态,所以也许有5个。

如果状态数不是2的幂,则当计数器回绕时,使用模 n 将导致不连续。使用unsigned int计数器,这可能不是一个实际限制,但它至少是一个潜在的错误。

您发布的代码片段不起作用,因为(在其他问题中)counter未在循环中修改,因此它永远不会退出,并且永远不会更改闪存速率。

您需要以下形式的内容:

int rate = 0 ;  // Off
#define NUM_STATES = 4 ; (0 to 3)
for(;;)
{
    if( buttonPressed() )
    {
        rate++ ;
        rate %= NUM_STATES ;
    }

    flashSequence( rate ) ;
}

flashSequence()是一个以与rate成比例的速率闪烁的函数,零(0)是" OFF"的特殊情况。

答案 1 :(得分:0)

我担心解释有点太多,但LED闪烁模式和按键读数应该在定时器中断时完成,并且不会阻止正常的程序流程。

想象一下这种情况,如果在按键后你需要闪烁LED但是程序需要正常执行。

您可以查看我的代码:

LED - https://www.diymat.co.uk/arm-blinking-led-driver/

按钮 - https://www.diymat.co.uk/arm-three-function-click-double-and-long-click-button-library-timer-interrupt-driven/

PS我的页面处于永久建设状态:)。