View difference between Paste ID: JLHmR8j7 and h55MNDPc
SHOW: | | - or go back to the newest paste.
1
/* Includes */
2
#include "stm32f4xx.h"
3
#include "stm32f4_discovery.h"
4
#include "FreeRTOS.h"
5
#include "task.h"
6
#include "semphr.h"
7
8
xSemaphoreHandle xBinarySemaphore;
9
xTaskHandle xBlinkLed;
10
xTaskHandle xBlinkLed1;
11
12
static void vBlinkLed1(void *pvParameters);
13
static void vEXTI0_IRQHandler(void *pvParameters);
14
static void vBlinkLed( void *pvParameters );
15
16
int main(void)
17
{
18
19
	  /* Initialize LEDs */
20
	  STM_EVAL_LEDInit(LED3);
21
	  STM_EVAL_LEDInit(LED4);
22
	  STM_EVAL_LEDInit(LED5);
23
	  STM_EVAL_LEDInit(LED6);
24
25
      STM_EVAL_PBInit(BUTTON_USER, BUTTON_MODE_EXTI);
26
27
      vSemaphoreCreateBinary( xBinarySemaphore );
28
      xSemaphoreTake( xBinarySemaphore, portMAX_DELAY);
29
30
      if( xBinarySemaphore != NULL )
31
      {
32
		  xTaskCreate( vBlinkLed, ( signed char * ) "vBlinkLed", configMINIMAL_STACK_SIZE, NULL, 4, &xBlinkLed );
33
		  xTaskCreate( vEXTI0_IRQHandler, ( signed char * ) "vEXTI0_IRQHandler", configMINIMAL_STACK_SIZE, NULL, 4, NULL );
34
		  vTaskStartScheduler();
35
      }
36
  return 0;
37
}
38
39
void vBlinkLed1(void *pvParameters) {
40
		unsigned short i = 0;
41
		struct smb380_acc_t acc;
42
		portTickType xLastWakeTime;
43
		xLastWakeTime = xTaskGetTickCount();
44
        for (;;) {
45
        		STM_EVAL_LEDOn(LED3);
46
				vTaskDelayUntil( &xLastWakeTime, ( 100 / portTICK_RATE_MS ) );
47
                STM_EVAL_LEDOff(LED3);
48
        }
49
}
50
51
void vBlinkLed( void *pvParameters )
52
{
53
	for(;;)
54
	{
55
		STM_EVAL_LEDToggle(LED3);
56
		STM_EVAL_LEDToggle(LED4);
57
		STM_EVAL_LEDToggle(LED5);
58
		STM_EVAL_LEDToggle(LED6);
59
		vTaskDelay(1000 / portTICK_RATE_MS);
60
	}
61
}
62
63
void vEXTI0_IRQHandler( void *pvParameters )
64
{
65
	static int cr = 0;
66
	for ( ;; )
67
	{
68
		xSemaphoreTake( xBinarySemaphore, portMAX_DELAY );
69
		{
70
			STM_EVAL_LEDOff(LED3);
71
			STM_EVAL_LEDOff(LED4);
72
			STM_EVAL_LEDOff(LED5);
73
			STM_EVAL_LEDOff(LED6);
74
			if (cr == 0)
75
			{
76
				vTaskDelete(xBlinkLed);
77
				xTaskCreate( vBlinkLed1, ( signed char * ) "vBlinkLed1", configMINIMAL_STACK_SIZE, NULL, 4, &xBlinkLed1);
78
				cr = 1;
79
			}
80
			else
81
			{
82
				xTaskCreate( vBlinkLed, ( signed char * ) "vBlinkLed", configMINIMAL_STACK_SIZE, NULL, 4, &xBlinkLed );
83
				vTaskDelete(xBlinkLed1);
84
				cr = 0;
85
			}
86
		}
87
	}
88
}
89
90
void EXTI0_IRQHandler(void)
91
{
92
	  if(EXTI_GetITStatus(EXTI_Line0) != RESET)
93
	  {
94
		  static portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
95
		  EXTI_ClearITPendingBit(EXTI_Line0);
96
		  xHigherPriorityTaskWoken = pdFALSE;
97
		  xSemaphoreGiveFromISR( xBinarySemaphore, &xHigherPriorityTaskWoken );
98
		  portEND_SWITCHING_ISR(xHigherPriorityTaskWoken);
99
	  }
100
}