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

ST NUCLEO-U575ZI-Q FreeRTOS按键检测

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

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

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

  1. /*3 o, Z4 r5 E- f
  2.   程序:  Binary Semaphore 是一种信号机制9 O  j  V/ n7 G5 S; s" r6 c
  3.          一个任务(生产者)发出信号。另外一个任务(消费者)接受信号- P* _- _0 i( M6 i! }
  4.   公众号:孤独的二进制( q$ d* P! N2 [# X

  5. ' a2 A) {- _. ^5 k0 O( k
  6.   语法:
    4 _) O/ z  x- B' G! A0 W
  7.   SemaphoreHandle_t xHandler; 创建Handler
      e0 D5 ~# A; M" k* {' A, b
  8.   xHandler = xSemaphoreCreateBinary(); 创建一个二进制信号量 返回NULL,或者handler8 h( S/ M, w. x9 c7 P# c0 J
  9.   xSemaphoreGive(xHandler); 生产者+1
    , K) }3 ^% t6 B6 ?  e5 N, X0 t
  10.   xSemaphoreTake(xHanlder, timeout); 消费者-1 返回pdPASS, 或者pdFAIL
    1 T" O* C" R' ~  y+ p- f/ h

  11. 1 W0 L8 ]3 `4 _0 T
  12.   二进制信号量可以想成就是一个整数 0 或者 1
    9 ]% B) Y/ ^* z5 A. F' U% j0 n
  13.   Give就是+1
    7 L  r5 h# ^6 @3 R2 g0 q) b
  14.   Take就是-13 |* U6 J9 k* h' e% v, S6 T% Z

  15. ' g( S/ ?% H2 V3 Y' @0 K
  16.   Take的时候如果这个整数是0的话,就等待一直到timeout
    6 }0 Z) V9 D# e/ Q7 L- c' m
  17. */
复制代码

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

程序如下:

  1. #include <Arduino.h>6 Z2 G# n5 a/ n1 H
  2. #include <STM32FreeRTOS.h>) K6 `# D: a/ h. D

  3. # }( |2 l5 {7 ~
  4. SemaphoreHandle_t xSemaLED = NULL;//创建信号量Handler
    9 `  `" H7 n9 u7 f- _7 r
  5. TickType_t timeOut = 1000; //用于获取信号的Timeout 1 C3 t, A' l: B9 g, Y+ R

  6. 5 w. B( K5 L/ E6 o
  7. typedef struct {4 O# {/ W9 z  P' h9 E3 A
  8.   byte pin;
    # }8 v* i! M: E+ a6 k
  9.   int delayTime;9 C( _% G6 z# _2 Y$ }- I# s3 ^& |
  10. } LEDFLASH;
    7 v0 p/ M) R% b# V2 S1 p& Q2 g$ q$ M

  11. : A) V2 d3 ~; y3 d6 N" g1 R, Z
  12. void ledFlash(void *pt){2 m$ i7 n% y+ Q$ D4 ^1 l4 [
  13.   LEDFLASH *ptLedFlash = (LEDFLASH *)pt;
    ; }  |0 u8 u- j9 a9 Z" D
  14.   byte pin = ptLedFlash->pin;8 S% X( x$ q8 U% E( x" Y3 R
  15.   int delayTime = ptLedFlash->delayTime;
    8 c% O9 O7 e  o

  16. . K  ^( z/ w- s' d
  17.   pinMode(pin,OUTPUT);8 ~/ U; u7 e+ P! m3 V' o  f
  18.   while(1){' ]  g+ _0 u' K. R5 n* t* k! ]
  19.     //Serial.println("led1 flash");1 J7 G* a$ p% k
  20.     digitalWrite(pin,!digitalRead(pin));* l9 f; |4 `1 i# O$ P
  21.     vTaskDelay(delayTime);8 N/ u( b6 o2 D+ u1 @, w0 r& }9 M, W
  22.    
    + D& j: o+ s. ]- l, e, y
  23.   }! S% H/ ?( A6 L& U( [
  24. }
    . g# E( o  e/ c+ c4 _6 s4 P  b3 G& a
  25. void ledFlash2(void *pt){
    / e* C4 t2 B% U& Y" h' m0 j
  26.   byte pin = PC7;9 ?, Y/ b+ A; f1 v1 m+ a3 U% Z4 t
  27.   int delayTime = 500;) d5 w+ _4 J; W: \* r
  28.   pinMode(pin,OUTPUT);0 a8 W' G6 B) b  j: x3 Y
  29.   while(1){  s  P; O! y4 o
  30.     if(xSemaphoreTake(xSemaLED,timeOut) == pdTRUE)' L3 S4 x' o" n! L, M# ^6 D
  31.     {0 J2 m, u/ M( M, N
  32.       digitalWrite(pin,!digitalRead(pin));0 Q/ D& U; x$ ?- |6 v- f
  33.       vTaskDelay(delayTime);
    4 ]# _3 d, l/ f1 K2 v; Z
  34.     }
    8 o6 N+ f/ ]$ X; o6 `& H% z
  35.    
    - s# j3 b/ J& Y$ ]6 l) n
  36.   }
    " B+ Q& f1 @! a5 |# y: M3 U
  37. }
    0 D5 E1 A5 w; f
  38. 5 T0 X' O9 |# v  @2 ?, G$ ]
  39. void readBtn(void *pt)0 E' w# c: R$ z' m( F% ~4 T6 h5 W
  40. {
    1 J* b* C) H, z$ v6 Q% J4 D8 a
  41.   byte pin = PC13;
    * d6 f7 R2 I" F( w
  42.   pinMode(pin, INPUT_PULLDOWN);
    ! A- Y. r' y) k9 K( j
  43.   while(1)' F8 T  w- `+ F
  44.   {  @6 Q2 s, z$ h* @' o9 G; R
  45.     if(digitalRead(pin) == HIGH){
    6 i3 a3 T( V+ J+ H) }  A
  46.       xSemaphoreGive(xSemaLED);9 c6 n$ {$ g3 s0 B3 d/ ~% F
  47.       vTaskDelay(120);
    / d2 x" ]) H3 G  D* T
  48.     }# d: |% A  [5 ~
  49.   }
    1 S# c1 P1 A" s6 @. B8 r
  50. }
    0 M. M3 W, n+ H% v0 r
  51. LEDFLASH led1,led2;
    - D5 }' J2 A5 f' [
  52. + Z: S+ J0 \1 x, O, P& I
  53. void setup() {
    0 H( B4 P, M$ M: D/ L2 o
  54.   Serial.begin(115200);
    6 M: H3 v, S& P2 ]
  55.   led1.pin = PB7;
    3 @  O# b) ]. K  W8 M; u5 A! p1 ?
  56.   led1.delayTime = 200;
    / h; ^8 _- y* T/ _  M
  57.   led2.pin = PC7;4 x, K8 i! U, a9 V
  58.   led2.delayTime = 500;& h. j7 F/ s6 N# s9 I8 n
  59.   TaskHandle_t myTask1,butTask;) y+ C2 g  z/ E' \  y& a
  60.   xSemaLED = xSemaphoreCreateBinary(); //创建二进制信号量
    ! V: L0 j; h0 T" u$ n  R5 m
  61.   if(xTaskCreate(ledFlash,
    6 _1 X! Q" b: V; m( v- r# a
  62.                   "FLASH LED",
    - u* I1 q% w( j- `
  63.                   1024,: V& O% |8 c; q- v) _9 G
  64.                   (void *)&led1," ^% M$ A6 f5 P* P/ L
  65.                   6,. U* l4 m& N" Z9 v0 ?) b- I! G
  66.                   NULL) == pdPASS)
    5 d8 e) p! @: H+ |+ q
  67.     Serial.println("led1,flash task Created.");) F2 J4 m, L) }( [. p
  68.   + p2 V/ M( o& ~" U8 s% x- y
  69.   if (xTaskCreate(ledFlash2,+ V6 h. j9 @$ W" U: u* ^% R
  70.                   "Flash LED.",$ K5 {" O8 A  V# j# c
  71.                   1024,5 e" z  U0 c) J. d
  72.                   NULL,# Z) X& C# t" G9 H. a
  73.                   6,
    * [  r1 d8 i& n( `  B
  74.                   NULL) == pdPASS)7 ]/ W. {8 ?! ~2 Z+ {# O
  75.     Serial.println("led2 flash task Created.");+ b: |8 q% B& S% r; y# k
  76.   
    ) e. a) h5 d& |
  77.   if (xTaskCreate(readBtn,
    2 |/ `- p6 J! ?
  78.                   "Read Button",
    # B+ f# O) T9 B) O- ~
  79.                   1024,
    2 p$ Q; @+ M" P
  80.                   NULL,( D4 x7 E9 Z; ~/ M
  81.                   1,' p# @3 ]: q) Z1 C* d  z% V% S" K5 _
  82.                   &butTask)== pdPASS), v# V1 A, l& O9 Y6 g
  83.     Serial.println("Create Read Button Semaphore.");
    . Q- i7 J9 J9 Y7 g
  84.   
    - h& x; W3 @! e) A' Z
  85.   vTaskStartScheduler();2 V# P) @# o% b8 M* a- _! I
  86. }2 x+ w% a- o7 M5 s0 O

  87. 7 m! b9 F: Y4 v- L" b4 U
  88. void loop() {5 d3 A1 ~7 ^5 Q' s
  89.   // put your main code here, to run repeatedly:
    ) R, Y5 S3 }0 P
  90. }
复制代码

实验现象见视频。


  `8 ]7 }* X6 _0 L3 G4 n( U

出处:社区用户:lugl发布

8 O; I. z3 y% {/ R. l. ]
赞 收藏 评论0 发布时间:2023-1-10 17:37

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版