基于RT-Spark开发板构建的反应时间测量设备,利用硬件中断精确记录
该项目是一个简单的人体反应计时器,使用RT-Spark开发板和STM32F407ZGT6微控制器构建而成。它用于测量当RGB LED亮起时,人能多快做出反应。
程序首先等待一到三秒之间的一个随机时间,以防止用户猜测信号出现的时间。延迟结束后,RGB LED 灯亮起,提示用户尽快按下按钮。
按下按钮时,外部中断被触发,使微控制器能够立即检测到用户的反应。程序随后记录结果,并判断反应时间是快、中等还是慢。通过显示不同的RGB LED颜色来表明结果。
为了提供即时反馈,系统通过彩色LED灯来分类响应速度:
•红色LED = 快速反应
•绿色LED = 平均反应
•蓝色LED = 反应缓慢
该设计还展示了中断驱动的输入/输出效率:处理器在前台继续执行指令(递增计数器),而当按钮被按下时,中断立即触发——无需轮询。
硬件设计
第一阶段:电路描述
输入 — 按钮(SW1)
一个触觉按钮连接在 PC0 和 GND 之间。一个 100 kΩ 的上拉电阻在按钮释放时使线路保持为高电平。按下按钮会使线路变为低电平,产生下降沿,从而触发 EXTI 中断。
输出 — RGB LED
共阴极RGB LED通过220Ω限流电阻连接到PA2、PA3和PA0。这些电阻可防止LED从GPIO输出引脚吸取过大的电流。
软件设计
第二阶段:项目设置
在 STM32CubeMX 中创建一个新项目,在 MCU 板选择器中搜索 STM32F407ZGT6,然后选择第一个并为项目命名,选择 STMCubeIDE 作为工具链/IDE,最后保持默认设置。
之后,生成代码以保存项目。
第三阶段:CubeMX 配置
创建了一个新的STM32项目,目标为STM32F407ZGT6。在STM32CubeMX中应用了以下引脚配置:
第四阶段:主循环逻辑
主循环遵循以下顺序:
•所有LED均被关闭,计数器被清零。
•硬件随机数生成器(HAL_RNG_GenerateRandomNumber)会生成一个在1000至3000毫秒之间的随机延迟,从而防止用户提前预知信号。
•随机选择的LED颜色被点亮。
•当 flag == 0 时,忙等待循环在每次迭代中都会增加计数器。
•一旦 ISR 将标志设置为 1,循环就会退出,并保存计数器的值。
•根据计数阈值显示反馈LED颜色。
•下一个测试前有5秒的显示时间。
第五阶段:中断服务例程(ISR)
外部中断回调函数 HAL_GPIO_EXTI_Callback 的实现如下:
将 flag 变量声明为 volatile,以防止编译器优化将其值缓存到寄存器中,从而确保主循环能立即检测到变化。
反应时间分类
ISR触发后,计数器值被分为三类:
额外加分——平均十次试验
在每次试验中,会持续维护一个累加值和迭代计数器。完成十次测量后,计算并存储平均计数器值到 avgresponsetime 中,从而减少异常响应的影响。
测试
第六阶段:操作流程
作业中使用了基于断点的方法:在检测到标志后立即设置一个断点,并在STM32CubeIDE的监视窗口中检查计数器变量。
进行了多次试验以观察一致性:
•每次试验中,随机数生成器产生的延迟都不相同,证实不存在可预测的模式。
•每次按键按下时,EXTI回调都能可靠触发,未观察到中断丢失的情况。
•LED颜色变化正确反映了计数器的阈值逻辑。
结果
系统在多次试验中成功测得了人类的反应时间。测试过程中观察到的代表性计数器值总结如下:
图3:输出PS:抱歉,背景噪音
结论
示波器/逻辑分析仪验证说明
本次提交未完成通过逻辑分析仪或示波器对LED激活信号和按钮按下信号的验证。测试时无法获取所需设备,因此无法通过波形采集直接测量毫秒级的响应时间间隔。响应时间是通过循环计数法间接估算的,并如作业第3.3节所述,使用STM32CubeIDE调试器的监视窗口进行数值检查。需承认,这代表了当前结果的一个局限性,因为示波器验证能够提供更精确且不依赖仪器的定时行为确认。若未来能获得相关设备,同时采集LED输出引脚的上升沿与PC0的下降沿,则可直接从时间分段测量中读取实际经过的时间间隔。
第七阶段:总体反思
本次实验演示了在ARM Cortex-M微控制器上基于中断的固件设计方法。通过实际操作进一步强化了轮询式与中断式事件检测之间的区别:轮询循环需要处理器持续采样引脚状态,而EXTI中断方式则允许处理器在硬件事件发生前不受干扰地连续递增计数器,无论循环时间如何,都不会错过任何边沿信号。这是实时嵌入式系统中中断驱动架构的一个根本优势。
该实验也具体说明了人类反应时间和处理器吞吐量之间的关系。每个平均试验中积累的[VALUE]次循环迭代表明,处理器在人类感知视觉刺激并做出物理反应所需的时间内,能够完成大量操作——大约为[VALUE]条汇编指令。这解释了为何现代微控制器即使在单个人类感知事件的时间范围内,也能同时处理多个任务。
第八阶段:遇到的问题
在开发和测试过程中出现了几个问题。在STM32CubeMX中对EXTI外设进行初始配置时,需要仔细选择下降沿触发模式,因为开关电路采用100 kΩ上拉电阻的低电平激活配置;若选择错误的触发方式(上升沿),则在测试期间无法执行中断服务例程。
另一个次要问题是开关触点可能产生的弹跳。由于未实现硬件或软件去抖,开关触点的快速机械振荡理论上可能导致多次 EXTI 中断触发。实际上,基于标志位的设计可以缓解这一问题:一旦 isr_flag 被设置为 1,后续的中断服务例程执行将不会造成影响,因为该标志位无法被设置为大于 1 的值,且主循环在首次检测到事件时就会退出计数循环。这在软件层面实现了隐式的去抖功能。
本文编译自hackster.io





