STM32F407VG6 按钮 LED 闪烁速度
STM32F407VG6 Button Led Blink Speed
我想配置我的按钮并配置 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);
}
}
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".
的特例
恐怕解释起来有点过分,但 LED 闪烁模式和按键读数应该在定时器中断中完成,不要阻塞正常的程序流程。
想象一下这种情况,如果在按键后您需要使 LED 闪烁,但程序需要正常执行。
你可以看看我的代码:
LED - https://www.diymat.co.uk/arm-blinking-led-driver/
PS 我的页面处于永久建设中状态:).
我想配置我的按钮并配置 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);
}
}
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".
恐怕解释起来有点过分,但 LED 闪烁模式和按键读数应该在定时器中断中完成,不要阻塞正常的程序流程。
想象一下这种情况,如果在按键后您需要使 LED 闪烁,但程序需要正常执行。
你可以看看我的代码:
LED - https://www.diymat.co.uk/arm-blinking-led-driver/
PS 我的页面处于永久建设中状态:).