/* * Copyright (c) 2018 Intel Corporation * * SPDX-License-Identifier: Apache-2.0 */ #include #include #define ONESHOT_TIME 1000 #define PERIOD 500 #define NUM_PERIODS 5 void Timer1_Callback(void const *arg); void Timer2_Callback(void const *arg); osTimerDef(Timer1, Timer1_Callback); osTimerDef(Timer2, Timer2_Callback); uint32_t num_oneshots_executed; uint32_t num_periods_executed; void Timer1_Callback(void const *arg) { uint32_t Tmr = *(uint32_t *)arg; num_oneshots_executed++; TC_PRINT("oneshot_callback (Timer %d) = %d\n", Tmr, num_oneshots_executed); } void Timer2_Callback(void const *arg) { uint32_t Tmr = *(uint32_t *)arg; num_periods_executed++; TC_PRINT("periodic_callback (Timer %d) = %d\n", Tmr, num_periods_executed); } ZTEST(cmsis_timer, test_timer) { osTimerId id1; osTimerId id2; uint32_t exec1; uint32_t exec2; osStatus status; uint32_t timerDelay; /* Create one-shot timer */ exec1 = 1U; id1 = osTimerCreate(osTimer(Timer1), osTimerOnce, &exec1); zassert_true(id1 != NULL, "error creating one-shot timer"); /* Stop the timer before start */ status = osTimerStop(id1); zassert_true(status == osErrorResource, "error while stopping non-active timer"); timerDelay = ONESHOT_TIME; status = osTimerStart(id1, timerDelay); zassert_true(status == osOK, "error starting one-shot timer"); /* Timer should fire only once if setup in one shot * mode. Wait for 3 times the one-shot time to see * if it fires more than once. */ osDelay(timerDelay*3U + 100); zassert_true(num_oneshots_executed == 1U, "error setting up one-shot timer"); status = osTimerStop(id1); zassert_true(status == osOK, "error stopping one-shot timer"); status = osTimerDelete(id1); zassert_true(status == osOK, "error deleting one-shot timer"); /* Create periodic timer */ exec2 = 2U; id2 = osTimerCreate(osTimer(Timer2), osTimerPeriodic, &exec2); zassert_true(id2 != NULL, "error creating periodic timer"); timerDelay = PERIOD; status = osTimerStart(id2, timerDelay); zassert_true(status == osOK, "error starting periodic timer"); /* Timer should fire periodically if setup in periodic * mode. Wait for NUM_PERIODS periods to see if it is * fired NUM_PERIODS times. */ osDelay(timerDelay*NUM_PERIODS + 100); zassert_true(num_periods_executed == NUM_PERIODS, "error setting up periodic timer"); /* Delete the timer before stop */ status = osTimerDelete(id2); zassert_true(status == osOK, "error deleting periodic timer"); } ZTEST_SUITE(cmsis_timer, NULL, NULL, NULL, NULL, NULL);