一.任务功能
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");
                    }
                }
            }
         }
     }
}


















