Proyectos con FreeRTOS y STM32F4Discovery

Snippets de proyectos con FreeRTOS y la STM32F4Discovery.

Todos los proyectos se van a realizar utilizando OpenSTM32 como IDE y la versión de FreeRTOS que tiene integrada (8.2).

☺ En este proyecto se usa el parametro pvParameter para indicarle a la tarea que LED togglear.
Solo se tiene una tarea, y dos instancias de ella, diferenciándose por el pvParameter a la hora de crear las dos instancias.

Aquí el código fuente (después lo organizare y subiré a github):
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <stdint.h>
#include <stddef.h>

#include "stm32f4xx.h"
#include "FreeRTOS.h"
#include "task.h"

static void GPIOinit(void);

static void vTaskToggleLED(void* pvParameters);

static const uint8_t toogleGreenLED = 1;
static const uint8_t toogleOrangeLED = 2;

int main(void)
{
 GPIOinit();

 // Retorno de xTaskCreate, si la tarea se creo con exito retorna pdPASS.
 BaseType_t toogleGreenReturned, toogleOrangeReturned;

 toogleGreenReturned = xTaskCreate(
    vTaskToggleLED,
    "vTaskToggleGreen",
    configMINIMAL_STACK_SIZE,
    (void*) toogleGreenLED,
    1,
    (xTaskHandle) NULL);

 if(toogleGreenReturned != pdPASS){

 }

 toogleOrangeReturned = xTaskCreate(
    vTaskToggleLED,
    "vTaskToggleOrange",
    configMINIMAL_STACK_SIZE,
    (void*) toogleOrangeLED,
    1,
    (xTaskHandle) NULL);
 if(toogleOrangeReturned != pdPASS){

 }

 vTaskStartScheduler();

 while (1);
}

static void GPIOinit(void){
 __HAL_RCC_GPIOD_CLK_ENABLE();

 GPIO_InitTypeDef LED;

 LED.Mode = GPIO_MODE_OUTPUT_PP;
 LED.Pin = GPIO_PIN_12 | GPIO_PIN_13;
 LED.Speed = GPIO_SPEED_MEDIUM;
 LED.Pull = GPIO_NOPULL;

 HAL_GPIO_Init(GPIOD, &LED);
}

static void vTaskToggleLED(void* pvParameters){

 uint8_t* LEDpos;

 LEDpos = (uint8_t*) pvParameters;

 while (1) {
  if(LEDpos == toogleGreenLED){
   HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_12);
  }else if(LEDpos == toogleOrangeLED){
   HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_13);
  }

  vTaskDelay(250 / portTICK_PERIOD_MS);
 }
}




Comentarios

Entradas más populares de este blog

PSoC Creator Tools

PSoC5LP Usando el SAR ADC y la señal EoS para manejar una LUT