diff options
Diffstat (limited to 'os')
-rw-r--r-- | os/hal/ports/STM32/LLD/eicu_lld.c | 20 | ||||
-rw-r--r-- | os/hal/ports/STM32/LLD/eicu_lld.h | 12 |
2 files changed, 26 insertions, 6 deletions
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 @@ -282,6 +282,14 @@ typedef enum { } eicucapturemode_t; /** + * @brief Timer registers width in bits. + */ +typedef enum { + EICU_WIDTH_16, + EICU_WIDTH_32 +} eicutimerwidth_t; + +/** * @brief EICU frequency type. */ typedef uint32_t eicufreq_t; @@ -391,6 +399,10 @@ struct EICUDriver { */ uint32_t clock; /** + * @brief Timer registers width in bits. + */ + eicutimerwidth_t width; + /** * @brief Pointer to configuration for the driver. */ const EICUConfig *config; |