FreeRTOS按键编写(HAL库)

前言

采用的开发板是正点原子战舰版

cubemax使能部分

使用cubemax生成两个任务和一个二值信号量

keil代码部分

外部函数

uint8_t key_read()
{
	if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4)==0) return 1;
	if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3)==0) return 2;
	if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2)==0) return 3;
	else return 0;
}

void key_serv()
{
	uint8_t key_sta=key_read();
	if(key_sta!=0)
	{
		bkey[key_sta].age++;
		if(bkey[key_sta].age==2)
		{bkey[key_sta].flag=1;}
	}
	else
	{
		for(int i=0;i<5;i++)
		{bkey[i].age=0;}
	}
}

按键任务函数

void key_pro(void *argument)
{
  /* USER CODE BEGIN key_pro */
//	osStatus_t result;
  /* Infinite loop */
  for(;;)
  {
	key_serv();
	  if(bkey[1].flag==1)
	  {
		  /*二忼信号量的使甿
		  *函数丿:cubemax生成的二值信号量
		  *函数二:手动创建的二值信号量
		  */
		  osSemaphoreRelease(key_controlHandle);
		  
//		  BaseType_t xSemaphoreGive(SemaphoreHandle_t key_controlHandle);
		  bkey[1].flag=0;
	  }
    osDelay(1);
  }
  /* USER CODE END key_pro */
}

LED灯的函数

void LED_pro(void *argument)
{
  /* USER CODE BEGIN LED_pro */
	osStatus_t key;
  /* Infinite loop */
  for(;;)
  {
	  key = osSemaphoreAcquire(key_controlHandle,10);
	  HAL_Delay(10);
	  if(key == osOK)
	  {
		  if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_5)==1)
		  {
				HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);
				HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_RESET);
		  }
		  else
		  {
				HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);
				HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_SET);
		  }
			
	  }
    osDelay(1);
  }
  /* USER CODE END LED_pro */
}

结语

可以实现按下按键一LED灯的亮灭,使用这个编写方法,可以将按键集成好,并且非常灵敏

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值