1666|1

7056

帖子

11

TA的资源

版主

楼主
 

[ ST NUCLEO-U575ZI-Q 测评] 按键检测——FreeRTOS [复制链接]

前面做到了多任务点灯,今天用按键检测来控制LED灯的闪烁。

这里用到freertos的信号量来做控制:

/*
  程序:  Binary Semaphore 是一种信号机制
         一个任务(生产者)发出信号。另外一个任务(消费者)接受信号
  公众号:孤独的二进制

  语法:
  SemaphoreHandle_t xHandler; 创建Handler
  xHandler = xSemaphoreCreateBinary(); 创建一个二进制信号量 返回NULL,或者handler
  xSemaphoreGive(xHandler); 生产者+1
  xSemaphoreTake(xHanlder, timeout); 消费者-1 返回pdPASS, 或者pdFAIL

  二进制信号量可以想成就是一个整数 0 或者 1
  Give就是+1
  Take就是-1

  Take的时候如果这个整数是0的话,就等待一直到timeout
*/

思路是:1个是周期任务闪灯,另一人任务是接收到信号量才产生灯的转换。如果不按按键就保持原来的状态,如果检测按键按下,测周期闪灯。

程序如下:

#include <Arduino.h>
#include <STM32FreeRTOS.h>

SemaphoreHandle_t xSemaLED = NULL;//创建信号量Handler
TickType_t timeOut = 1000; //用于获取信号的Timeout 

typedef struct {
  byte pin;
  int delayTime;
} LEDFLASH;

void ledFlash(void *pt){
  LEDFLASH *ptLedFlash = (LEDFLASH *)pt;
  byte pin = ptLedFlash->pin;
  int delayTime = ptLedFlash->delayTime;

  pinMode(pin,OUTPUT);
  while(1){
    //Serial.println("led1 flash");
    digitalWrite(pin,!digitalRead(pin));
    vTaskDelay(delayTime);
    
  }
}
void ledFlash2(void *pt){
  byte pin = PC7;
  int delayTime = 500;
  pinMode(pin,OUTPUT);
  while(1){
    if(xSemaphoreTake(xSemaLED,timeOut) == pdTRUE)
    {
      digitalWrite(pin,!digitalRead(pin));
      vTaskDelay(delayTime);
    }
    
  }
}

void readBtn(void *pt)
{
  byte pin = PC13;
  pinMode(pin, INPUT_PULLDOWN);
  while(1)
  {
    if(digitalRead(pin) == HIGH){
      xSemaphoreGive(xSemaLED);
      vTaskDelay(120);
    }
  }
}
LEDFLASH led1,led2;

void setup() {
  Serial.begin(115200);
  led1.pin = PB7;
  led1.delayTime = 200;
  led2.pin = PC7;
  led2.delayTime = 500;
  TaskHandle_t myTask1,butTask;
  xSemaLED = xSemaphoreCreateBinary(); //创建二进制信号量
  if(xTaskCreate(ledFlash,
                  "FLASH LED",
                  1024,
                  (void *)&led1,
                  6,
                  NULL) == pdPASS)
    Serial.println("led1,flash task Created.");
  
  if (xTaskCreate(ledFlash2,
                  "Flash LED.",
                  1024,
                  NULL,
                  6,
                  NULL) == pdPASS)
    Serial.println("led2 flash task Created.");
  
  if (xTaskCreate(readBtn,
                  "Read Button",
                  1024,
                  NULL,
                  1,
                  &butTask)== pdPASS)
    Serial.println("Create Read Button Semaphore.");
  
  vTaskStartScheduler();
}

void loop() {
  // put your main code here, to run repeatedly:
}

实验现象见视频。

2022-12-14 09.41拍摄的影片

 

此帖出自无线连接论坛

最新回复

测评汇总:免费申请|ST NUCLEO-U575ZI-Q https://bbs.eeworld.com.cn/thread-1228653-1-1.html   详情 回复 发表于 2023-1-12 09:27
点赞 关注
 

回复
举报

1万

帖子

203

TA的资源

管理员

沙发
 

测评汇总:免费申请|ST NUCLEO-U575ZI-Q https://bbs.eeworld.com.cn/thread-1228653-1-1.html

此帖出自无线连接论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
个人签名玩板看这里:
https://bbs.eeworld.com.cn/elecplay.html
EEWorld测评频道众多好板等你来玩,还可以来频道许愿树许愿说说你想要玩的板子,我们都在努力为大家实现!
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
快速回复 返回顶部 返回列表