你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

ST NUCLEO-U575ZI-Q FreeRTOS按键检测

[复制链接]
STMCU小助手 发布时间:2023-1-10 17:37

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

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

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

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

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

  13.   Take的时候如果这个整数是0的话,就等待一直到timeout
  14. */
复制代码

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

程序如下:

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

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

  5. typedef struct {
  6.   byte pin;
  7.   int delayTime;
  8. } LEDFLASH;

  9. void ledFlash(void *pt){
  10.   LEDFLASH *ptLedFlash = (LEDFLASH *)pt;
  11.   byte pin = ptLedFlash->pin;
  12.   int delayTime = ptLedFlash->delayTime;

  13.   pinMode(pin,OUTPUT);
  14.   while(1){
  15.     //Serial.println("led1 flash");
  16.     digitalWrite(pin,!digitalRead(pin));
  17.     vTaskDelay(delayTime);
  18.    
  19.   }
  20. }
  21. void ledFlash2(void *pt){
  22.   byte pin = PC7;
  23.   int delayTime = 500;
  24.   pinMode(pin,OUTPUT);
  25.   while(1){
  26.     if(xSemaphoreTake(xSemaLED,timeOut) == pdTRUE)
  27.     {
  28.       digitalWrite(pin,!digitalRead(pin));
  29.       vTaskDelay(delayTime);
  30.     }
  31.    
  32.   }
  33. }

  34. void readBtn(void *pt)
  35. {
  36.   byte pin = PC13;
  37.   pinMode(pin, INPUT_PULLDOWN);
  38.   while(1)
  39.   {
  40.     if(digitalRead(pin) == HIGH){
  41.       xSemaphoreGive(xSemaLED);
  42.       vTaskDelay(120);
  43.     }
  44.   }
  45. }
  46. LEDFLASH led1,led2;

  47. void setup() {
  48.   Serial.begin(115200);
  49.   led1.pin = PB7;
  50.   led1.delayTime = 200;
  51.   led2.pin = PC7;
  52.   led2.delayTime = 500;
  53.   TaskHandle_t myTask1,butTask;
  54.   xSemaLED = xSemaphoreCreateBinary(); //创建二进制信号量
  55.   if(xTaskCreate(ledFlash,
  56.                   "FLASH LED",
  57.                   1024,
  58.                   (void *)&led1,
  59.                   6,
  60.                   NULL) == pdPASS)
  61.     Serial.println("led1,flash task Created.");
  62.   
  63.   if (xTaskCreate(ledFlash2,
  64.                   "Flash LED.",
  65.                   1024,
  66.                   NULL,
  67.                   6,
  68.                   NULL) == pdPASS)
  69.     Serial.println("led2 flash task Created.");
  70.   
  71.   if (xTaskCreate(readBtn,
  72.                   "Read Button",
  73.                   1024,
  74.                   NULL,
  75.                   1,
  76.                   &butTask)== pdPASS)
  77.     Serial.println("Create Read Button Semaphore.");
  78.   
  79.   vTaskStartScheduler();
  80. }

  81. void loop() {
  82.   // put your main code here, to run repeatedly:
  83. }
复制代码

实验现象见视频。


出处:社区用户:lugl发布


收藏 评论0 发布时间:2023-1-10 17:37

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版