首先,在cubemx中设置五个GPIO引脚为中断模式,
并且开启中断使能,
打开串口中断
设置调试方式
设置中断数据传输方式
在it.c文件中存放着所有的中断相关的函数,在其中找到想要的函数(中断回调函数)
进入回调函数内,找到回调函数的定义(回调函数为虚定义,可用户更改),进行修改使用
在borad.c文件中,重写回调函数,并且使用switch语句,实现对五个按键的检测功能
这段代码是`HAL_GPIO_EXTI_Callback`函数的一部分,主要用于处理按键中断事件。具体解释如下:
1. `static uint32_t tick = 0;`:定义了一个静态的32位无符号整数变量`tick`,并初始化为0。静态变量的生命周期贯穿整个程序运行期间,且只会初始化一次,这里用于记录按键按下的时间。
2. `UNUSED(GPIO_Pin);`:这是一个预处理指令,用于防止编译器对未使用的参数`GPIO_Pin`发出警告。虽然在当前代码逻辑中`GPIO_Pin`已被使用,但这种写法是一种良好的编程习惯,可避免在不同情况下可能出现的编译警告。
3. `/* NOTE: This function Should not be modified, when the callback is needed, the HAL_GPIO_EXTI_Callback could be implemented in the user file */`:这是一段注释,提示该函数原则上不应被修改,如果需要实现特定的回调功能,应在用户文件中重新实现`HAL_GPIO_EXTI_Callback`函数。
4. `switch(GPIO_Pin)`:使用`switch`语句根据传入的`GPIO_Pin`参数值来判断是哪个按键触发了中断。
5. `case SW1_Pin:`:当`GPIO_Pin`的值为`SW1_Pin`时,表示按键`SW1`触发了中断。
6. `if(HAL_GPIO_ReadPin(SW1_GPIO_Port,SW1_Pin) == GPIO_PIN_RESET)`:通过`HAL_GPIO_ReadPin`函数读取`SW1`按键对应的GPIO引脚电平状态,如果引脚电平为低电平(`GPIO_PIN_RESET`表示低电平),则表示按键按下。
7. `tick = HAL_GetTick();`:如果按键`SW1`按下,使用`HAL_GetTick`函数获取当前的系统滴答定时器的值,并将其赋值给`tick`变量,以此记录按键按下的时间。
8. `else`:当按键`SW1`松开时(即引脚电平为高电平),执行`else`分支。
9. `WS_Debug("SW1 down time %d ms\r\n",HAL_GetTick() - tick);`:使用`WS_Debug`函数输出按键`SW1`按下的时长。`HAL_GetTick() - tick`计算出从按键按下到松开的时间差,单位为毫秒,然后通过`WS_Debug`函数格式化输出该时间差。
例如,假设按键`SW1`按下时`HAL_GetTick()`返回值为1000,松开时返回值为1500,那么输出的信息将是`SW1 down time 500 ms`,表示按键`SW1`按下了500毫秒。
解释系统滴答计数器的实现
分别定义初始值和要延时的时间,首先判断延时时间不能超过最大系统时间,如果超过直接跳出,对延时的时间加一(系统固定,不理解),
进行循环判定当前值 减去 初始值 小于 目标值,继续循环累加
不满足条件。直接跳出循环
仿照系统函数,设计等待计数
补充(其中的初始值需要设置为静态变量,否则将检测时间将出错)