按钮点击stm32板获得反应时间

时间:2016-11-08 18:59:54

标签: c stm32 stm32f4discovery

我试图在C的stm32板上做一个反应时间游戏。我不确定如何返回确切的反应时间,此刻我做了一个循环,每次增加50ms循环,没有被打断。

if ((GPIOA->IDR & USER_GPIO_PIN) != 0x0)
{
   //code
}

因此,当您单击按钮(USER_GPIO_PIN)时,它应该打破循环并返回确切的反应时间数(不确定如何执行此操作)或使用

进行估算
LCD_GLASS_DisplayString((uint8_t*)"text");

那么是否有任何功能可以按下按钮之间的时间差异?

另外,我尝试添加随机延迟以使游戏更加愉快(在一定延迟之后LED指示灯闪烁并且您必须按下按钮),但我尝试的随机功能似乎不起作用

srand(time(NULL));
uint32_t randomDelay = rand();

2 个答案:

答案 0 :(得分:0)

软件中的随机功能只是一个包含大量随机数的表。 srand函数指示您将开始查看表中的位置。

换句话说,你需要一个"随机"数字开头(又名种子),以便开始进程。派生种子的一种方法是像你一样查看当前时间。如果这不起作用,我会看看如何使用srand(记住它应该只在初始化中使用一次),还有函数时间(NULL)返回

stm32(以及大多数其他MCU)确实在HW本身内置了自己的随机生成器。通过配置一组定义的HW寄存器,可以使用此功能。 ST Microelectronics非常友好地为我们提供了示例代码和捆绑在一起的HAL库,称为" STM32Cube "您可以在配置时将其用作指南。对于stm32f7系列,请参阅文件 stm32f7xx_hal_rng.c

答案 1 :(得分:0)

  

因此,当您单击按钮(USER_GPIO_PIN)时,它应该打破循环并返回确切的反应时间编号(不确定如何执行此操作)

'清洁'这样做的方法是将EXTI中断附加到按钮GPIO引脚,以便在与按钮“匹配”相匹配的相应边缘上触发。过渡。

点亮LED时,记录定时器的当前值。当你得到EXTI中断时,从旧中减去新的定时器值并设置一个变量来告诉你的主循环唤醒并做一些事情。 Systick是最简单的计时器。

  

函数srand(时间(NULL));

除非你有一个备份的RTC,它不会在重置和与之集成的库之间保持实时,否则不会起作用。

如果要在STM32上播种PRNG,则采样一些外部随机性,如温度/电压传感器ADC输入的底部位或浮动引脚。更好的是,使用硬件RNG。