有关 STM32Cube FreeRtos 事件组的使用

文章详细介绍了如何在嵌入式系统中使用xEventGroup接口进行事件管理,包括SetBits和WaitBits函数的用法,以及在按键控制和OLED屏幕刷新中的应用。通过两种模式(与模式和或模式)展示了事件等待的逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、接口介绍

1.1 xEventGroupSetBits()

参数:

xEventGroup:事件组句柄;

uxBitsToClear:要指定置1 的事件位;

1.2 xEventGroupWaitBits()

参数:

xEventGroup:事件组句柄;

uxBitsToWaitFord:指定要等待的事件位(final result);

xClearOnExit:pdTRUE,自动清零事件位;

xWaitForAllBits:若为pdTRUE,当uxBitsToWaitFor所设置的这些事件位都置1(与模式),函数返回;若为pdFALSE,只要uxBitsToWaitFor所设置的这些事件位其中的任意一个置1(或模式),函数返回;

xTicksToWait:portMAX_DELAY。

返回值:返回当所等待的事件位置1以后的事件标志组的值。

二、代码编写

2.1与模式

        两按键按下,完成置位。

void StartTask01(void const * argument)
{
  /* USER CODE BEGIN StartTask01 */
  /* Infinite loop */
  for(;;)
  {
	  Key_Check();
	  if(keyvalue == KEY0) {
		  xEventGroupSetBits(MyEvent, 0x1000);
		  keyvalue = UNKNOW;
	  }
	  else if(keyvalue == KEY1) {
		  xEventGroupSetBits(MyEvent, 0x0001);
		  keyvalue = UNKNOW;
	  }
  }
  /* USER CODE END StartTask01 */
}

        两按键均按下后函数返回值为0x1001,实现OLED屏幕刷新

void StartTask02(void const * argument)
{
  /* USER CODE BEGIN StartTask02 */
  /* Infinite loop */
  for(;;)
  {
	  if(xEventGroupWaitBits(MyEvent, 0x1001, pdTRUE, pdTRUE, portMAX_DELAY) == 0x1001)
	  {
		  OLED_printf(0, 0, "hello world!!!");
		  OLED_refresh_gram();
		  osDelay(500);
		  OLED_printf(0, 0, "                           ");
		  OLED_refresh_gram();
	  }
  }
  /* USER CODE END StartTask02 */
}

2.2或模式

        定义flag变量接返回值,KEY0按下返回0x1000,KEY1按下返回0x0001,实现OLED屏幕刷新

void StartTask02(void const * argument)
{
  /* USER CODE BEGIN StartTask02 */
	uint32_t flag;
  /* Infinite loop */
  for(;;)
  {
//	  if(xEventGroupWaitBits(MyEvent, 0x1001, pdTRUE, pdTRUE, portMAX_DELAY) == 0x1001)
	  flag = xEventGroupWaitBits(MyEvent, 0x1001, pdTRUE, pdFALSE, portMAX_DELAY);
	  if(flag == 0x0001 || flag == 0x1000)
	  {
		  OLED_printf(0, 0, "hello world!!!");
		  OLED_refresh_gram();
		  osDelay(500);
		  OLED_printf(0, 0, "                           ");
		  OLED_refresh_gram();
	  }
  }
  /* USER CODE END StartTask02 */
}

2.3封装

EventGroupHandle_t MyEvent = NULL;//手动创建事件组
...
MyEvent = xEventGroupCreate();//手动创建事件组
...
/*按键封装*/
typedef enum {
	KEY0,
	KEY1,
	UNKNOW
}KeyValue;
KeyValue keyvalue = UNKNOW;
GPIO_TypeDef * KeyPort[NumKey] = {
		KEY0_GPIO_Port,
		KEY1_GPIO_Port,
};
uint16_t Key_Pin[NumKey] = {
		KEY0_Pin,
		KEY1_Pin,
};
void Key_Check (void) {
	for(uint8_t i =0; i < NumKey; i++) {
		if(HAL_GPIO_ReadPin(KeyPort[i], Key_Pin[i]) == 0) {
			osDelay(10);
			if(HAL_GPIO_ReadPin(KeyPort[i], Key_Pin[i]) == 0){
				keyvalue = i;
			}
		while(HAL_GPIO_ReadPin(KeyPort[i], Key_Pin[i]) == 0);
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值