1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00
RIOT/tests/periph_timer/main.c

135 lines
3.2 KiB
C
Raw Normal View History

2015-09-04 14:38:37 +02:00
/*
* Copyright (C) 2015 Freie Universität Berlin
2015-09-04 14:38:37 +02:00
*
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
* directory for more details.
2015-09-04 14:38:37 +02:00
*/
/**
* @ingroup tests
* @{
*
* @file
* @brief Peripheral timer test application
*
* @author Hauke Petersen <hauke.petersen@fu-berlin.de>
*
* @}
*/
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include "periph/timer.h"
/**
* @brief Make sure, the maximum number of timers is defined
*/
#ifndef TIMER_NUMOF
#error "TIMER_NUMOF not defined!"
#endif
#define MAX_CHANNELS (10U)
#define CHAN_OFFSET (5000U) /* fire every 5ms */
#define COOKIE (100U) /* for checking if arg is passed */
2015-09-04 14:38:37 +02:00
static volatile int fired;
static volatile uint32_t sw_count;
static volatile uint32_t timeouts[MAX_CHANNELS];
static volatile unsigned args[MAX_CHANNELS];
2015-09-04 14:38:37 +02:00
static void cb(void *arg, int chan)
2015-09-04 14:38:37 +02:00
{
timeouts[chan] = sw_count;
args[chan] = (unsigned)arg + chan;
2015-09-04 14:38:37 +02:00
fired++;
}
static int test_timer(unsigned num)
2015-09-04 14:38:37 +02:00
{
int set = 0;
/* reset state */
sw_count = 0;
fired = 0;
for (unsigned i = 0; i < MAX_CHANNELS; i++) {
timeouts[i] = 0;
args[i] = UINT_MAX;
2015-09-04 14:38:37 +02:00
}
/* initialize and halt timer */
if (timer_init(TIMER_DEV(num), TIMER_SPEED, cb, (void *)(COOKIE * num)) < 0) {
printf("TIMER_%u: ERROR on initialization - skipping\n\n", num);
2015-09-04 14:38:37 +02:00
return 0;
}
else {
printf("TIMER_%u: initialization successful\n", num);
2015-09-04 14:38:37 +02:00
}
timer_stop(TIMER_DEV(num));
printf("TIMER_%u: stopped\n", num);
2015-09-04 14:38:37 +02:00
/* set each available channel */
for (unsigned i = 0; i < MAX_CHANNELS; i++) {
unsigned timeout = ((i + 1) * CHAN_OFFSET);
if (timer_set(TIMER_DEV(num), i, timeout) < 0) {
break;
}
else {
++set;
printf("TIMER_%u: set channel %u to %u\n", num, i, timeout);
2015-09-04 14:38:37 +02:00
}
}
if (set == 0) {
printf("TIMER_%u: ERROR setting any channel\n\n", num);
2015-09-04 14:38:37 +02:00
return 0;
}
/* start the timer */
printf("TIMER_%u: starting\n", num);
2015-09-04 14:38:37 +02:00
timer_start(TIMER_DEV(num));
/* wait for all channels to fire */
do {
++sw_count;
} while (fired != set);
/* collect results */
for (int i = 0; i < fired; i++) {
if (args[i] != ((COOKIE * num) + i)) {
printf("TIMER_%u: ERROR callback argument mismatch\n\n", num);
return 0;
}
printf("TIMER_%u: channel %i fired at SW count %8u",
2015-09-04 14:38:37 +02:00
num, i, (unsigned)timeouts[i]);
if (i == 0) {
printf(" - init: %8u\n", (unsigned)timeouts[i]);
}
else {
printf(" - diff: %8u\n", (unsigned)(timeouts[i] - timeouts[i - 1]));
}
}
return 1;
}
int main(void)
{
int res = 0;
puts("\nTest for peripheral TIMERs\n");
printf("Available timers: %i\n", TIMER_NUMOF);
/* test all configured timers */
for (unsigned i = 0; i < TIMER_NUMOF; i++) {
printf("\nTesting TIMER_%u:\n", i);
res += test_timer(i);
}
/* draw conclusion */
if (res == TIMER_NUMOF) {
puts("\nTEST SUCCEEDED");
}
else {
puts("\nTEST FAILED");
}
return 0;
}