STM32F407 mit FreeRTOS startet keinen Task

#3878974
Lesenswert?

Hallo,

ich habe einen STM32F407 und versuche gerade FreeRTOS ans laufen zu 
bringen. Gestern habe ich das mit einem STM32F051 bereits hinbekommen.

Dasselbe Programm wie gestern, die Pins umkonfiguriert und es läuft 
nicht.

Der Debugger bleibt wie gewohnt bei vTaskStartScheduler() stehen. 
Allerdings habe ich in meinem Task einen Breakpoint, wo eigentlich 
Leuchtdioden Ein und Ausgeschaltet werden sollten.
Dort kommt der Debugger aber niemals rein.

Schalte ich die LEDs in Main ein, so geht es. Also die Portdefinitionen 
sind schonmal richtig.

So sieht der Code aus:
#include "stm32f4xx.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_gpio.h"
/* FreeRTOS includes. */
#include "FreeRTOS.h"
#include "task.h"

#define orange_off GPIO_ResetBits(GPIOD, GPIO_Pin_13);
#define green_off GPIO_ResetBits(GPIOD, GPIO_Pin_12);
#define red_off GPIO_ResetBits(GPIOD, GPIO_Pin_14);
#define blue_off GPIO_ResetBits(GPIOD, GPIO_Pin_15);

#define orange_on GPIO_SetBits(GPIOD, GPIO_Pin_13);
#define green_on GPIO_SetBits(GPIOD, GPIO_Pin_12);
#define red_on GPIO_SetBits(GPIOD, GPIO_Pin_14);
#define blue_on GPIO_SetBits(GPIOD, GPIO_Pin_15);


unsigned char toggle = 0;

void BlinkyTask( void *pvParameters )
{
  while(1)
  {
    toggle++;
    toggle%=2;
    if (toggle)
    {
      red_on;
      blue_on;
    green_on;
      orange_on;
    }
    else
    {
      red_off;
      blue_off;
    green_off;
      orange_off;
  }
    // Task für 500ms auf "Blocked"
    vTaskDelay(500/portTICK_RATE_MS);
  }
  vTaskDelete( NULL ); // clean exit
}

int main(void)
{
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

  //Initialize struct
  GPIO_InitTypeDef GPIO_InitDef;

  //Pins 3, 4, 5 and 6
  GPIO_InitDef.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | 
GPIO_Pin_15;
  //Mode output
  GPIO_InitDef.GPIO_Mode = GPIO_Mode_OUT;
  //Output type push-pull
  GPIO_InitDef.GPIO_OType = GPIO_OType_PP;
  //Without pull resistors
  GPIO_InitDef.GPIO_PuPd = GPIO_PuPd_NOPULL;
  //50MHz pin speed
  GPIO_InitDef.GPIO_Speed = GPIO_Speed_50MHz;

  //Initialize pins on GPIOD port
  GPIO_Init(GPIOD, &GPIO_InitDef);

  xTaskCreate(BlinkyTask, "Blinky", configMINIMAL_STACK_SIZE, NULL, 1, 
NULL);

  vTaskStartScheduler();

    while(1)
    {
    }
}
#3897306
Lesenswert?

Das Programm läuft jetzt seit geraumer Zeit. Habe irgendwie vergessen 
das hier rein zu schreiben.

Ich weiß leider nicht mehr woran es lag. Ich meine ich habe da was in 
der FreeRTOSConfig.h eingestellt. Leider bin ich mir da aber nicht 
sicher. Entweder das oder ein ganz dummer Fehler. Folgender Code 
funktioniert jetzt auf jeden Fall:
1
#include "stm32f4xx.h"
2
#include "stm32f4xx_rcc.h"
3
#include "stm32f4xx_gpio.h"
4
/* FreeRTOS includes. */
5
#include "FreeRTOS.h"
6
#include "task.h"
7
#include "queue.h"
8
#include "timers.h"
9

10
#define orange_off GPIO_ResetBits(GPIOD, GPIO_Pin_13);
11
#define green_off GPIO_ResetBits(GPIOD, GPIO_Pin_12);
12
#define red_off GPIO_ResetBits(GPIOD, GPIO_Pin_14);
13
#define blue_off GPIO_ResetBits(GPIOD, GPIO_Pin_15);
14

15
#define orange_on GPIO_SetBits(GPIOD, GPIO_Pin_13);
16
#define green_on GPIO_SetBits(GPIOD, GPIO_Pin_12);
17
#define red_on GPIO_SetBits(GPIOD, GPIO_Pin_14);
18
#define blue_on GPIO_SetBits(GPIOD, GPIO_Pin_15);
19

20

21
unsigned char toggleRed = 0;
22
unsigned char toggleBlue = 0;
23
unsigned char toggleGreen = 0;
24
unsigned char toggleOrange = 0;
25

26
xTaskHandle hdl_red;
27
xTaskHandle hdl_blue;
28
xTaskHandle hdl_green;
29
xTaskHandle hdl_orange;
30
QueueHandle_t myQueue;
31
TimerHandle_t hdl_timer;
32

33
void BlinkyRed( void *pvParameters )
34
{
35
  while(1)
36
  {
37
    toggleRed++;
38
    toggleRed%=2;
39
    if (toggleRed)
40
    {
41
      red_on;
42
    }
43
    else
44
    {
45
      red_off;
46
  }
47
    // Task für 500ms auf "Blocked"
48
    vTaskDelay(500/portTICK_RATE_MS);
49
  }
50
  vTaskDelete( NULL ); // clean exit
51
}
52

53
void BlinkyBlue( void *pvParameters )
54
{
55
  while(1)
56
  {
57
    toggleBlue++;
58
    toggleBlue%=2;
59
    if (toggleBlue)
60
    {
61
      blue_on;
62
    }
63
    else
64
    {
65
      blue_off;
66
  }
67
    // Task für 500ms auf "Blocked"
68
    vTaskDelay(20/portTICK_RATE_MS);
69
  }
70
  vTaskDelete( NULL ); // clean exit
71
}
72

73
void BlinkyGreen( void *pvParameters )
74
{
75
  while(1)
76
  {
77
    toggleGreen++;
78
    toggleGreen%=2;
79
    if (toggleGreen)
80
    {
81
    green_on;
82
    red_off;
83
    blue_off;
84
    orange_off;
85
    vTaskSuspendAll();
86
    int i;
87
    for (i = 0; i < 5000000; i++);
88
    green_off;
89
    xTaskResumeAll();
90
    }
91
    // Task für 500ms auf "Blocked"
92
    vTaskDelay(5000/portTICK_RATE_MS);
93
  }
94
  vTaskDelete( NULL ); // clean exit
95
}
96

97
void BlinkyOrange( void *pvParameters )
98
{
99
  while(1)
100
  {
101
    toggleOrange++;
102
    toggleOrange%=2;
103
    if (toggleOrange)
104
    {
105
      orange_on;
106
      if (hdl_blue )
107
      vTaskResume(hdl_blue);
108
    }
109
    else
110
    {
111
      orange_off;
112
      blue_off;
113
      vTaskSuspend(hdl_blue);
114
  }
115
    // Task für 500ms auf "Blocked"
116
    vTaskDelay(250/portTICK_RATE_MS);
117
  }
118
  vTaskDelete( NULL ); // clean exit
119
}
120

121
// Task to create a queue and post a value.
122
void sender( void *pvParameters )
123
{
124
  myQueue = xQueueCreate( 5, 15 );
125

126
  while(1)
127
  {
128
    unsigned char myMessage[15] = "Hello World";
129
    xQueueSend( myQueue, ( void * ) &myMessage, 1000 );
130
      vTaskDelay(5000/portTICK_RATE_MS);
131
  }
132
}
133

134
// Task to receive from the queue.
135
void receiver( void *pvParameters )
136
{
137
  while(1)
138
  {
139
    unsigned char gotMessage[15];
140

141
    if( xQueueReceive( myQueue, &gotMessage, 10000 ) )
142
    {
143
      green_on;
144
      red_on;
145
      blue_on;
146
      orange_on;
147
      vTaskSuspendAll();
148
      int i;
149
      for (i = 0; i < 5000000; i++);
150
      green_off;
151
      xTaskResumeAll();
152
    }
153
  }
154

155
}
156

157
void timer_Function(TimerHandle_t t_handle)
158
{
159
  // int timerIndex = (int) pvTimerGetTimerID(t_handle);
160
  // Timer mit Index timerIndex wurde aufgerufen
161
  xTimerStop(t_handle, 0);
162
}
163

164
int main(void)
165
{
166
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
167

168
  //Initialize struct
169
  GPIO_InitTypeDef GPIO_InitDef;
170

171
  //Pins 3, 4, 5 and 6
172
  GPIO_InitDef.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
173
  //Mode output
174
  GPIO_InitDef.GPIO_Mode = GPIO_Mode_OUT;
175
  //Output type push-pull
176
  GPIO_InitDef.GPIO_OType = GPIO_OType_PP;
177
  //Without pull resistors
178
  GPIO_InitDef.GPIO_PuPd = GPIO_PuPd_NOPULL;
179
  //50MHz pin speed
180
  GPIO_InitDef.GPIO_Speed = GPIO_Speed_50MHz;
181

182
  //Initialize pins on GPIOD port
183
  GPIO_Init(GPIOD, &GPIO_InitDef);
184

185
  xTaskCreate(BlinkyRed, "BlinkyRed", configMINIMAL_STACK_SIZE, NULL, 1, &hdl_red);
186
  xTaskCreate(BlinkyBlue, "BlinkyBlue", configMINIMAL_STACK_SIZE, NULL, 1, &hdl_blue);
187
  xTaskCreate(BlinkyGreen, "BlinkyGreen", configMINIMAL_STACK_SIZE, NULL, 1, &hdl_green);
188
  xTaskCreate(BlinkyOrange, "BlinkyOrange", configMINIMAL_STACK_SIZE, NULL, 1, &hdl_orange);
189
  xTaskCreate(sender, "send", configMINIMAL_STACK_SIZE, NULL, 1, NULL);
190
  xTaskCreate(receiver, "receive", configMINIMAL_STACK_SIZE, NULL, 1, NULL);
191

192
  hdl_timer = xTimerCreate("Name", 1000, pdTRUE, ( void * ) 37, timer_Function);
193
  xTimerStart(hdl_timer, 0);
194

195
  vTaskStartScheduler();
196

197
    while(1)
198
    {
199
    }
200
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren