一.任务功能
1、修改按键功能,模拟停车位出入功能
2、当按键按下 获取车位
3、当按键抬起 释放车位
二.API接口
函数原型 | SemaphoreHandle_t xSemaphoreCreateCounting( ①UBaseType_t uxMaxCount, ②UBaseType_t uxInitialCount ); |
功能概述 | 创建计数信号量,并返回信号量句柄。 |
参数 | ①:计数信号量最大值,当信号量到达最大值后,就不能是give ②:创建时,计数信号量初始值 |
返回值 | NULL:堆空间不足 Any other value :信号量句柄 |
注意事项 | configSUPPORT_DYNAMIC_ALLOCATION必须置为1 USE_COUNTING_SEMAPHORES必须置为1 |
函数原型 | #include “FreeRTOS.h” #include “semphr.h” UBaseType_t uxSemaphoreGetCount( ①SemaphoreHandle_t xSemaphore ); |
功能概述 | 返回当前信号量计数值 |
参数 | ①:信号量句柄 |
返回值 | 当前信号量计数值 |
注意事项 | None |
三.业务流程
三.CubeMX配置
使能计数量
创建信号量
四.代码配置
GPIO.c
extern osSemaphoreId KeyCountingSemHandle;
//按键检测回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(Key1_Pin == GPIO_Pin) //判断按下的GPIO
{
if ( HAL_GPIO_ReadPin(GPIOA,GPIO_Pin) == GPIO_PIN_RESET) //按下按键,导通
{
// HAL_Delay(10); //软件去抖动
if( HAL_GPIO_ReadPin(GPIOA,GPIO_Pin) == GPIO_PIN_RESET)
{
// HAL_GPIO_WritePin(GPIOB,Led_Red_Pin,GPIO_PIN_RESET);
// HAL_GPIO_WritePin(GPIOB,Led_Green_Pin,GPIO_PIN_SET);
/*建立标志位*/
keyStatus = Key_down;
printf("按键已按下\r\n");
if(xSemaphoreTakeFromISR(KeyCountingSemHandle,NULL) == pdPASS)
{
printf("获取车位成功\r\n");
}
else
{
printf("获取车位失败,车位已满\r\n");
}
}
}
else
{
if( HAL_GPIO_ReadPin(GPIOA,GPIO_Pin) == GPIO_PIN_SET) // 高电平,未准备好
{
// HAL_Delay(10); //软件去抖动
if( HAL_GPIO_ReadPin(GPIOA,GPIO_Pin) == GPIO_PIN_SET)
{
// HAL_GPIO_WritePin(GPIOB,Led_Red_Pin,GPIO_PIN_SET); //关闭红灯
// HAL_GPIO_WritePin(GPIOB,Led_Green_Pin,GPIO_PIN_RESET); //开启绿灯
/*建立标志位*/
keyStatus = Key_up;
printf("按键已抬起\r\n");
if(xSemaphoreGiveFromISR(KeyCountingSemHandle,NULL) == pdPASS)
{
printf("释放车位成功\r\n");
}
else
{
printf("释放车位失败,车位为空\r\n");
}
}
}
}
}
}