C STM32F407VG6按钮Led闪烁速度

C STM32F407VG6按钮Led闪烁速度,c,arm,embedded,stm32,stm32f4discovery,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( buttonPress

我想配置我的按钮并配置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);
          }
  }

计数器%3
将产生0、1或2,但您已经描述了四种状态,因此需要
计数器%4
。事实上,你没有描述第一次按下之前的状态,所以可能有5个

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

您发布的代码片段将不起作用,因为(除其他问题外)
计数器
在循环中未被修改,因此它将永远不会退出,也永远不会更改闪存速率

你需要以下形式的东西:

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

    flashSequence( rate ) ;
}

flashSequence()
是一个以与
rate
成比例的速率闪烁的函数,零(0)是“关闭”的特例。

计数器%3
将产生0、1或2,但您已经描述了四种状态,因此需要使用
计数器%4
。事实上,你没有描述第一次按下之前的状态,所以可能有5个

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

您发布的代码片段将不起作用,因为(除其他问题外)
计数器
在循环中未被修改,因此它将永远不会退出,也永远不会更改闪存速率

你需要以下形式的东西:

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

    flashSequence( rate ) ;
}

flashSequence()
是一个以与
速率成比例的速率闪烁的函数,零(0)是“关闭”的特例。我恐怕这有点太多了,但LED闪烁模式和按键读数应该在定时器中断中完成,并且不要阻塞正常的程序流

想象一下这样的情况:按键后,您需要闪烁LED,但程序需要正常执行

您可以查看我的代码:

发光二极管

按钮-


PS我的页面处于永久性的正在构建状态:)。

我想这可能有点太多,但LED闪烁模式和按键读数应该在计时器中断中完成,并且不要阻止正常的程序流

想象一下这样的情况:按键后,您需要闪烁LED,但程序需要正常执行

您可以查看我的代码:

发光二极管

按钮-


PS我的页面处于永久性的正在构建状态:)。

您可以使用状态机实现这一点。我无法为其编写代码,但我可以提出建议。您需要连接uC外部中断引脚上的按钮,为外部中断设置ISR,在ISR增量内设置一个全局变量。在main函数中,根据全局变量值不断检查该全局变量的值。使用计时器0或任何计时器生成延迟,并使用该延迟使LED闪烁。如果您希望其他人阅读您的代码,则它只是一种礼貌的ot格式,并以某种常规方式缩进。这方面的问题一直存在;一开始说你的“新这里”没有任何意义,也没有明确要求帮助——这就是我们在这里的目的。为你解决了这个问题;但是下一次,考虑一下这个问题。你已经发布了代码,大概没有按照你的意愿去做。如果你能解释一下它是做什么的,或者你期望它是如何工作的,那会很有帮助。在第一次按下时,你说乳头应该眨得“慢一点”。比什么慢?在第一次按下之前,LED应该做什么?你可以用状态机实现。我不能为它编写代码,但我可以建议。您需要连接uC外部中断引脚上的按钮,为外部中断设置ISR,在ISR增量内设置一个全局变量。在main函数中,根据全局变量值不断检查该全局变量的值。使用计时器0或任何计时器生成延迟,并使用该延迟使LED闪烁。如果您希望其他人阅读您的代码,则它只是一种礼貌的ot格式,并以某种常规方式缩进。这方面的问题一直存在;一开始说你的“新这里”没有任何意义,也没有明确要求帮助——这就是我们在这里的目的。为你解决了这个问题;但是下一次,考虑一下这个问题。你已经发布了代码,大概没有按照你的意愿去做。如果你能解释一下它是做什么的,或者你期望它是如何工作的,那会很有帮助。在第一次按下时,你说乳头应该眨得“慢一点”。比什么慢?在第一次按下之前,LED应该做什么?所以看起来我需要2个名为flashSequence和buttonPressed的函数。按下按钮将控制按钮是否按下,flashsequence将正确设置LED闪烁时间?您根本不需要这样做;这只是构建代码的一种方法,有助于明确代码中缺少的思想。你不能控制一个按钮,你可以检测到它。flashSequence函数不设置速率,它以请求的速率执行单个序列。解决方案很简单,但并不理想,因为按钮轮询速率由闪存序列长度决定。最好是在线程或中断中进行检测。我的和你的真正结构上的区别是
flashSequence()
在一个闪存周期内运行到完成,而你的有一个不会终止的循环。您至少应该删除内部循环