一、接口介绍
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);
}
}
}