stm32f103rb_hal_blink

Non-blocking, event triggered blink example using HAL library
Index Commits Files Refs README
app/src/task_actuator.c (4021B)
   1 /*
   2  * Copyright (c) 2023 Juan Manuel Cruz <jcruz@fi.uba.ar> <jcruz@frba.utn.edu.ar>.
   3  * Copyright (c) 2026 Martin Javier Klöckner <mklockner@fi.uba.ar>
   4  *
   5  * See file `LICENSE` for full details
   6  */
   7 
   8 #include "main.h"
   9 
  10 #include "logger.h"
  11 #include "dwt.h"
  12 
  13 #include "board.h"
  14 #include "app.h"
  15 #include "task_actuator_attribute.h"
  16 #include "task_actuator_interface.h"
  17 
  18 #define G_TASK_ACT_CNT_INIT     0ul
  19 #define G_TASK_ACT_TICK_CNT_INI 0ul
  20 
  21 #define DEL_LED_XX_PUL          250ul
  22 #define DEL_LED_XX_BLI          500ul
  23 #define DEL_LED_XX_MIN          0ul
  24 
  25 const task_actuator_cfg_t task_actuator_cfg_list[] = {
  26     {ID_LED_A, LED_A_PORT, LED_A_PIN, LED_A_ON, LED_A_OFF}
  27 };
  28 
  29 #define ACTUATOR_CFG_QTY (sizeof(task_actuator_cfg_list)/sizeof(task_actuator_cfg_t))
  30 
  31 task_actuator_dta_t task_actuator_dta_list[] = {
  32     {ST_LED_BLINK}
  33 };
  34 
  35 #define ACTUATOR_DTA_QTY (sizeof(task_actuator_dta_list)/sizeof(task_actuator_dta_t))
  36 
  37 void task_actuator_statechart(void);
  38 
  39 uint32_t g_task_actuator_cnt;
  40 
  41 // this variable is incremented by 1 on every ms by HAL_SysTick
  42 volatile uint32_t g_task_actuator_tick_cnt;
  43 
  44 void task_actuator_init(void *parameters)
  45 {
  46     uint32_t index;
  47     const task_actuator_cfg_t *p_task_actuator_cfg;
  48     task_actuator_dta_t *p_task_actuator_dta;
  49     task_actuator_st_t state;
  50     // task_actuator_ev_t event;
  51     // bool b_event;
  52 
  53     LOGGER_INFO("Initializing `task_actuator`...");
  54 
  55     for (index = 0; ACTUATOR_DTA_QTY > index; index++)
  56     {
  57         p_task_actuator_cfg = &task_actuator_cfg_list[index];
  58         p_task_actuator_dta = &task_actuator_dta_list[index];
  59 
  60         state = ST_LED_BLINK;
  61         p_task_actuator_dta->state = state;
  62 
  63         HAL_GPIO_WritePin(p_task_actuator_cfg->gpio_port, p_task_actuator_cfg->pin, p_task_actuator_cfg->led_off);
  64     }
  65 
  66     LOGGER_INFO("Done initializing `task_actuator`");
  67 }
  68 
  69 void task_actuator_update(void *parameters)
  70 {
  71     bool b_time_update_required = false;
  72 
  73     __asm("CPSID i");
  74     if (G_TASK_ACT_TICK_CNT_INI < g_task_actuator_tick_cnt)
  75     {
  76         g_task_actuator_tick_cnt--;
  77         b_time_update_required = true;
  78     }
  79     __asm("CPSIE i");
  80 
  81     while (b_time_update_required)
  82     {
  83         g_task_actuator_cnt++;
  84 
  85         task_actuator_statechart();
  86 
  87         __asm("CPSID i");
  88         if (G_TASK_ACT_TICK_CNT_INI < g_task_actuator_tick_cnt)
  89         {
  90             g_task_actuator_tick_cnt--;
  91             b_time_update_required = true;
  92         }
  93         else
  94         {
  95             b_time_update_required = false;
  96         }
  97         __asm("CPSIE i");
  98     }
  99 }
 100 
 101 void task_actuator_statechart(void)
 102 {
 103     uint32_t index;
 104     const task_actuator_cfg_t *p_task_actuator_cfg;
 105     task_actuator_dta_t *p_task_actuator_dta;
 106 
 107     for (index = 0; ACTUATOR_DTA_QTY > index; index++)
 108     {
 109         /* Update Task Actuator Configuration & Data Pointer */
 110         p_task_actuator_cfg = &task_actuator_cfg_list[index];
 111         p_task_actuator_dta = &task_actuator_dta_list[index];
 112 
 113         switch (p_task_actuator_dta->state)
 114         {
 115             case ST_LED_BLINK:
 116 
 117                 if (true == p_task_actuator_dta->flag)
 118                 {
 119                     switch (p_task_actuator_dta->event)
 120                     {
 121                         case EV_LED_ON:
 122 
 123                             p_task_actuator_dta->flag = false;
 124                             HAL_GPIO_WritePin(p_task_actuator_cfg->gpio_port,
 125                                     p_task_actuator_cfg->pin,
 126                                     p_task_actuator_cfg->led_on);
 127 
 128                         break;
 129                         case EV_LED_OFF:
 130                             p_task_actuator_dta->flag = false;
 131                             HAL_GPIO_WritePin(p_task_actuator_cfg->gpio_port,
 132                                     p_task_actuator_cfg->pin,
 133                                     p_task_actuator_cfg->led_off);
 134                         break;
 135                         default:
 136                         break;
 137                     }
 138                 }
 139             default:
 140             break;
 141         }
 142     }
 143 }