【FreerRTOS按键队列的实现】 在Freertos中实现单按键和多按键的的读取1、单按键#includeFreeRTOS.h#includetask.h#includequeue.h#includestm32f4xx_hal.h#defineKEY_DEBOUNCE_TIME_MS20QueueHandle_t key_event_queue;voidkey_scan_task(void*pvParameters){for(;;){// Scan the state of the keysuint8_tkey_stateHAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);// Wait for the debounce timevTaskDelay(pdMS_TO_TICKS(KEY_DEBOUNCE_TIME_MS));// Check if the key is still pressedif(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)key_state){// Send the key event to the queueif(key_stateGPIO_PIN_SET){uint8_tkey_event1;xQueueSend(key_event_queue,key_event,0);}}}}voidhandle_key_event_task(void*pvParameters){for(;;){// Wait for a key event to be receiveduint8_tkey_event;xQueueReceive(key_event_queue,key_event,portMAX_DELAY);// Handle the key eventprintf(Key pressed\n);}}voidinit_key_scan(void){// Initialize the key event queuekey_event_queuexQueueCreate(10,sizeof(uint8_t));// Create the key scan taskxTaskCreate(key_scan_task,KeyScanTask,configMINIMAL_STACK_SIZE,NULL,tskIDLE_PRIORITY,NULL);// Create the handle key event taskxTaskCreate(handle_key_event_task,HandleKeyEventTask,configMINIMAL_STACK_SIZE,NULL,tskIDLE_PRIORITY,NULL);}2、多按键的情况#includeFreeRTOS.h#includetask.h#includequeue.h#includestm32f4xx_hal.h#defineKEY_DEBOUNCE_TIME_MS20#defineKEY_NUM3typedefenum{KEY_NONE0,KEY1,KEY2,KEY3}key_t;QueueHandle_t key_event_queue;GPIO_TypeDef*key_ports[KEY_NUM]{GPIOA,GPIOB,GPIOC};uint16_tkey_pins[KEY_NUM]{GPIO_PIN_0,GPIO_PIN_1,GPIO_PIN_2};key_tkey_state[KEY_NUM]{KEY_NONE};key_tkey_enter_state[KEY_NUM]{KEY_NONE};voidkey_scan_task(void*pvParameters){for(;;){for(inti0;iKEY_NUM;i){// Scan the state of the keyuint8_tstateHAL_GPIO_ReadPin(key_ports[i],key_pins[i]);// Wait for the debounce timevTaskDelay(pdMS_TO_TICKS(KEY_DEBOUNCE_TIME_MS));// Check if the key is still pressedif(HAL_GPIO_ReadPin(key_ports[i],key_pins[i])state){if(stateGPIO_PIN_SETkey_state[i]!KEY1key_state[i]!KEY2key_state[i]!KEY3){// Send the key event to the queuekey_tkeyKEY_NONE;switch(i){case0:keyKEY1;break;case1:keyKEY2;break;case2:keyKEY3;break;}if(key!KEY_NONE){key_state[i]key;xQueueSend(key_event_queue,key,0);}}while(HAL_GPIO_ReadPin(key_ports[i],key_pins[i])state(key_state[i]KEY1||key_state[i]KEY2||key_state[i]KEY3));key_state[i]KEY_NONE;}}}}voidhandle_key_event_task(void*pvParameters){for(;;){// Wait for a key event to be receivedkey_tkey_event;xQueueReceive(key_event_queue,key_event,portMAX_DELAY);// Handle the key eventswitch(key_event){caseKEY1:printf(Key 1 pressed\n);if(key_enter_state[0]!KEY1){key_enter_state[0]KEY1;//这里写按键按下需要处理的事件}else{key_enter_state[0]KEY_NONE;//这里写按键按下需要处理的事件}break;caseKEY2:printf(Key 2 pressed\n);break;caseKEY3:printf(Key 3 pressed\n);break;default:break;}}}voidinit_key_scan(void){// Initialize the key event queuekey_event_queuexQueueCreate(10,sizeof(key_t));// Create the key scan taskxTaskCreate(key_scan_task,KeyScanTask,configMINIMAL_STACK_SIZE,NULL,tskIDLE_PRIORITY,NULL);// Create the handle key event taskxTaskCreate(handle_key_event_task,HandleKeyEventTask,configMINIMAL_STACK_SIZE,NULL,tskIDLE_PRIORITY,NULL);}