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