一,FreeRTOS 基本设置
无设置,cubemx无法自己生成,需自己编写
二,写代码
事件标志组重新定义一下
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN Variables */
EventGroupHandle_t myEventGroupHandle_1;
/* USER CODE END Variables */
在FreeRTOS创建函数里添加
/* USER CODE BEGIN Init */
myEventGroupHandle_1 = xEventGroupCreate();
/* USER CODE END Init */
主控制函数
void StartDefaultTask_KEY(void const * argument)
{
/* USER CODE BEGIN StartDefaultTask_KEY */
/* Infinite loop */
for(;;)
{
EventBits_t myEventBits_1;
myEventBits_1 = xEventGroupWaitBits(myEventGroupHandle_1,Event_1|Event_2,pdTRUE,pdFALSE,portMAX_DELAY);
if(myEventBits_1 & Event_1)
{
osThreadSuspendAll();
printf("事件1 发生 \r\n");
osThreadResumeAll();
}
if(myEventBits_1 & Event_2)
{
osThreadSuspendAll();
printf("事件2 发生 \r\n");
osThreadResumeAll();
}
osDelay(1);
}
/* USER CODE END StartDefaultTask_KEY */
}
事件1:
void StartTask02(void const * argument)
{
/* USER CODE BEGIN StartTask02 */
/* Infinite loop */
for(;;)
{
if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_9) == 1)
{
osDelay(10);
if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_9) == 1)
{
osThreadSuspendAll();
printf("KEY_1 已经按下\r\n");
osThreadResumeAll();
xEventGroupSetBits(myEventGroupHandle_1,Event_1);
while(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_9) == 1)
{
osDelay(10);
}
}
}
osDelay(1);
}
/* USER CODE END StartTask02 */
}
事件2:
void StartTask03(void const * argument)
{
/* USER CODE BEGIN StartTask03 */
/* Infinite loop */
for(;;)
{
if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_9) == 1)
{
osDelay(10);
if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_9) == 1)
{
osThreadSuspendAll();
printf("KEY_1 已经按下\r\n");
osThreadResumeAll();
xEventGroupSetBits(myEventGroupHandle_1,Event_2);
while(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_9) == 1)
{
osDelay(10);
}
}
}
osDelay(1);
}
/* USER CODE END StartTask03 */
}
三,结果
总结
就需要两个按键同时按,才有效果
//创建事件标志
#define Event_1 (1<<1)
#define Event_2 (1<<2)
//创建事件句柄
EventGroupHandle_t myEventGroupHandle_1;
//创建事件
myEventGroupHandle_1 = xEventGroupCreate();
//设置事件状态
xEventGroupSetBits(myEventGroupHandle_1,Event_1);
//等待事件
myEventBits_1 =
xEventGroupWaitBits(myEventGroupHandle_1,//句柄
Event_1|Event_2,//所有事件
pdTRUE,//
pdTRUE,// pdFALSE ===> 只需满足一个条件即可
// pdTRUE ===> 条件都满足才行
portMAX_DELAY);
//判断事件
if(myEventBits_1 & Event_1)
{
osThreadSuspendAll();
printf("事件1 发生 \r\n");
osThreadResumeAll();
}