From ae1ce0ea2bcad5962831dae78afde8575b9d7675 Mon Sep 17 00:00:00 2001 From: barthess Date: Thu, 5 Mar 2015 15:59:32 +0300 Subject: EICU. Timer widht (16-32 bits) now stored in driver field and detected durign startup --- os/hal/ports/STM32/LLD/eicu_lld.c | 20 ++++++++++++++------ os/hal/ports/STM32/LLD/eicu_lld.h | 12 ++++++++++++ 2 files changed, 26 insertions(+), 6 deletions(-) (limited to 'os/hal/ports') diff --git a/os/hal/ports/STM32/LLD/eicu_lld.c b/os/hal/ports/STM32/LLD/eicu_lld.c index 0245128..415a649 100644 --- a/os/hal/ports/STM32/LLD/eicu_lld.c +++ b/os/hal/ports/STM32/LLD/eicu_lld.c @@ -149,7 +149,7 @@ static eicuresult_t get_time_both(EICUDriver *eicup, unsigned subtraction math.*/ /* 16-bit timer */ - if (0xFFFF == eicup->tim->ARR) { + if (EICU_WIDTH_16 == eicup->width) { uint16_t cmp = compare; uint16_t la = chp->last_active; uint16_t li = chp->last_idle; @@ -159,7 +159,7 @@ static eicuresult_t get_time_both(EICUDriver *eicup, ret.period = p; } /* 32-bit timer */ - else if (0xFFFFFFFF == eicup->tim->ARR) { + else if (EICU_WIDTH_32 == eicup->width) { ret.width = chp->last_idle - chp->last_active; ret.period = compare - chp->last_active; return ret; @@ -193,14 +193,14 @@ static eicucnt_t get_time_width(EICUDriver *eicup, unsigned subtraction math.*/ /* 16-bit timer */ - if (0xFFFF == eicup->tim->ARR) { + if (EICU_WIDTH_16 == eicup->width) { uint16_t cmp = compare; uint16_t la = chp->last_active; uint16_t ret = cmp - la; return ret; } /* 32-bit timer */ - else if (0xFFFFFFFF == eicup->tim->ARR) { + else if (EICU_WIDTH_32 == eicup->width) { return compare - chp->last_active; } /* error trap */ @@ -231,14 +231,14 @@ static eicucnt_t get_time_period(EICUDriver *eicup, unsigned subtraction math.*/ /* 16-bit timer */ - if (0xFFFF == eicup->tim->ARR) { + if (EICU_WIDTH_16 == eicup->width) { uint16_t cmp = compare; uint16_t li = chp->last_idle; uint16_t ret = cmp - li; return ret; } /* 32-bit timer */ - else if (0xFFFFFFFF == eicup->tim->ARR) { + else if (EICU_WIDTH_32 == eicup->width) { return compare - chp->last_idle; } /* error trap */ @@ -807,6 +807,14 @@ void eicu_lld_start(EICUDriver *eicup) { eicup->tim->PSC = (uint16_t)psc; eicup->tim->ARR = (eicucnt_t)-1; + /* Detect width.*/ + if (0xFFFFFFFF == eicup->tim->ARR) + eicup->width = EICU_WIDTH_32; + else if (0xFFFF == eicup->tim->ARR) + eicup->width = EICU_WIDTH_16; + else + osalSysHalt("Unsupported width"); + /* Reset registers */ eicup->tim->SMCR = 0; eicup->tim->CCMR1 = 0; diff --git a/os/hal/ports/STM32/LLD/eicu_lld.h b/os/hal/ports/STM32/LLD/eicu_lld.h index 4f10893..9b04ab2 100644 --- a/os/hal/ports/STM32/LLD/eicu_lld.h +++ b/os/hal/ports/STM32/LLD/eicu_lld.h @@ -281,6 +281,14 @@ typedef enum { EICU_INPUT_BOTH } eicucapturemode_t; +/** + * @brief Timer registers width in bits. + */ +typedef enum { + EICU_WIDTH_16, + EICU_WIDTH_32 +} eicutimerwidth_t; + /** * @brief EICU frequency type. */ @@ -390,6 +398,10 @@ struct EICUDriver { * @brief Timer base clock. */ uint32_t clock; + /** + * @brief Timer registers width in bits. + */ + eicutimerwidth_t width; /** * @brief Pointer to configuration for the driver. */ -- cgit v1.2.3