BA / SerialCom

Fork of OmniWheels by Gustav Atmel

Committer:
gustavatmel
Date:
Tue May 01 15:47:08 2018 +0000
Revision:
1:9c5af431a1f1
sdf

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gustavatmel 1:9c5af431a1f1 1 /*******************************************************************************
gustavatmel 1:9c5af431a1f1 2 * Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
gustavatmel 1:9c5af431a1f1 3 *
gustavatmel 1:9c5af431a1f1 4 * Permission is hereby granted, free of charge, to any person obtaining a
gustavatmel 1:9c5af431a1f1 5 * copy of this software and associated documentation files (the "Software"),
gustavatmel 1:9c5af431a1f1 6 * to deal in the Software without restriction, including without limitation
gustavatmel 1:9c5af431a1f1 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
gustavatmel 1:9c5af431a1f1 8 * and/or sell copies of the Software, and to permit persons to whom the
gustavatmel 1:9c5af431a1f1 9 * Software is furnished to do so, subject to the following conditions:
gustavatmel 1:9c5af431a1f1 10 *
gustavatmel 1:9c5af431a1f1 11 * The above copyright notice and this permission notice shall be included
gustavatmel 1:9c5af431a1f1 12 * in all copies or substantial portions of the Software.
gustavatmel 1:9c5af431a1f1 13 *
gustavatmel 1:9c5af431a1f1 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
gustavatmel 1:9c5af431a1f1 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
gustavatmel 1:9c5af431a1f1 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
gustavatmel 1:9c5af431a1f1 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
gustavatmel 1:9c5af431a1f1 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
gustavatmel 1:9c5af431a1f1 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
gustavatmel 1:9c5af431a1f1 20 * OTHER DEALINGS IN THE SOFTWARE.
gustavatmel 1:9c5af431a1f1 21 *
gustavatmel 1:9c5af431a1f1 22 * Except as contained in this notice, the name of Maxim Integrated
gustavatmel 1:9c5af431a1f1 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
gustavatmel 1:9c5af431a1f1 24 * Products, Inc. Branding Policy.
gustavatmel 1:9c5af431a1f1 25 *
gustavatmel 1:9c5af431a1f1 26 * The mere transfer of this software does not imply any licenses
gustavatmel 1:9c5af431a1f1 27 * of trade secrets, proprietary technology, copyrights, patents,
gustavatmel 1:9c5af431a1f1 28 * trademarks, maskwork rights, or any other form of intellectual
gustavatmel 1:9c5af431a1f1 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
gustavatmel 1:9c5af431a1f1 30 * ownership rights.
gustavatmel 1:9c5af431a1f1 31 *
gustavatmel 1:9c5af431a1f1 32 * $Date: 2016-03-11 11:46:37 -0600 (Fri, 11 Mar 2016) $
gustavatmel 1:9c5af431a1f1 33 * $Revision: 21839 $
gustavatmel 1:9c5af431a1f1 34 *
gustavatmel 1:9c5af431a1f1 35 ******************************************************************************/
gustavatmel 1:9c5af431a1f1 36
gustavatmel 1:9c5af431a1f1 37 #include <stddef.h>
gustavatmel 1:9c5af431a1f1 38 #include "mxc_assert.h"
gustavatmel 1:9c5af431a1f1 39 #include "tmr.h"
gustavatmel 1:9c5af431a1f1 40
gustavatmel 1:9c5af431a1f1 41 static tmr_prescale_t prescaler[MXC_CFG_TMR_INSTANCES];
gustavatmel 1:9c5af431a1f1 42
gustavatmel 1:9c5af431a1f1 43 /******************************************************************************/
gustavatmel 1:9c5af431a1f1 44 int TMR_Init(mxc_tmr_regs_t *tmr, tmr_prescale_t prescale, const sys_cfg_tmr_t *sysCfg)
gustavatmel 1:9c5af431a1f1 45 {
gustavatmel 1:9c5af431a1f1 46 int err;
gustavatmel 1:9c5af431a1f1 47 int tmrNum;
gustavatmel 1:9c5af431a1f1 48
gustavatmel 1:9c5af431a1f1 49 //get the timer number
gustavatmel 1:9c5af431a1f1 50 tmrNum = MXC_TMR_GET_IDX(tmr);
gustavatmel 1:9c5af431a1f1 51
gustavatmel 1:9c5af431a1f1 52 //check for valid pointer
gustavatmel 1:9c5af431a1f1 53 MXC_ASSERT(tmrNum >= 0);
gustavatmel 1:9c5af431a1f1 54
gustavatmel 1:9c5af431a1f1 55 //steup system GPIO config
gustavatmel 1:9c5af431a1f1 56 if((err = SYS_TMR_Init(tmr, sysCfg)) != E_NO_ERROR)
gustavatmel 1:9c5af431a1f1 57 return err;
gustavatmel 1:9c5af431a1f1 58
gustavatmel 1:9c5af431a1f1 59 //save the prescale value for this timer
gustavatmel 1:9c5af431a1f1 60 prescaler[tmrNum] = prescale;
gustavatmel 1:9c5af431a1f1 61
gustavatmel 1:9c5af431a1f1 62 //Disable timer and clear settings
gustavatmel 1:9c5af431a1f1 63 tmr->ctrl = 0;
gustavatmel 1:9c5af431a1f1 64
gustavatmel 1:9c5af431a1f1 65 //reset all counts to 0
gustavatmel 1:9c5af431a1f1 66 tmr->count32 = 0;
gustavatmel 1:9c5af431a1f1 67 tmr->count16_0 = 0;
gustavatmel 1:9c5af431a1f1 68 tmr->count16_1 = 0;
gustavatmel 1:9c5af431a1f1 69
gustavatmel 1:9c5af431a1f1 70 // Clear interrupt flag
gustavatmel 1:9c5af431a1f1 71 tmr->intfl = MXC_F_TMR_INTFL_TIMER0 | MXC_F_TMR_INTFL_TIMER1;
gustavatmel 1:9c5af431a1f1 72
gustavatmel 1:9c5af431a1f1 73 return E_NO_ERROR;
gustavatmel 1:9c5af431a1f1 74 }
gustavatmel 1:9c5af431a1f1 75
gustavatmel 1:9c5af431a1f1 76 /******************************************************************************/
gustavatmel 1:9c5af431a1f1 77 void TMR32_Config(mxc_tmr_regs_t *tmr, const tmr32_cfg_t *config)
gustavatmel 1:9c5af431a1f1 78 {
gustavatmel 1:9c5af431a1f1 79 //stop timer
gustavatmel 1:9c5af431a1f1 80 TMR32_Stop(tmr);
gustavatmel 1:9c5af431a1f1 81
gustavatmel 1:9c5af431a1f1 82 //setup timer configuration register
gustavatmel 1:9c5af431a1f1 83 //clear tmr2x16 (32bit mode), mode and polarity bits
gustavatmel 1:9c5af431a1f1 84 tmr->ctrl &= ~(MXC_F_TMR_CTRL_TMR2X16 | MXC_F_TMR_CTRL_MODE |
gustavatmel 1:9c5af431a1f1 85 MXC_F_TMR_CTRL_POLARITY);
gustavatmel 1:9c5af431a1f1 86
gustavatmel 1:9c5af431a1f1 87 //set mode and polarity
gustavatmel 1:9c5af431a1f1 88 tmr->ctrl |= ((config->mode << MXC_F_TMR_CTRL_MODE_POS) |
gustavatmel 1:9c5af431a1f1 89 (config->polarity << MXC_F_TMR_CTRL_POLARITY_POS));
gustavatmel 1:9c5af431a1f1 90
gustavatmel 1:9c5af431a1f1 91 //setup timer Tick registers
gustavatmel 1:9c5af431a1f1 92 tmr->term_cnt32 = config->compareCount;
gustavatmel 1:9c5af431a1f1 93
gustavatmel 1:9c5af431a1f1 94 return;
gustavatmel 1:9c5af431a1f1 95 }
gustavatmel 1:9c5af431a1f1 96
gustavatmel 1:9c5af431a1f1 97 /******************************************************************************/
gustavatmel 1:9c5af431a1f1 98 void TMR32_PWMConfig(mxc_tmr_regs_t *tmr, const tmr32_cfg_pwm_t *config)
gustavatmel 1:9c5af431a1f1 99 {
gustavatmel 1:9c5af431a1f1 100 //stop timer
gustavatmel 1:9c5af431a1f1 101 TMR32_Stop(tmr);
gustavatmel 1:9c5af431a1f1 102
gustavatmel 1:9c5af431a1f1 103 //setup timer configuration register
gustavatmel 1:9c5af431a1f1 104 //clear tmr2x16 (32bit mode), mode and polarity bits
gustavatmel 1:9c5af431a1f1 105 tmr->ctrl &= ~(MXC_F_TMR_CTRL_TMR2X16 | MXC_F_TMR_CTRL_MODE |
gustavatmel 1:9c5af431a1f1 106 MXC_F_TMR_CTRL_POLARITY);
gustavatmel 1:9c5af431a1f1 107
gustavatmel 1:9c5af431a1f1 108 //set mode and polarity
gustavatmel 1:9c5af431a1f1 109 tmr->ctrl |= ((TMR32_MODE_PWM << MXC_F_TMR_CTRL_MODE_POS) |
gustavatmel 1:9c5af431a1f1 110 (config->polarity << MXC_F_TMR_CTRL_POLARITY_POS));
gustavatmel 1:9c5af431a1f1 111
gustavatmel 1:9c5af431a1f1 112 tmr->pwm_cap32 = config->dutyCount;
gustavatmel 1:9c5af431a1f1 113
gustavatmel 1:9c5af431a1f1 114 //setup timer Tick registers
gustavatmel 1:9c5af431a1f1 115 tmr->count32 = 0;
gustavatmel 1:9c5af431a1f1 116 tmr->term_cnt32 = config->periodCount;
gustavatmel 1:9c5af431a1f1 117
gustavatmel 1:9c5af431a1f1 118 return;
gustavatmel 1:9c5af431a1f1 119 }
gustavatmel 1:9c5af431a1f1 120
gustavatmel 1:9c5af431a1f1 121 /******************************************************************************/
gustavatmel 1:9c5af431a1f1 122 void TMR16_Config(mxc_tmr_regs_t *tmr, uint8_t index, const tmr16_cfg_t *config)
gustavatmel 1:9c5af431a1f1 123 {
gustavatmel 1:9c5af431a1f1 124 //stop timer
gustavatmel 1:9c5af431a1f1 125 TMR16_Stop(tmr, index);
gustavatmel 1:9c5af431a1f1 126
gustavatmel 1:9c5af431a1f1 127 if(index > 0) { //configure timer 16_1
gustavatmel 1:9c5af431a1f1 128
gustavatmel 1:9c5af431a1f1 129 //setup timer configuration register
gustavatmel 1:9c5af431a1f1 130 tmr->ctrl |= MXC_F_TMR_CTRL_TMR2X16; //1 = 16bit mode
gustavatmel 1:9c5af431a1f1 131
gustavatmel 1:9c5af431a1f1 132 //set mode
gustavatmel 1:9c5af431a1f1 133 if(config->mode)
gustavatmel 1:9c5af431a1f1 134 tmr->ctrl |= MXC_F_TMR_CTRL_MODE_16_1;
gustavatmel 1:9c5af431a1f1 135 else
gustavatmel 1:9c5af431a1f1 136 tmr->ctrl &= ~MXC_F_TMR_CTRL_MODE_16_1;
gustavatmel 1:9c5af431a1f1 137
gustavatmel 1:9c5af431a1f1 138 //setup timer Ticks registers
gustavatmel 1:9c5af431a1f1 139 tmr->term_cnt16_1 = config->compareCount;
gustavatmel 1:9c5af431a1f1 140 } else { //configure timer 16_0
gustavatmel 1:9c5af431a1f1 141
gustavatmel 1:9c5af431a1f1 142 //setup timer configuration register
gustavatmel 1:9c5af431a1f1 143 tmr->ctrl |= MXC_F_TMR_CTRL_TMR2X16; //1 = 16bit mode
gustavatmel 1:9c5af431a1f1 144
gustavatmel 1:9c5af431a1f1 145 //set mode
gustavatmel 1:9c5af431a1f1 146 if(config->mode)
gustavatmel 1:9c5af431a1f1 147 tmr->ctrl |= MXC_F_TMR_CTRL_MODE_16_0;
gustavatmel 1:9c5af431a1f1 148 else
gustavatmel 1:9c5af431a1f1 149 tmr->ctrl &= ~MXC_F_TMR_CTRL_MODE_16_0;
gustavatmel 1:9c5af431a1f1 150
gustavatmel 1:9c5af431a1f1 151 //setup timer Ticks registers
gustavatmel 1:9c5af431a1f1 152 tmr->term_cnt16_0 = config->compareCount;
gustavatmel 1:9c5af431a1f1 153 }
gustavatmel 1:9c5af431a1f1 154
gustavatmel 1:9c5af431a1f1 155 return;
gustavatmel 1:9c5af431a1f1 156 }
gustavatmel 1:9c5af431a1f1 157
gustavatmel 1:9c5af431a1f1 158 /******************************************************************************/
gustavatmel 1:9c5af431a1f1 159 void TMR32_Start(mxc_tmr_regs_t *tmr)
gustavatmel 1:9c5af431a1f1 160 {
gustavatmel 1:9c5af431a1f1 161 int tmrNum;
gustavatmel 1:9c5af431a1f1 162 uint32_t ctrl;
gustavatmel 1:9c5af431a1f1 163
gustavatmel 1:9c5af431a1f1 164 //get the timer number
gustavatmel 1:9c5af431a1f1 165 tmrNum = MXC_TMR_GET_IDX(tmr);
gustavatmel 1:9c5af431a1f1 166
gustavatmel 1:9c5af431a1f1 167 //prescaler gets reset to 0 when timer is disabled
gustavatmel 1:9c5af431a1f1 168 //set the prescale to the saved value for this timer
gustavatmel 1:9c5af431a1f1 169 ctrl = tmr->ctrl;
gustavatmel 1:9c5af431a1f1 170 ctrl &= ~(MXC_F_TMR_CTRL_PRESCALE); //clear prescaler bits
gustavatmel 1:9c5af431a1f1 171 ctrl |= prescaler[tmrNum] << MXC_F_TMR_CTRL_PRESCALE_POS; //set prescaler
gustavatmel 1:9c5af431a1f1 172 ctrl |= MXC_F_TMR_CTRL_ENABLE0; //set enable to start the timer
gustavatmel 1:9c5af431a1f1 173
gustavatmel 1:9c5af431a1f1 174 tmr->ctrl = ctrl;
gustavatmel 1:9c5af431a1f1 175
gustavatmel 1:9c5af431a1f1 176 return;
gustavatmel 1:9c5af431a1f1 177 }
gustavatmel 1:9c5af431a1f1 178
gustavatmel 1:9c5af431a1f1 179 /******************************************************************************/
gustavatmel 1:9c5af431a1f1 180 void TMR16_Start(mxc_tmr_regs_t *tmr, uint8_t index)
gustavatmel 1:9c5af431a1f1 181 {
gustavatmel 1:9c5af431a1f1 182 int tmrNum;
gustavatmel 1:9c5af431a1f1 183 uint32_t ctrl;
gustavatmel 1:9c5af431a1f1 184
gustavatmel 1:9c5af431a1f1 185 //get the timer number
gustavatmel 1:9c5af431a1f1 186 tmrNum = MXC_TMR_GET_IDX(tmr);
gustavatmel 1:9c5af431a1f1 187
gustavatmel 1:9c5af431a1f1 188 ctrl = tmr->ctrl;
gustavatmel 1:9c5af431a1f1 189
gustavatmel 1:9c5af431a1f1 190 //prescaler gets reset to 0 when both 16 bit timers are disabled
gustavatmel 1:9c5af431a1f1 191 //set the prescale to the saved value for this timer if is is not already set
gustavatmel 1:9c5af431a1f1 192 if((ctrl & MXC_F_TMR_CTRL_PRESCALE) != ((uint32_t)prescaler[tmrNum] << MXC_F_TMR_CTRL_PRESCALE_POS)) {
gustavatmel 1:9c5af431a1f1 193 ctrl &= ~(MXC_F_TMR_CTRL_PRESCALE); //clear prescaler bits
gustavatmel 1:9c5af431a1f1 194 ctrl |= prescaler[tmrNum] << MXC_F_TMR_CTRL_PRESCALE_POS; //set prescaler
gustavatmel 1:9c5af431a1f1 195 }
gustavatmel 1:9c5af431a1f1 196
gustavatmel 1:9c5af431a1f1 197 if(index > 0)
gustavatmel 1:9c5af431a1f1 198 ctrl |= MXC_F_TMR_CTRL_ENABLE1; //start timer 16_1
gustavatmel 1:9c5af431a1f1 199 else
gustavatmel 1:9c5af431a1f1 200 ctrl |= MXC_F_TMR_CTRL_ENABLE0; //start timer 16_0
gustavatmel 1:9c5af431a1f1 201
gustavatmel 1:9c5af431a1f1 202 tmr->ctrl = ctrl;
gustavatmel 1:9c5af431a1f1 203
gustavatmel 1:9c5af431a1f1 204 return;
gustavatmel 1:9c5af431a1f1 205 }
gustavatmel 1:9c5af431a1f1 206
gustavatmel 1:9c5af431a1f1 207 /******************************************************************************/
gustavatmel 1:9c5af431a1f1 208 uint32_t TMR_GetPrescaler(mxc_tmr_regs_t *tmr)
gustavatmel 1:9c5af431a1f1 209 {
gustavatmel 1:9c5af431a1f1 210 int tmrNum;
gustavatmel 1:9c5af431a1f1 211
gustavatmel 1:9c5af431a1f1 212 //get the timer number
gustavatmel 1:9c5af431a1f1 213 tmrNum = MXC_TMR_GET_IDX(tmr);
gustavatmel 1:9c5af431a1f1 214
gustavatmel 1:9c5af431a1f1 215 return ((uint32_t)prescaler[tmrNum]);
gustavatmel 1:9c5af431a1f1 216 }
gustavatmel 1:9c5af431a1f1 217
gustavatmel 1:9c5af431a1f1 218
gustavatmel 1:9c5af431a1f1 219 /******************************************************************************/
gustavatmel 1:9c5af431a1f1 220 int TMR32_GetPWMTicks(mxc_tmr_regs_t *tmr, uint8_t dutyPercent, uint32_t freq, uint32_t *dutyTicks, uint32_t *periodTicks)
gustavatmel 1:9c5af431a1f1 221 {
gustavatmel 1:9c5af431a1f1 222 uint32_t timerClock;
gustavatmel 1:9c5af431a1f1 223 uint32_t prescale;
gustavatmel 1:9c5af431a1f1 224 uint64_t ticks;
gustavatmel 1:9c5af431a1f1 225
gustavatmel 1:9c5af431a1f1 226 if(dutyPercent > 100)
gustavatmel 1:9c5af431a1f1 227 return E_BAD_PARAM;
gustavatmel 1:9c5af431a1f1 228
gustavatmel 1:9c5af431a1f1 229 if(freq == 0)
gustavatmel 1:9c5af431a1f1 230 return E_BAD_PARAM;
gustavatmel 1:9c5af431a1f1 231
gustavatmel 1:9c5af431a1f1 232 timerClock = SYS_TMR_GetFreq(tmr);
gustavatmel 1:9c5af431a1f1 233 prescale = TMR_GetPrescaler(tmr);
gustavatmel 1:9c5af431a1f1 234
gustavatmel 1:9c5af431a1f1 235 if(timerClock == 0 || prescale > TMR_PRESCALE_DIV_2_12)
gustavatmel 1:9c5af431a1f1 236 return E_UNINITIALIZED;
gustavatmel 1:9c5af431a1f1 237
gustavatmel 1:9c5af431a1f1 238 ticks = timerClock / (1 << (prescale & 0xF)) / freq;
gustavatmel 1:9c5af431a1f1 239
gustavatmel 1:9c5af431a1f1 240 //make sure ticks is within a 32 bit value
gustavatmel 1:9c5af431a1f1 241 if (!(ticks & 0xffffffff00000000) && (ticks & 0xffffffff)) {
gustavatmel 1:9c5af431a1f1 242 *periodTicks = ticks;
gustavatmel 1:9c5af431a1f1 243
gustavatmel 1:9c5af431a1f1 244 *dutyTicks = ((uint64_t)*periodTicks * dutyPercent) / 100;
gustavatmel 1:9c5af431a1f1 245
gustavatmel 1:9c5af431a1f1 246 return E_NO_ERROR;
gustavatmel 1:9c5af431a1f1 247 }
gustavatmel 1:9c5af431a1f1 248
gustavatmel 1:9c5af431a1f1 249 return E_INVALID;
gustavatmel 1:9c5af431a1f1 250 }
gustavatmel 1:9c5af431a1f1 251
gustavatmel 1:9c5af431a1f1 252 /******************************************************************************/
gustavatmel 1:9c5af431a1f1 253 int TMR32_TimeToTicks(mxc_tmr_regs_t *tmr, uint32_t time, tmr_unit_t units, uint32_t *ticks)
gustavatmel 1:9c5af431a1f1 254 {
gustavatmel 1:9c5af431a1f1 255 uint32_t unit_div0, unit_div1;
gustavatmel 1:9c5af431a1f1 256 uint32_t timerClock;
gustavatmel 1:9c5af431a1f1 257 uint32_t prescale;
gustavatmel 1:9c5af431a1f1 258 uint64_t temp_ticks;
gustavatmel 1:9c5af431a1f1 259
gustavatmel 1:9c5af431a1f1 260 timerClock = SYS_TMR_GetFreq(tmr);
gustavatmel 1:9c5af431a1f1 261 prescale = TMR_GetPrescaler(tmr);
gustavatmel 1:9c5af431a1f1 262
gustavatmel 1:9c5af431a1f1 263 if(timerClock == 0 || prescale > TMR_PRESCALE_DIV_2_12)
gustavatmel 1:9c5af431a1f1 264 return E_UNINITIALIZED;
gustavatmel 1:9c5af431a1f1 265
gustavatmel 1:9c5af431a1f1 266 switch (units) {
gustavatmel 1:9c5af431a1f1 267 case TMR_UNIT_NANOSEC:
gustavatmel 1:9c5af431a1f1 268 unit_div0 = 1000000;
gustavatmel 1:9c5af431a1f1 269 unit_div1 = 1000;
gustavatmel 1:9c5af431a1f1 270 break;
gustavatmel 1:9c5af431a1f1 271 case TMR_UNIT_MICROSEC:
gustavatmel 1:9c5af431a1f1 272 unit_div0 = 1000;
gustavatmel 1:9c5af431a1f1 273 unit_div1 = 1000;
gustavatmel 1:9c5af431a1f1 274 break;
gustavatmel 1:9c5af431a1f1 275 case TMR_UNIT_MILLISEC:
gustavatmel 1:9c5af431a1f1 276 unit_div0 = 1;
gustavatmel 1:9c5af431a1f1 277 unit_div1 = 1000;
gustavatmel 1:9c5af431a1f1 278 break;
gustavatmel 1:9c5af431a1f1 279 case TMR_UNIT_SEC:
gustavatmel 1:9c5af431a1f1 280 unit_div0 = 1;
gustavatmel 1:9c5af431a1f1 281 unit_div1 = 1;
gustavatmel 1:9c5af431a1f1 282 break;
gustavatmel 1:9c5af431a1f1 283 default:
gustavatmel 1:9c5af431a1f1 284 return E_BAD_PARAM;
gustavatmel 1:9c5af431a1f1 285 }
gustavatmel 1:9c5af431a1f1 286
gustavatmel 1:9c5af431a1f1 287 temp_ticks = (uint64_t)time * (timerClock / unit_div0) / (unit_div1 * (1 << (prescale & 0xF)));
gustavatmel 1:9c5af431a1f1 288
gustavatmel 1:9c5af431a1f1 289 //make sure ticks is within a 32 bit value
gustavatmel 1:9c5af431a1f1 290 if (!(temp_ticks & 0xffffffff00000000) && (temp_ticks & 0xffffffff)) {
gustavatmel 1:9c5af431a1f1 291 *ticks = temp_ticks;
gustavatmel 1:9c5af431a1f1 292 return E_NO_ERROR;
gustavatmel 1:9c5af431a1f1 293 }
gustavatmel 1:9c5af431a1f1 294
gustavatmel 1:9c5af431a1f1 295 return E_INVALID;
gustavatmel 1:9c5af431a1f1 296 }
gustavatmel 1:9c5af431a1f1 297
gustavatmel 1:9c5af431a1f1 298 /******************************************************************************/
gustavatmel 1:9c5af431a1f1 299 int TMR16_TimeToTicks(mxc_tmr_regs_t *tmr, uint32_t time, tmr_unit_t units, uint16_t *ticks)
gustavatmel 1:9c5af431a1f1 300 {
gustavatmel 1:9c5af431a1f1 301 uint32_t unit_div0, unit_div1;
gustavatmel 1:9c5af431a1f1 302 uint32_t timerClock;
gustavatmel 1:9c5af431a1f1 303 uint32_t prescale;
gustavatmel 1:9c5af431a1f1 304 uint64_t temp_ticks;
gustavatmel 1:9c5af431a1f1 305
gustavatmel 1:9c5af431a1f1 306 timerClock = SYS_TMR_GetFreq(tmr);
gustavatmel 1:9c5af431a1f1 307 prescale = TMR_GetPrescaler(tmr);
gustavatmel 1:9c5af431a1f1 308
gustavatmel 1:9c5af431a1f1 309 if(timerClock == 0 || prescale > TMR_PRESCALE_DIV_2_12)
gustavatmel 1:9c5af431a1f1 310 return E_UNINITIALIZED;
gustavatmel 1:9c5af431a1f1 311
gustavatmel 1:9c5af431a1f1 312 switch (units) {
gustavatmel 1:9c5af431a1f1 313 case TMR_UNIT_NANOSEC:
gustavatmel 1:9c5af431a1f1 314 unit_div0 = 1000000;
gustavatmel 1:9c5af431a1f1 315 unit_div1 = 1000;
gustavatmel 1:9c5af431a1f1 316 break;
gustavatmel 1:9c5af431a1f1 317 case TMR_UNIT_MICROSEC:
gustavatmel 1:9c5af431a1f1 318 unit_div0 = 1000;
gustavatmel 1:9c5af431a1f1 319 unit_div1 = 1000;
gustavatmel 1:9c5af431a1f1 320 break;
gustavatmel 1:9c5af431a1f1 321 case TMR_UNIT_MILLISEC:
gustavatmel 1:9c5af431a1f1 322 unit_div0 = 1;
gustavatmel 1:9c5af431a1f1 323 unit_div1 = 1000;
gustavatmel 1:9c5af431a1f1 324 break;
gustavatmel 1:9c5af431a1f1 325 case TMR_UNIT_SEC:
gustavatmel 1:9c5af431a1f1 326 unit_div0 = 1;
gustavatmel 1:9c5af431a1f1 327 unit_div1 = 1;
gustavatmel 1:9c5af431a1f1 328 break;
gustavatmel 1:9c5af431a1f1 329 default:
gustavatmel 1:9c5af431a1f1 330 return E_BAD_PARAM;
gustavatmel 1:9c5af431a1f1 331 }
gustavatmel 1:9c5af431a1f1 332
gustavatmel 1:9c5af431a1f1 333 temp_ticks = (uint64_t)time * (timerClock / unit_div0) / (unit_div1 * (1 << (prescale & 0xF)));
gustavatmel 1:9c5af431a1f1 334
gustavatmel 1:9c5af431a1f1 335 //make sure ticks is within a 32 bit value
gustavatmel 1:9c5af431a1f1 336 if (!(temp_ticks & 0xffffffffffff0000) && (temp_ticks & 0xffff)) {
gustavatmel 1:9c5af431a1f1 337 *ticks = temp_ticks;
gustavatmel 1:9c5af431a1f1 338 return E_NO_ERROR;
gustavatmel 1:9c5af431a1f1 339 }
gustavatmel 1:9c5af431a1f1 340
gustavatmel 1:9c5af431a1f1 341 return E_INVALID;
gustavatmel 1:9c5af431a1f1 342 }
gustavatmel 1:9c5af431a1f1 343
gustavatmel 1:9c5af431a1f1 344
gustavatmel 1:9c5af431a1f1 345 /******************************************************************************/
gustavatmel 1:9c5af431a1f1 346 int TMR_TicksToTime(mxc_tmr_regs_t *tmr, uint32_t ticks, uint32_t *time, tmr_unit_t *units)
gustavatmel 1:9c5af431a1f1 347 {
gustavatmel 1:9c5af431a1f1 348 uint64_t temp_time = 0;
gustavatmel 1:9c5af431a1f1 349
gustavatmel 1:9c5af431a1f1 350 uint32_t timerClock = SYS_TMR_GetFreq(tmr);
gustavatmel 1:9c5af431a1f1 351 uint32_t prescale = TMR_GetPrescaler(tmr);
gustavatmel 1:9c5af431a1f1 352
gustavatmel 1:9c5af431a1f1 353 if(timerClock == 0 || prescale > TMR_PRESCALE_DIV_2_12)
gustavatmel 1:9c5af431a1f1 354 return E_UNINITIALIZED;
gustavatmel 1:9c5af431a1f1 355
gustavatmel 1:9c5af431a1f1 356 tmr_unit_t temp_unit = TMR_UNIT_NANOSEC;
gustavatmel 1:9c5af431a1f1 357 temp_time = (uint64_t)ticks * 1000 * (1 << (prescale & 0xF)) / (timerClock / 1000000);
gustavatmel 1:9c5af431a1f1 358 if (!(temp_time & 0xffffffff00000000)) {
gustavatmel 1:9c5af431a1f1 359 *time = temp_time;
gustavatmel 1:9c5af431a1f1 360 *units = temp_unit;
gustavatmel 1:9c5af431a1f1 361 return E_NO_ERROR;
gustavatmel 1:9c5af431a1f1 362 }
gustavatmel 1:9c5af431a1f1 363
gustavatmel 1:9c5af431a1f1 364 temp_unit = TMR_UNIT_MICROSEC;
gustavatmel 1:9c5af431a1f1 365 temp_time = (uint64_t)ticks * 1000 * (1 << (prescale & 0xF)) / (timerClock / 1000);
gustavatmel 1:9c5af431a1f1 366 if (!(temp_time & 0xffffffff00000000)) {
gustavatmel 1:9c5af431a1f1 367 *time = temp_time;
gustavatmel 1:9c5af431a1f1 368 *units = temp_unit;
gustavatmel 1:9c5af431a1f1 369 return E_NO_ERROR;
gustavatmel 1:9c5af431a1f1 370 }
gustavatmel 1:9c5af431a1f1 371
gustavatmel 1:9c5af431a1f1 372 temp_unit = TMR_UNIT_MILLISEC;
gustavatmel 1:9c5af431a1f1 373 temp_time = (uint64_t)ticks * 1000 * (1 << (prescale & 0xF)) / timerClock;
gustavatmel 1:9c5af431a1f1 374 if (!(temp_time & 0xffffffff00000000)) {
gustavatmel 1:9c5af431a1f1 375 *time = temp_time;
gustavatmel 1:9c5af431a1f1 376 *units = temp_unit;
gustavatmel 1:9c5af431a1f1 377 return E_NO_ERROR;
gustavatmel 1:9c5af431a1f1 378 }
gustavatmel 1:9c5af431a1f1 379
gustavatmel 1:9c5af431a1f1 380 temp_unit = TMR_UNIT_SEC;
gustavatmel 1:9c5af431a1f1 381 temp_time = (uint64_t)ticks * (1 << (prescale & 0xF)) / timerClock;
gustavatmel 1:9c5af431a1f1 382 if (!(temp_time & 0xffffffff00000000)) {
gustavatmel 1:9c5af431a1f1 383 *time = temp_time;
gustavatmel 1:9c5af431a1f1 384 *units = temp_unit;
gustavatmel 1:9c5af431a1f1 385 return E_NO_ERROR;
gustavatmel 1:9c5af431a1f1 386 }
gustavatmel 1:9c5af431a1f1 387
gustavatmel 1:9c5af431a1f1 388 return E_INVALID;
gustavatmel 1:9c5af431a1f1 389 }