From 0b0fb6f88f6851842e89f19129b0dc535f41dcbc Mon Sep 17 00:00:00 2001 From: gdisirio Date: Fri, 1 Apr 2011 08:45:34 +0000 Subject: ICU driver functional. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@2857 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/hal/include/icu.h | 4 ++-- os/hal/platforms/STM32/icu_lld.c | 14 ++++++++++---- os/hal/platforms/STM32/icu_lld.h | 27 ++------------------------- os/hal/src/hal.c | 3 +++ testhal/STM32/PWM/main.c | 23 +++++++++++++++++++++++ testhal/STM32/PWM/mcuconf.h | 4 ++-- testhal/STM32/PWM/readme.txt | 6 ++++-- 7 files changed, 46 insertions(+), 35 deletions(-) diff --git a/os/hal/include/icu.h b/os/hal/include/icu.h index 26fc120ad..b51345c4d 100644 --- a/os/hal/include/icu.h +++ b/os/hal/include/icu.h @@ -130,8 +130,8 @@ extern "C" { void icuObjectInit(ICUDriver *icup); void icuStart(ICUDriver *icup, const ICUConfig *config); void icuStop(ICUDriver *icup); - void icuEnableI(ICUDriver *icup); - void icuDisableI(ICUDriver *icup); + void icuEnable(ICUDriver *icup); + void icuDisable(ICUDriver *icup); #ifdef __cplusplus } #endif diff --git a/os/hal/platforms/STM32/icu_lld.c b/os/hal/platforms/STM32/icu_lld.c index 5d3bb284d..f950a5eb6 100644 --- a/os/hal/platforms/STM32/icu_lld.c +++ b/os/hal/platforms/STM32/icu_lld.c @@ -91,12 +91,18 @@ ICUDriver ICUD5; static void icu_lld_serve_interrupt(ICUDriver *icup) { uint16_t sr; - sr = TIM1->SR & TIM1->DIER; + sr = icup->tim->SR & icup->tim->DIER; icup->tim->SR = 0; - if ((sr & TIM_SR_CC1IF) != 0) - icup->config->period_cb(icup); - if ((sr & TIM_SR_CC2IF) != 0) + if ((sr & TIM_SR_CC1IF) != 0) { + icustate_t previous_state = icup->state; + icup->state = ICU_ACTIVE; + if (previous_state != ICU_WAITING) + icup->config->period_cb(icup); + } + if ((sr & TIM_SR_CC2IF) != 0) { + icup->state = ICU_IDLE; icup->config->width_cb(icup); + } } /*===========================================================================*/ diff --git a/os/hal/platforms/STM32/icu_lld.h b/os/hal/platforms/STM32/icu_lld.h index 437390d52..b98b8bf86 100644 --- a/os/hal/platforms/STM32/icu_lld.h +++ b/os/hal/platforms/STM32/icu_lld.h @@ -223,7 +223,6 @@ struct ICUDriver { /* Driver macros. */ /*===========================================================================*/ - /** * @brief Returns the width of the latest pulse. * @details The pulse width is defined as number of ticks between the start @@ -234,7 +233,7 @@ struct ICUDriver { * * @notapi */ -#define icu_lld_get_width(icup) ((icup)->tim->CCR2) +#define icu_lld_get_width(icup) ((icup)->tim->CCR2 + 1) /** * @brief Returns the width of the latest cycle. @@ -246,29 +245,7 @@ struct ICUDriver { * * @notapi */ -#define icu_lld_get_period(icup) ((icup)->tim->CCR1) - -/** - * @brief ICU clock prescaler initialization utility. - * @note The real clock value is rounded to the lower valid value, please - * make sure that the source clock frequency is a multiple of the - * requested ICU clock frequency. - * @note The calculated value must fit into an unsigned 16 bits integer. - * - * @param[in] clksrc clock source frequency, depending on the target timer - * cell it can be one of: - * - STM32_TIMCLK1 - * - STM32_TIMCLK2 - * . - * Please refer to the STM32 HAL driver documentation - * and/or the STM32 Reference Manual for the right clock - * source. - * @param[in] icuclk ICU clock frequency in cycles - * @return The value to be stored in the @p psc field of the - * @p ICUConfig structure. - */ -#define ICU_COMPUTE_PSC(clksrc, icuclk) \ - ((uint16_t)(((clksrc) / (icuclk)) - 1)) +#define icu_lld_get_period(icup) ((icup)->tim->CCR1 + 1) /*===========================================================================*/ /* External declarations. */ diff --git a/os/hal/src/hal.c b/os/hal/src/hal.c index 09b832fe2..8555b44bb 100644 --- a/os/hal/src/hal.c +++ b/os/hal/src/hal.c @@ -73,6 +73,9 @@ void halInit(void) { #if HAL_USE_I2C || defined(__DOXYGEN__) i2cInit(); #endif +#if HAL_USE_ICU || defined(__DOXYGEN__) + icuInit(); +#endif #if HAL_USE_MAC || defined(__DOXYGEN__) macInit(); #endif diff --git a/testhal/STM32/PWM/main.c b/testhal/STM32/PWM/main.c index ef08b792c..c89b71988 100644 --- a/testhal/STM32/PWM/main.c +++ b/testhal/STM32/PWM/main.c @@ -46,6 +46,25 @@ static PWMConfig pwmcfg = { 0 }; +icucnt_t last_width, last_period; + +static void icuwidthcb(ICUDriver *icup) { + + last_width = icuGetWidthI(icup); +} + +static void icuperiodcb(ICUDriver *icup) { + + last_period = icuGetPeriodI(icup); +} + +static ICUConfig icucfg = { + ICU_INPUT_ACTIVE_HIGH, + 10000, /* 10KHz ICU clock frequency. */ + icuwidthcb, + icuperiodcb +}; + /* * Application entry point. */ @@ -71,6 +90,8 @@ int main(void) { */ pwmStart(&PWMD1, &pwmcfg); palSetPadMode(IOPORT1, 8, PAL_MODE_STM32_ALTERNATE_PUSHPULL); + icuStart(&ICUD4, &icucfg); + icuEnable(&ICUD4); chThdSleepMilliseconds(2000); /* @@ -97,6 +118,8 @@ int main(void) { */ pwmDisableChannel(&PWMD1, 0); pwmStop(&PWMD1); + icuDisable(&ICUD4); + icuStop(&ICUD4); palSetPad(IOPORT3, GPIOC_LED); /* diff --git a/testhal/STM32/PWM/mcuconf.h b/testhal/STM32/PWM/mcuconf.h index 17929817f..bd96de17b 100644 --- a/testhal/STM32/PWM/mcuconf.h +++ b/testhal/STM32/PWM/mcuconf.h @@ -78,9 +78,9 @@ * ICU driver system settings. */ #define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 TRUE +#define STM32_ICU_USE_TIM2 FALSE #define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE +#define STM32_ICU_USE_TIM4 TRUE #define STM32_ICU_USE_TIM5 FALSE #define STM32_ICU_TIM1_IRQ_PRIORITY 7 #define STM32_ICU_TIM2_IRQ_PRIORITY 7 diff --git a/testhal/STM32/PWM/readme.txt b/testhal/STM32/PWM/readme.txt index 4c3fdf2fa..97476205d 100644 --- a/testhal/STM32/PWM/readme.txt +++ b/testhal/STM32/PWM/readme.txt @@ -1,5 +1,5 @@ ***************************************************************************** -** ChibiOS/RT HAL - PWM driver demo for STM32. ** +** ChibiOS/RT HAL - PWM/ICU driver demo for STM32. ** ***************************************************************************** ** TARGET ** @@ -8,7 +8,9 @@ The demo will on an Olimex STM32-P103 board. ** The Demo ** -The application demonstrates the use of the STM32 PWM driver. +The application demonstrates the use of the STM32 PWM and ICU drivers. Pins +PA8 and PB6 must be connected in order to trigger the ICU input with the +PWM output. The ICU unit will measure the generated PWM. ** Build Procedure ** -- cgit v1.2.3