#define KEY1_PIN 15
#define LED_PIN 4
#define KEY2_PIN 16
SemaphoreHandle_t led1 = NULL; // 二进制信号量 创建句柄
SemaphoreHandle_t led2 = NULL;
volatile TickType_t keyDeounce = 0; // 按下按钮的时间
void led1_task(void *param_t){
pinMode(LED_PIN, OUTPUT);
while(1){
// 这种去抖方式是很Low的,正确的方式要使用定时器。
if((xSemaphoreTake(led1, 1000) == pdTRUE) && ((xTaskGetTickCount() - keyDeounce) < 200)){
digitalWrite(LED_PIN,0);
vTaskDelay(500);
}
}
}
void led2_task(void *param_t){
pinMode(LED_PIN, OUTPUT);
while(1){
// 这种去抖方式是很Low的,正确的方式要使用定时器。
if((xSemaphoreTake(led2, 1000) == pdTRUE) && ((xTaskGetTickCount() - keyDeounce) < 200)){
digitalWrite(LED_PIN,1);
vTaskDelay(500);
}
}
}
// 中断服务函数
void IRAM_ATTR ISR1() {
keyDeounce = xTaskGetTickCountFromISR(); // 记录下按下的时间,用于放抖动,正式开发中不要这样写,有Bug
xSemaphoreGiveFromISR(led1, NULL);
}
// 中断服务函数
void IRAM_ATTR ISR2() {
keyDeounce = xTaskGetTickCountFromISR(); // 记录下按下的时间,用于放抖动,正式开发中不要这样写,有Bug
xSemaphoreGiveFromISR(led2, NULL);
}
void setup() {
Serial.begin(115200);
led1 = xSemaphoreCreateBinary(); //创建二进制信号量
led2 = xSemaphoreCreateBinary();
xTaskCreate(led1_task, "LED-DSP", 1024, NULL, 1, NULL);
xTaskCreate(led2_task, "LED-DSP", 1024, NULL, 1, NULL);
// 安装中断
pinMode(KEY1_PIN, INPUT_PULLUP);
attachInterrupt(KEY1_PIN, ISR1, FALLING);
pinMode(KEY2_PIN, INPUT_PULLUP);
attachInterrupt(KEY2_PIN, ISR2, FALLING);
}
void loop() {
delay(10);
}
Loading
esp32-s3-devkitc-1
esp32-s3-devkitc-1