Advertisement
Guest User

Untitled

a guest
Sep 25th, 2012
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement