前言
采用的开发板是正点原子战舰版
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灯的亮灭,使用这个编写方法,可以将按键集成好,并且非常灵敏