diff options
author | Perry Hung <iperry@alum.mit.edu> | 2010-03-30 22:03:00 -0400 |
---|---|---|
committer | Perry Hung <iperry@alum.mit.edu> | 2010-03-30 22:03:00 -0400 |
commit | 2c33d55bae8f9e0e009634072ab05302fc734a65 (patch) | |
tree | 63285f96e795fc423cd5bf573340d12f6c8d5513 /core/time.c | |
parent | 23149e9706ff0a6a338e13804456dff4c655e34b (diff) | |
parent | 1d3861ef93f8423176c6010ab606abdab00a7cbd (diff) | |
download | librambutan-2c33d55bae8f9e0e009634072ab05302fc734a65.tar.gz librambutan-2c33d55bae8f9e0e009634072ab05302fc734a65.zip |
Merge branch 'master' into rcc-dev
Conflicts:
Makefile
Diffstat (limited to 'core/time.c')
-rw-r--r-- | core/time.c | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/core/time.c b/core/time.c new file mode 100644 index 0000000..164d978 --- /dev/null +++ b/core/time.c @@ -0,0 +1,72 @@ +/* ***************************************************************************** + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * Created: 12/18/09 02:41:36 + * Copyright (c) 2009 Perry L. Hung. All rights reserved. + * + * ****************************************************************************/ + +/** + * @file time.c + * + * @brief + */ + +#include "libmaple.h" +#include "systick.h" +#include "time.h" + +#define CYCLES_PER_MICROSECOND 72 +#define FUDGE 42 + +extern volatile uint32_t systick_timer_millis; + +unsigned long millis() { + unsigned long m; + m = systick_timer_millis; + return m; +} + +void delay(unsigned long ms) +{ + unsigned long start = millis(); + + while (millis() - start <= ms) + ; +} + + + +#if 1 +void delayMicroseconds(uint32_t us) { + uint32_t target; + uint32_t last, cur, count; + /* fudge factor hacky hack hack for function overhead */ + target = us * CYCLES_PER_MICROSECOND - FUDGE; + + /* Get current count */ + last = systick_get_count(); + cur = systick_get_count(); + count = last; + while ((count-cur) <= target) { + cur = systick_get_count(); + + /* check for overflow */ + if (cur > last) { + count += MAPLE_RELOAD_VAL; + } + last = cur; + } +} +#endif |