按键初始化
和上次一样,复制上次的串口文件,改成keytask
打开cubemx工程,将PA3设置成中断线3模式,并将标签改为key1。
使能中断线3
添加按键任务
生成代码即可。
进入工程,查看中断线3函数,找到callback函数,因为中断函数的底层其实就是这个函数在作用。
直接在GPIO.C文件写这个函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(KEY1_Pin == GPIO_Pin )//是不是PA3
{
if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)==GPIO_PIN_RESET)//是否按下PA3
{
HAL_Delay(10);//软件延时去抖动
if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)==GPIO_PIN_RESET)
{
//建立一个标志位
printf("key_pa3 is up!\r\n");
KeyStatus = KEY_UP;
}
}else
{
HAL_Delay(10);
if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)==GPIO_PIN_SET)
{
printf("key_pa3 is DOWN!\r\n");
KeyStatus = KEY_DOWN;
}
}
}
}
枚举类型在GPIO.H里写
typedef enum//枚举类型
{
KEY_DOWN,
KEY_UP,
KEY_RESET,
}teKeyStatus;
并将此类型添加到freeRTOS.c文件中(使用extern)
在任务中,写出逻辑关系
void KEY1_Task03(void const * argument)
{
/* USER CODE BEGIN KEY1_Task03 */
KeyStatus = KEY_RESET;
/* Infinite loop */
for(;;)
{
if(KeyStatus == KEY_DOWN)
{
//LED任务挂起,任务句柄
vTaskSuspend(LEDTaskHandle);
KeyStatus = KEY_RESET;
}
if(KeyStatus == KEY_UP)
{
//恢复任务
vTaskResume(LEDTaskHandle);
KeyStatus = KEY_RESET;
}
//扫描任务周期
osDelay(10);
}
/* USER CODE END KEY1_Task03 */
}
烧录完成后,可以发现当按下按键时,led任务停止,松开后led任务正常工作。