static void prvQueueReceiveTask( void *pvParameters ) { unsigned long ulReceivedValue; for( ;; ) { /* Wait until something arrives in the queue - this task will block indefinitely provided INCLUDE_vTaskSuspend is set to 1 in FreeRTOSConfig.h. */ xQueueReceive( xQueue, &ulReceivedValue, portMAX_DELAY ); /* To get here something must have been received from the queue, but is it the expected value? If it is, toggle the green LED. */ if( ulReceivedValue == 100UL ) { /* NOTE - accessing the LED port should use a critical section because it is accessed from multiple tasks, and the button interrupt - in this trivial case, for simplicity, the critical section is omitted. */ if( ( ulGPIOState & mainTASK_CONTROLLED_LED ) != 0 ) { ulGPIOState &= ~mainTASK_CONTROLLED_LED; } else { ulGPIOState |= mainTASK_CONTROLLED_LED; } MSS_GPIO_set_outputs( ulGPIOState ); } } }
static void prvSetupHardware( void ) { SystemCoreClockUpdate(); /* Disable the Watch Dog Timer */ MSS_WD_disable( ); /* Initialise the GPIO */ MSS_GPIO_init(); /* Set up GPIO for the LEDs. */ MSS_GPIO_config( MSS_GPIO_0 , MSS_GPIO_OUTPUT_MODE ); MSS_GPIO_config( MSS_GPIO_1 , MSS_GPIO_OUTPUT_MODE ); MSS_GPIO_config( MSS_GPIO_2 , MSS_GPIO_OUTPUT_MODE ); MSS_GPIO_config( MSS_GPIO_3 , MSS_GPIO_OUTPUT_MODE ); MSS_GPIO_config( MSS_GPIO_4 , MSS_GPIO_OUTPUT_MODE ); MSS_GPIO_config( MSS_GPIO_5 , MSS_GPIO_OUTPUT_MODE ); MSS_GPIO_config( MSS_GPIO_6 , MSS_GPIO_OUTPUT_MODE ); MSS_GPIO_config( MSS_GPIO_7 , MSS_GPIO_OUTPUT_MODE ); /* All LEDs start off. */ ulGPIOState = 0xffffffffUL; MSS_GPIO_set_outputs( ulGPIOState ); /* Setup the GPIO and the NVIC for the switch used in this simple demo. */ NVIC_SetPriority( GPIO8_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY ); NVIC_EnableIRQ( GPIO8_IRQn ); MSS_GPIO_config( MSS_GPIO_8, MSS_GPIO_INPUT_MODE | MSS_GPIO_IRQ_EDGE_NEGATIVE ); MSS_GPIO_enable_irq( MSS_GPIO_8 ); }
/* The ISR executed when the user button is pushed. */ void GPIO8_IRQHandler( void ) { portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; /* The button was pushed, so ensure the LED is on before resetting the LED timer. The LED timer will turn the LED off if the button is not pushed within 5000ms. */ ulGPIOState &= ~mainTIMER_CONTROLLED_LED; MSS_GPIO_set_outputs( ulGPIOState ); /* This interrupt safe FreeRTOS function can be called from this interrupt because the interrupt priority is below the configMAX_SYSCALL_INTERRUPT_PRIORITY setting in FreeRTOSConfig.h. */ xTimerResetFromISR( xLEDTimer, &xHigherPriorityTaskWoken ); /* Clear the interrupt before leaving. */ MSS_GPIO_clear_irq( MSS_GPIO_8 ); /* If calling xTimerResetFromISR() caused a task (in this case the timer service/daemon task) to unblock, and the unblocked task has a priority higher than or equal to the task that was interrupted, then xHigherPriorityTaskWoken will now be set to pdTRUE, and calling portEND_SWITCHING_ISR() will ensure the unblocked task runs next. */ portEND_SWITCHING_ISR( xHigherPriorityTaskWoken ); }
//sends the step data to the motor void outputStep(uint8_t stepSeq) { uint8_t temp = stepOut[stepSeq]; MSS_GPIO_set_outputs(temp); return; }
//initializes the motor pins to 0 void initMotor(void) { uint32_t gpio_outputs = MSS_GPIO_get_outputs(); gpio_outputs &= ~( MSS_GPIO_0_MASK | MSS_GPIO_1_MASK | MSS_GPIO_2_MASK | MSS_GPIO_3_MASK ); MSS_GPIO_set_outputs( gpio_outputs ); srd.run_state = STOP; }
static void vLEDTimerCallback( TimerHandle_t xTimer ) { /* The timer has expired - so no button pushes have occurred in the last five seconds - turn the LED off. NOTE - accessing the LED port should use a critical section because it is accessed from multiple tasks, and the button interrupt - in this trivial case, for simplicity, the critical section is omitted. */ ulGPIOState |= mainTIMER_CONTROLLED_LED; MSS_GPIO_set_outputs( ulGPIOState ); }
void vParTestInitialise( void ) { long x; /* Initialise the GPIO */ MSS_GPIO_init(); /* Set up GPIO for the LEDs. */ for( x = 0; x < partstMAX_LEDS; x++ ) { MSS_GPIO_config( ( mss_gpio_id_t ) x , MSS_GPIO_OUTPUT_MODE ); } /* All LEDs start off. */ ulGPIOState = 0xffffffffUL; MSS_GPIO_set_outputs( ulGPIOState ); }
void vParTestToggleLED( unsigned portBASE_TYPE uxLED ) { if( uxLED < partstMAX_LEDS ) { /* A critical section is used as the LEDs are also accessed from an interrupt. */ taskENTER_CRITICAL(); { if( ( ulGPIOState & ( 1UL << uxLED ) ) != 0UL ) { ulGPIOState &= ~( 1UL << uxLED ); } else { ulGPIOState |= ( 1UL << uxLED ); } MSS_GPIO_set_outputs( ulGPIOState ); } taskEXIT_CRITICAL(); } }
void vParTestSetLEDFromISR( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue ) { unsigned portBASE_TYPE uxInterruptFlags; uxInterruptFlags = portSET_INTERRUPT_MASK_FROM_ISR(); { if( uxLED < partstMAX_LEDS ) { if( xValue == pdTRUE ) { ulGPIOState &= ~( 1UL << uxLED ); } else { ulGPIOState |= ( 1UL << uxLED ); } MSS_GPIO_set_outputs( ulGPIOState ); } } portCLEAR_INTERRUPT_MASK_FROM_ISR( uxInterruptFlags ); }