arch/stm32_capture_lowerhalf.c: add lower half support of capture
This commit is contained in:
parent
4afd25b567
commit
fd8eaf4f42
@ -3413,6 +3413,10 @@ config STM32_PWM
|
|||||||
bool
|
bool
|
||||||
default n
|
default n
|
||||||
|
|
||||||
|
config STM32_CAP
|
||||||
|
bool
|
||||||
|
default n
|
||||||
|
|
||||||
config STM32_COMP
|
config STM32_COMP
|
||||||
bool
|
bool
|
||||||
default n
|
default n
|
||||||
@ -6765,122 +6769,350 @@ config STM32_TIM1_CAP
|
|||||||
bool "TIM1 Capture"
|
bool "TIM1 Capture"
|
||||||
default n
|
default n
|
||||||
depends on STM32_TIM1
|
depends on STM32_TIM1
|
||||||
|
select STM32_CAP
|
||||||
---help---
|
---help---
|
||||||
Reserve timer 1 for use by Capture
|
Reserve timer 1 for use by Capture
|
||||||
|
|
||||||
Timer devices may be used for different purposes. One special purpose is
|
Timer devices may be used for different purposes. One special purpose is
|
||||||
to capture input.
|
to capture input.
|
||||||
|
|
||||||
|
if STM32_TIM1_CAP
|
||||||
|
|
||||||
|
config STM32_TIM1_CHANNEL
|
||||||
|
int "TIM1 Capture Input Channel"
|
||||||
|
default 1
|
||||||
|
range 1 4
|
||||||
|
---help---
|
||||||
|
If TIM1 is enabled for capture usage, you also need specifies the timer input
|
||||||
|
channel {1,..,4}
|
||||||
|
|
||||||
|
config STM32_TIM1_CLOCK
|
||||||
|
int "TIM1 work frequence for capture"
|
||||||
|
default 1000000
|
||||||
|
---help---
|
||||||
|
This clock frequence limiting the count rate at the expense of resolution.
|
||||||
|
|
||||||
|
endif # STM32_TIM1_CAP
|
||||||
|
|
||||||
config STM32_TIM2_CAP
|
config STM32_TIM2_CAP
|
||||||
bool "TIM2 Capture"
|
bool "TIM2 Capture"
|
||||||
default n
|
default n
|
||||||
depends on STM32_TIM2
|
depends on STM32_TIM2
|
||||||
|
select STM32_CAP
|
||||||
---help---
|
---help---
|
||||||
Reserve timer 2 for use by Capture
|
Reserve timer 2 for use by Capture
|
||||||
|
|
||||||
Timer devices may be used for different purposes. One special purpose is
|
Timer devices may be used for different purposes. One special purpose is
|
||||||
to capture input.
|
to capture input.
|
||||||
|
|
||||||
|
if STM32_TIM2_CAP
|
||||||
|
|
||||||
|
config STM32_TIM2_CHANNEL
|
||||||
|
int "TIM2 Capture Input Channel"
|
||||||
|
default 1
|
||||||
|
range 1 4
|
||||||
|
---help---
|
||||||
|
If TIM2 is enabled for capture usage, you also need specifies the timer input
|
||||||
|
channel {1,..,4}
|
||||||
|
|
||||||
|
config STM32_TIM2_CLOCK
|
||||||
|
int "TIM2 work frequence for capture"
|
||||||
|
default 1000000
|
||||||
|
---help---
|
||||||
|
This clock frequence limiting the count rate at the expense of resolution.
|
||||||
|
|
||||||
|
endif # STM32_TIM2_CAP
|
||||||
|
|
||||||
config STM32_TIM3_CAP
|
config STM32_TIM3_CAP
|
||||||
bool "TIM3 Capture"
|
bool "TIM3 Capture"
|
||||||
default n
|
default n
|
||||||
depends on STM32_TIM3
|
depends on STM32_TIM3
|
||||||
|
select STM32_CAP
|
||||||
---help---
|
---help---
|
||||||
Reserve timer 3 for use by Capture
|
Reserve timer 3 for use by Capture
|
||||||
|
|
||||||
Timer devices may be used for different purposes. One special purpose is
|
Timer devices may be used for different purposes. One special purpose is
|
||||||
to capture input.
|
to capture input.
|
||||||
|
|
||||||
|
if STM32_TIM3_CAP
|
||||||
|
|
||||||
|
config STM32_TIM3_CHANNEL
|
||||||
|
int "TIM3 Capture Input Channel"
|
||||||
|
default 1
|
||||||
|
range 1 4
|
||||||
|
---help---
|
||||||
|
If TIM3 is enabled for capture usage, you also need specifies the timer input
|
||||||
|
channel {1,..,4}
|
||||||
|
|
||||||
|
config STM32_TIM3_CLOCK
|
||||||
|
int "TIM3 work frequence for capture"
|
||||||
|
default 1000000
|
||||||
|
---help---
|
||||||
|
This clock frequence limiting the count rate at the expense of resolution.
|
||||||
|
|
||||||
|
endif # STM32_TIM3_CAP
|
||||||
|
|
||||||
config STM32_TIM4_CAP
|
config STM32_TIM4_CAP
|
||||||
bool "TIM4 Capture"
|
bool "TIM4 Capture"
|
||||||
default n
|
default n
|
||||||
depends on STM32_TIM4
|
depends on STM32_TIM4
|
||||||
|
select STM32_CAP
|
||||||
---help---
|
---help---
|
||||||
Reserve timer 4 for use by Capture
|
Reserve timer 4 for use by Capture
|
||||||
|
|
||||||
Timer devices may be used for different purposes. One special purpose is
|
Timer devices may be used for different purposes. One special purpose is
|
||||||
to capture input.
|
to capture input.
|
||||||
|
|
||||||
|
if STM32_TIM4_CAP
|
||||||
|
|
||||||
|
config STM32_TIM4_CHANNEL
|
||||||
|
int "TIM4 Capture Input Channel"
|
||||||
|
default 1
|
||||||
|
range 1 4
|
||||||
|
---help---
|
||||||
|
If TIM4 is enabled for capture usage, you also need specifies the timer input
|
||||||
|
channel {1,..,4}
|
||||||
|
|
||||||
|
config STM32_TIM4_CLOCK
|
||||||
|
int "TIM4 work frequence for capture"
|
||||||
|
default 1000000
|
||||||
|
---help---
|
||||||
|
This clock frequence limiting the count rate at the expense of resolution.
|
||||||
|
|
||||||
|
endif # STM32_TIM4_CAP
|
||||||
|
|
||||||
config STM32_TIM5_CAP
|
config STM32_TIM5_CAP
|
||||||
bool "TIM5 Capture"
|
bool "TIM5 Capture"
|
||||||
default n
|
default n
|
||||||
depends on STM32_TIM5
|
depends on STM32_TIM5
|
||||||
|
select STM32_CAP
|
||||||
---help---
|
---help---
|
||||||
Reserve timer 5 for use by Capture
|
Reserve timer 5 for use by Capture
|
||||||
|
|
||||||
Timer devices may be used for different purposes. One special purpose is
|
Timer devices may be used for different purposes. One special purpose is
|
||||||
to capture input.
|
to capture input.
|
||||||
|
|
||||||
|
if STM32_TIM5_CAP
|
||||||
|
|
||||||
|
config STM32_TIM5_CHANNEL
|
||||||
|
int "TIM5 Capture Input Channel"
|
||||||
|
default 1
|
||||||
|
range 1 4
|
||||||
|
---help---
|
||||||
|
If TIM5 is enabled for capture usage, you also need specifies the timer input
|
||||||
|
channel {1,..,4}
|
||||||
|
|
||||||
|
config STM32_TIM5_CLOCK
|
||||||
|
int "TIM5 work frequence for capture"
|
||||||
|
default 1000000
|
||||||
|
---help---
|
||||||
|
This clock frequence limiting the count rate at the expense of resolution.
|
||||||
|
|
||||||
|
endif # STM32_TIM5_CAP
|
||||||
|
|
||||||
config STM32_TIM8_CAP
|
config STM32_TIM8_CAP
|
||||||
bool "TIM8 Capture"
|
bool "TIM8 Capture"
|
||||||
default n
|
default n
|
||||||
depends on STM32_TIM8
|
depends on STM32_TIM8
|
||||||
|
select STM32_CAP
|
||||||
---help---
|
---help---
|
||||||
Reserve timer 8 for use by Capture
|
Reserve timer 8 for use by Capture
|
||||||
|
|
||||||
Timer devices may be used for different purposes. One special purpose is
|
Timer devices may be used for different purposes. One special purpose is
|
||||||
to capture input.
|
to capture input.
|
||||||
|
|
||||||
|
if STM32_TIM8_CAP
|
||||||
|
|
||||||
|
config STM32_TIM8_CHANNEL
|
||||||
|
int "TIM8 Capture Input Channel"
|
||||||
|
default 1
|
||||||
|
range 1 4
|
||||||
|
---help---
|
||||||
|
If TIM8 is enabled for capture usage, you also need specifies the timer input
|
||||||
|
channel {1,..,4}
|
||||||
|
|
||||||
|
config STM32_TIM8_CLOCK
|
||||||
|
int "TIM8 work frequence for capture"
|
||||||
|
default 1000000
|
||||||
|
---help---
|
||||||
|
This clock frequence limiting the count rate at the expense of resolution.
|
||||||
|
|
||||||
|
endif # STM32_TIM8_CAP
|
||||||
|
|
||||||
config STM32_TIM9_CAP
|
config STM32_TIM9_CAP
|
||||||
bool "TIM9 Capture"
|
bool "TIM9 Capture"
|
||||||
default n
|
default n
|
||||||
depends on STM32_TIM9
|
depends on STM32_TIM9
|
||||||
|
select STM32_CAP
|
||||||
---help---
|
---help---
|
||||||
Reserve timer 9 for use by Capture
|
Reserve timer 9 for use by Capture
|
||||||
|
|
||||||
Timer devices may be used for different purposes. One special purpose is
|
Timer devices may be used for different purposes. One special purpose is
|
||||||
to capture input.
|
to capture input.
|
||||||
|
|
||||||
|
if STM32_TIM9_CAP
|
||||||
|
|
||||||
|
config STM32_TIM9_CHANNEL
|
||||||
|
int "TIM9 Capture Input Channel"
|
||||||
|
default 1
|
||||||
|
range 1 4
|
||||||
|
---help---
|
||||||
|
If TIM9 is enabled for capture usage, you also need specifies the timer input
|
||||||
|
channel {1,..,4}
|
||||||
|
|
||||||
|
config STM32_TIM9_CLOCK
|
||||||
|
int "TIM9 work frequence for capture"
|
||||||
|
default 1000000
|
||||||
|
---help---
|
||||||
|
This clock frequence limiting the count rate at the expense of resolution.
|
||||||
|
|
||||||
|
endif # STM32_TIM9_CAP
|
||||||
|
|
||||||
config STM32_TIM10_CAP
|
config STM32_TIM10_CAP
|
||||||
bool "TIM10 Capture"
|
bool "TIM10 Capture"
|
||||||
default n
|
default n
|
||||||
depends on STM32_TIM10
|
depends on STM32_TIM10
|
||||||
|
select STM32_CAP
|
||||||
---help---
|
---help---
|
||||||
Reserve timer 10 for use by Capture
|
Reserve timer 10 for use by Capture
|
||||||
|
|
||||||
Timer devices may be used for different purposes. One special purpose is
|
Timer devices may be used for different purposes. One special purpose is
|
||||||
to capture input.
|
to capture input.
|
||||||
|
|
||||||
|
if STM32_TIM10_CAP
|
||||||
|
|
||||||
|
config STM32_TIM10_CHANNEL
|
||||||
|
int "TIM10 Capture Input Channel"
|
||||||
|
default 1
|
||||||
|
range 1 4
|
||||||
|
---help---
|
||||||
|
If TIM10 is enabled for capture usage, you also need specifies the timer input
|
||||||
|
channel {1,..,4}
|
||||||
|
|
||||||
|
config STM32_TIM10_CLOCK
|
||||||
|
int "TIM10 work frequence for capture"
|
||||||
|
default 1000000
|
||||||
|
---help---
|
||||||
|
This clock frequence limiting the count rate at the expense of resolution.
|
||||||
|
|
||||||
|
endif # STM32_TIM10_CAP
|
||||||
|
|
||||||
config STM32_TIM11_CAP
|
config STM32_TIM11_CAP
|
||||||
bool "TIM11 Capture"
|
bool "TIM11 Capture"
|
||||||
default n
|
default n
|
||||||
depends on STM32_TIM11
|
depends on STM32_TIM11
|
||||||
|
select STM32_CAP
|
||||||
---help---
|
---help---
|
||||||
Reserve timer 11 for use by Capture
|
Reserve timer 11 for use by Capture
|
||||||
|
|
||||||
Timer devices may be used for different purposes. One special purpose is
|
Timer devices may be used for different purposes. One special purpose is
|
||||||
to capture input.
|
to capture input.
|
||||||
|
|
||||||
|
if STM32_TIM11_CAP
|
||||||
|
|
||||||
|
config STM32_TIM11_CHANNEL
|
||||||
|
int "TIM11 Capture Input Channel"
|
||||||
|
default 1
|
||||||
|
range 1 4
|
||||||
|
---help---
|
||||||
|
If TIM11 is enabled for capture usage, you also need specifies the timer input
|
||||||
|
channel {1,..,4}
|
||||||
|
|
||||||
|
config STM32_TIM11_CLOCK
|
||||||
|
int "TIM11 work frequence for capture"
|
||||||
|
default 1000000
|
||||||
|
---help---
|
||||||
|
This clock frequence limiting the count rate at the expense of resolution.
|
||||||
|
|
||||||
|
endif # STM32_TIM11_CAP
|
||||||
|
|
||||||
config STM32_TIM12_CAP
|
config STM32_TIM12_CAP
|
||||||
bool "TIM12 Capture"
|
bool "TIM12 Capture"
|
||||||
default n
|
default n
|
||||||
depends on STM32_TIM12
|
depends on STM32_TIM12
|
||||||
|
select STM32_CAP
|
||||||
---help---
|
---help---
|
||||||
Reserve timer 12 for use by Capture
|
Reserve timer 12 for use by Capture
|
||||||
|
|
||||||
Timer devices may be used for different purposes. One special purpose is
|
Timer devices may be used for different purposes. One special purpose is
|
||||||
to capture input.
|
to capture input.
|
||||||
|
|
||||||
|
if STM32_TIM12_CAP
|
||||||
|
|
||||||
|
config STM32_TIM12_CHANNEL
|
||||||
|
int "TIM12 Capture Input Channel"
|
||||||
|
default 1
|
||||||
|
range 1 4
|
||||||
|
---help---
|
||||||
|
If TIM12 is enabled for capture usage, you also need specifies the timer input
|
||||||
|
channel {1,..,4}
|
||||||
|
|
||||||
|
config STM32_TIM12_CLOCK
|
||||||
|
int "TIM12 work frequence for capture"
|
||||||
|
default 1000000
|
||||||
|
---help---
|
||||||
|
This clock frequence limiting the count rate at the expense of resolution.
|
||||||
|
|
||||||
|
endif # STM32_TIM12_CAP
|
||||||
|
|
||||||
config STM32_TIM13_CAP
|
config STM32_TIM13_CAP
|
||||||
bool "TIM13 Capture"
|
bool "TIM13 Capture"
|
||||||
default n
|
default n
|
||||||
depends on STM32_TIM13
|
depends on STM32_TIM13
|
||||||
|
select STM32_CAP
|
||||||
---help---
|
---help---
|
||||||
Reserve timer 13 for use by Capture
|
Reserve timer 13 for use by Capture
|
||||||
|
|
||||||
Timer devices may be used for different purposes. One special purpose is
|
Timer devices may be used for different purposes. One special purpose is
|
||||||
to capture input.
|
to capture input.
|
||||||
|
|
||||||
|
if STM32_TIM13_CAP
|
||||||
|
|
||||||
|
config STM32_TIM13_CHANNEL
|
||||||
|
int "TIM13 Capture Input Channel"
|
||||||
|
default 1
|
||||||
|
range 1 4
|
||||||
|
---help---
|
||||||
|
If TIM13 is enabled for capture usage, you also need specifies the timer input
|
||||||
|
channel {1,..,4}
|
||||||
|
|
||||||
|
config STM32_TIM13_CLOCK
|
||||||
|
int "TIM13 work frequence for capture"
|
||||||
|
default 1000000
|
||||||
|
---help---
|
||||||
|
This clock frequence limiting the count rate at the expense of resolution.
|
||||||
|
|
||||||
|
endif # STM32_TIM13_CAP
|
||||||
|
|
||||||
config STM32_TIM14_CAP
|
config STM32_TIM14_CAP
|
||||||
bool "TIM14 Capture"
|
bool "TIM14 Capture"
|
||||||
default n
|
default n
|
||||||
depends on STM32_TIM14
|
depends on STM32_TIM14
|
||||||
|
select STM32_CAP
|
||||||
---help---
|
---help---
|
||||||
Reserve timer 14 for use by Capture
|
Reserve timer 14 for use by Capture
|
||||||
|
|
||||||
Timer devices may be used for different purposes. One special purpose is
|
Timer devices may be used for different purposes. One special purpose is
|
||||||
to capture input.
|
to capture input.
|
||||||
|
|
||||||
|
if STM32_TIM14_CAP
|
||||||
|
|
||||||
|
config STM32_TIM14_CHANNEL
|
||||||
|
int "TIM14 Capture Input Channel"
|
||||||
|
default 1
|
||||||
|
range 1 4
|
||||||
|
---help---
|
||||||
|
If TIM14 is enabled for capture usage, you also need specifies the timer input
|
||||||
|
channel {1,..,4}
|
||||||
|
|
||||||
|
config STM32_TIM14_CLOCK
|
||||||
|
int "TIM14 work frequence for capture"
|
||||||
|
default 1000000
|
||||||
|
---help---
|
||||||
|
This clock frequence limiting the count rate at the expense of resolution.
|
||||||
|
|
||||||
|
endif # STM32_TIM14_CAP
|
||||||
|
|
||||||
menu "STM32 TIMx Outputs Configuration"
|
menu "STM32 TIMx Outputs Configuration"
|
||||||
|
|
||||||
config STM32_TIM1_CH1POL
|
config STM32_TIM1_CH1POL
|
||||||
|
@ -175,6 +175,10 @@ ifeq ($(CONFIG_STM32_PWM),y)
|
|||||||
CHIP_CSRCS += stm32_pwm.c
|
CHIP_CSRCS += stm32_pwm.c
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifeq ($(CONFIG_STM32_CAP),y)
|
||||||
|
CHIP_CSRCS += stm32_capture_lowerhalf.c
|
||||||
|
endif
|
||||||
|
|
||||||
ifeq ($(CONFIG_SENSORS_QENCODER),y)
|
ifeq ($(CONFIG_SENSORS_QENCODER),y)
|
||||||
CHIP_CSRCS += stm32_qencoder.c
|
CHIP_CSRCS += stm32_qencoder.c
|
||||||
endif
|
endif
|
||||||
|
@ -617,13 +617,15 @@ static inline int stm32_cap_set_rcc(const struct stm32_cap_priv_s *priv,
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static int stm32_cap_setclock(struct stm32_cap_dev_s *dev,
|
static int stm32_cap_setclock(struct stm32_cap_dev_s *dev,
|
||||||
stm32_cap_clk_t clk,
|
uint32_t freq, uint32_t max)
|
||||||
uint32_t prescaler, uint32_t max)
|
|
||||||
{
|
{
|
||||||
const struct stm32_cap_priv_s *priv = (const struct stm32_cap_priv_s *)dev;
|
const struct stm32_cap_priv_s *priv = (const struct stm32_cap_priv_s *)dev;
|
||||||
uint16_t regval = 0;
|
uint32_t freqin;
|
||||||
|
int prescaler;
|
||||||
|
|
||||||
if (prescaler == 0)
|
/* Disable Timer? */
|
||||||
|
|
||||||
|
if (freq == 0)
|
||||||
{
|
{
|
||||||
/* Disable Timer */
|
/* Disable Timer */
|
||||||
|
|
||||||
@ -631,6 +633,85 @@ static int stm32_cap_setclock(struct stm32_cap_dev_s *dev,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Get the input clock frequency for this timer. These vary with
|
||||||
|
* different timer clock sources, MCU-specific timer configuration, and
|
||||||
|
* board-specific clock configuration. The correct input clock frequency
|
||||||
|
* must be defined in the board.h header file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
switch (priv->base)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_STM32_TIM1
|
||||||
|
case STM32_TIM1_BASE:
|
||||||
|
freqin = STM32_APB2_TIM1_CLKIN;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_STM32_TIM2
|
||||||
|
case STM32_TIM2_BASE:
|
||||||
|
freqin = STM32_APB1_TIM2_CLKIN;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_STM32_TIM3
|
||||||
|
case STM32_TIM3_BASE:
|
||||||
|
freqin = STM32_APB1_TIM3_CLKIN;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_STM32_TIM4
|
||||||
|
case STM32_TIM4_BASE:
|
||||||
|
freqin = STM32_APB1_TIM4_CLKIN;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_STM32_TIM5
|
||||||
|
case STM32_TIM5_BASE:
|
||||||
|
freqin = STM32_APB1_TIM5_CLKIN;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_STM32_TIM8
|
||||||
|
case STM32_TIM8_BASE:
|
||||||
|
freqin = STM32_APB2_TIM8_CLKIN;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_STM32_TIM9
|
||||||
|
case STM32_TIM9_BASE:
|
||||||
|
freqin = STM32_APB2_TIM9_CLKIN;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_STM32_TIM10
|
||||||
|
case STM32_TIM10_BASE:
|
||||||
|
freqin = STM32_APB2_TIM10_CLKIN;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_STM32_TIM11
|
||||||
|
case STM32_TIM11_BASE:
|
||||||
|
freqin = STM32_APB2_TIM11_CLKIN;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_STM32_TIM12
|
||||||
|
case STM32_TIM12_BASE:
|
||||||
|
freqin = STM32_APB1_TIM12_CLKIN;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_STM32_TIM13
|
||||||
|
case STM32_TIM13_BASE:
|
||||||
|
freqin = STM32_APB1_TIM13_CLKIN;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_STM32_TIM14
|
||||||
|
case STM32_TIM14_BASE:
|
||||||
|
freqin = STM32_APB1_TIM14_CLKIN;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
default:
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Select a pre-scaler value for this timer using the input clock
|
||||||
|
* frequency.
|
||||||
|
*/
|
||||||
|
|
||||||
|
prescaler = freqin / freq;
|
||||||
|
|
||||||
/* We need to decrement value for '1', but only, if we are allowed to
|
/* We need to decrement value for '1', but only, if we are allowed to
|
||||||
* not to cause underflow. Check for overflow.
|
* not to cause underflow. Check for overflow.
|
||||||
*/
|
*/
|
||||||
@ -645,47 +726,6 @@ static int stm32_cap_setclock(struct stm32_cap_dev_s *dev,
|
|||||||
prescaler = 0xffff;
|
prescaler = 0xffff;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (clk)
|
|
||||||
{
|
|
||||||
case STM32_CAP_CLK_INT:
|
|
||||||
regval = GTIM_SMCR_DISAB;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case STM32_CAP_CLK_ENC1:
|
|
||||||
regval = GTIM_SMCR_ENCMD1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case STM32_CAP_CLK_ENC2:
|
|
||||||
regval = GTIM_SMCR_ENCMD2;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case STM32_CAP_CLK_ENC3:
|
|
||||||
regval = GTIM_SMCR_ENCMD3;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case STM32_CAP_CLK_RST:
|
|
||||||
regval = GTIM_SMCR_RESET;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case STM32_CAP_CLK_GAT:
|
|
||||||
regval = GTIM_SMCR_GATED;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case STM32_CAP_CLK_TRG:
|
|
||||||
regval = GTIM_SMCR_TRIGGER;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case STM32_CAP_CLK_EXT:
|
|
||||||
regval = GTIM_SMCR_EXTCLK1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
stm32_modifyreg16(priv, STM32_GTIM_SMCR_OFFSET,
|
|
||||||
GTIM_SMCR_SMS_MASK, regval);
|
|
||||||
|
|
||||||
/* Set Maximum */
|
/* Set Maximum */
|
||||||
|
|
||||||
stm32_putreg32(priv, STM32_BTIM_ARR_OFFSET, max);
|
stm32_putreg32(priv, STM32_BTIM_ARR_OFFSET, max);
|
||||||
@ -714,6 +754,115 @@ static int stm32_cap_setclock(struct stm32_cap_dev_s *dev,
|
|||||||
return prescaler;
|
return prescaler;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: stm32_cap_setsmc
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* set slave mode control register
|
||||||
|
*
|
||||||
|
* Input Parameters:
|
||||||
|
* dev - A pointer of the stm32 capture device structure.
|
||||||
|
* cfg - Slave mode control register configure of timer.
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* Zero on success; a negated errno value on failure.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static int stm32_cap_setsmc(struct stm32_cap_dev_s *dev,
|
||||||
|
stm32_cap_smc_cfg_t cfg)
|
||||||
|
{
|
||||||
|
const struct stm32_cap_priv_s *priv = (const struct stm32_cap_priv_s *)dev;
|
||||||
|
uint16_t regval = 0;
|
||||||
|
uint16_t mask = 0;
|
||||||
|
|
||||||
|
switch (cfg & STM32_CAP_SMS_MASK)
|
||||||
|
{
|
||||||
|
case STM32_CAP_SMS_INT:
|
||||||
|
regval |= GTIM_SMCR_DISAB;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STM32_CAP_SMS_ENC1:
|
||||||
|
regval |= GTIM_SMCR_ENCMD1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STM32_CAP_SMS_ENC2:
|
||||||
|
regval |= GTIM_SMCR_ENCMD2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STM32_CAP_SMS_ENC3:
|
||||||
|
regval |= GTIM_SMCR_ENCMD3;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STM32_CAP_SMS_RST:
|
||||||
|
regval |= GTIM_SMCR_RESET;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STM32_CAP_SMS_GAT:
|
||||||
|
regval |= GTIM_SMCR_GATED;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STM32_CAP_SMS_TRG:
|
||||||
|
regval |= GTIM_SMCR_TRIGGER;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STM32_CAP_SMS_EXT:
|
||||||
|
regval |= GTIM_SMCR_EXTCLK1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (cfg & STM32_CAP_TS_MASK)
|
||||||
|
{
|
||||||
|
case STM32_CAP_TS_ITR0:
|
||||||
|
regval |= GTIM_SMCR_ITR0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STM32_CAP_TS_ITR1:
|
||||||
|
regval |= GTIM_SMCR_ITR1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STM32_CAP_TS_ITR2:
|
||||||
|
regval |= GTIM_SMCR_ITR2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STM32_CAP_TS_ITR3:
|
||||||
|
regval |= GTIM_SMCR_ITR3;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STM32_CAP_TS_TI1FED:
|
||||||
|
regval |= GTIM_SMCR_TI1FED;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STM32_CAP_TS_TI1FP1:
|
||||||
|
regval |= GTIM_SMCR_TI1FP1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STM32_CAP_TS_TI2FP2:
|
||||||
|
regval |= GTIM_SMCR_TI2FP2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STM32_CAP_TS_ETRF:
|
||||||
|
regval |= GTIM_SMCR_ETRF;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cfg & STM32_CAP_MSM_MASK)
|
||||||
|
{
|
||||||
|
regval |= STM32_CAP_MSM_MASK;
|
||||||
|
}
|
||||||
|
|
||||||
|
mask = (STM32_CAP_SMS_MASK | STM32_CAP_TS_MASK | STM32_CAP_MSM_MASK);
|
||||||
|
stm32_modifyreg16(priv, STM32_GTIM_SMCR_OFFSET, mask, regval);
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
static int stm32_cap_setisr(struct stm32_cap_dev_s *dev, xcpt_t handler,
|
static int stm32_cap_setisr(struct stm32_cap_dev_s *dev, xcpt_t handler,
|
||||||
void *arg)
|
void *arg)
|
||||||
{
|
{
|
||||||
@ -1088,6 +1237,7 @@ static uint32_t stm32_cap_getcapture(struct stm32_cap_dev_s *dev,
|
|||||||
|
|
||||||
struct stm32_cap_ops_s stm32_cap_ops =
|
struct stm32_cap_ops_s stm32_cap_ops =
|
||||||
{
|
{
|
||||||
|
.setsmc = &stm32_cap_setsmc,
|
||||||
.setclock = &stm32_cap_setclock,
|
.setclock = &stm32_cap_setclock,
|
||||||
.setchannel = &stm32_cap_setchannel,
|
.setchannel = &stm32_cap_setchannel,
|
||||||
.getcapture = &stm32_cap_getcapture,
|
.getcapture = &stm32_cap_getcapture,
|
||||||
|
@ -37,7 +37,8 @@
|
|||||||
|
|
||||||
/* Helpers ******************************************************************/
|
/* Helpers ******************************************************************/
|
||||||
|
|
||||||
#define STM32_CAP_SETCLOCK(d,clk_src,psc,max) ((d)->ops->setclock(d,clk_src,psc,max))
|
#define STM32_CAP_SETSMC(d,cfg) ((d)->ops->setsmc(d,cfg))
|
||||||
|
#define STM32_CAP_SETCLOCK(d,clk,max) ((d)->ops->setclock(d,clk,max))
|
||||||
#define STM32_CAP_SETCHANNEL(d,ch,cfg) ((d)->ops->setchannel(d,ch,cfg))
|
#define STM32_CAP_SETCHANNEL(d,ch,cfg) ((d)->ops->setchannel(d,ch,cfg))
|
||||||
#define STM32_CAP_GETCAPTURE(d,ch) ((d)->ops->getcapture(d,ch))
|
#define STM32_CAP_GETCAPTURE(d,ch) ((d)->ops->getcapture(d,ch))
|
||||||
#define STM32_CAP_SETISR(d,hnd,arg) ((d)->ops->setisr(d,hnd,arg))
|
#define STM32_CAP_SETISR(d,hnd,arg) ((d)->ops->setisr(d,hnd,arg))
|
||||||
@ -122,19 +123,38 @@ typedef enum
|
|||||||
STM32_CAP_EDGE_BOTH = (3 << 8),
|
STM32_CAP_EDGE_BOTH = (3 << 8),
|
||||||
} stm32_cap_ch_cfg_t;
|
} stm32_cap_ch_cfg_t;
|
||||||
|
|
||||||
/* Capture clock sources */
|
/* Slave mode control configure */
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
STM32_CAP_CLK_INT = 0,
|
/* Slave mode selection */
|
||||||
STM32_CAP_CLK_ENC1,
|
|
||||||
STM32_CAP_CLK_ENC2,
|
STM32_CAP_SMS_MASK = (7 << GTIM_SMCR_SMS_SHIFT),
|
||||||
STM32_CAP_CLK_ENC3,
|
STM32_CAP_SMS_INT = (0 << GTIM_SMCR_SMS_SHIFT),
|
||||||
STM32_CAP_CLK_RST,
|
STM32_CAP_SMS_ENC1 = (1 << GTIM_SMCR_SMS_SHIFT),
|
||||||
STM32_CAP_CLK_GAT,
|
STM32_CAP_SMS_ENC2 = (2 << GTIM_SMCR_SMS_SHIFT),
|
||||||
STM32_CAP_CLK_TRG,
|
STM32_CAP_SMS_ENC3 = (3 << GTIM_SMCR_SMS_SHIFT),
|
||||||
STM32_CAP_CLK_EXT,
|
STM32_CAP_SMS_RST = (4 << GTIM_SMCR_SMS_SHIFT),
|
||||||
} stm32_cap_clk_t;
|
STM32_CAP_SMS_GAT = (5 << GTIM_SMCR_SMS_SHIFT),
|
||||||
|
STM32_CAP_SMS_TRG = (6 << GTIM_SMCR_SMS_SHIFT),
|
||||||
|
STM32_CAP_SMS_EXT = (7 << GTIM_SMCR_SMS_SHIFT),
|
||||||
|
|
||||||
|
/* Trigger selection */
|
||||||
|
|
||||||
|
STM32_CAP_TS_MASK = (7 << GTIM_SMCR_TS_SHIFT),
|
||||||
|
STM32_CAP_TS_ITR0 = (0 << GTIM_SMCR_TS_SHIFT),
|
||||||
|
STM32_CAP_TS_ITR1 = (1 << GTIM_SMCR_TS_SHIFT),
|
||||||
|
STM32_CAP_TS_ITR2 = (2 << GTIM_SMCR_TS_SHIFT),
|
||||||
|
STM32_CAP_TS_ITR3 = (3 << GTIM_SMCR_TS_SHIFT),
|
||||||
|
STM32_CAP_TS_TI1FED = (4 << GTIM_SMCR_TS_SHIFT),
|
||||||
|
STM32_CAP_TS_TI1FP1 = (5 << GTIM_SMCR_TS_SHIFT),
|
||||||
|
STM32_CAP_TS_TI2FP2 = (6 << GTIM_SMCR_TS_SHIFT),
|
||||||
|
STM32_CAP_TS_ETRF = (7 << GTIM_SMCR_TS_SHIFT),
|
||||||
|
|
||||||
|
/* Master/Slave mode seting */
|
||||||
|
|
||||||
|
STM32_CAP_MSM_MASK = (1 << 7)
|
||||||
|
} stm32_cap_smc_cfg_t;
|
||||||
|
|
||||||
/* Capture flags */
|
/* Capture flags */
|
||||||
|
|
||||||
@ -163,8 +183,9 @@ typedef enum
|
|||||||
|
|
||||||
struct stm32_cap_ops_s
|
struct stm32_cap_ops_s
|
||||||
{
|
{
|
||||||
int (*setclock)(struct stm32_cap_dev_s *dev, stm32_cap_clk_t clk,
|
int (*setsmc)(struct stm32_cap_dev_s *dev, stm32_cap_smc_cfg_t cfg);
|
||||||
uint32_t prescaler, uint32_t max);
|
int (*setclock)(struct stm32_cap_dev_s *dev, uint32_t freq,
|
||||||
|
uint32_t max);
|
||||||
int (*setchannel)(struct stm32_cap_dev_s *dev, uint8_t channel,
|
int (*setchannel)(struct stm32_cap_dev_s *dev, uint8_t channel,
|
||||||
stm32_cap_ch_cfg_t cfg);
|
stm32_cap_ch_cfg_t cfg);
|
||||||
uint32_t (*getcapture)(struct stm32_cap_dev_s *dev, uint8_t channel);
|
uint32_t (*getcapture)(struct stm32_cap_dev_s *dev, uint8_t channel);
|
||||||
@ -187,6 +208,27 @@ struct stm32_cap_dev_s *stm32_cap_init(int timer);
|
|||||||
|
|
||||||
int stm32_cap_deinit(struct stm32_cap_dev_s *dev);
|
int stm32_cap_deinit(struct stm32_cap_dev_s *dev);
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: stm32_cap_initialize
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Initialize one timer for use with the upper_level capture driver.
|
||||||
|
*
|
||||||
|
* Input Parameters:
|
||||||
|
* timer - A number identifying the timer use. The number of valid timer
|
||||||
|
* IDs varies with the STM32 MCU and MCU family but is somewhere in
|
||||||
|
* the range of {1,..,5 8,...,14}.
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* On success, a pointer to the STM32 lower half capture driver returned.
|
||||||
|
* NULL is returned on any failure.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifdef CONFIG_CAPTURE
|
||||||
|
struct cap_lowerhalf_s *stm32_cap_initialize(int timer);
|
||||||
|
#endif
|
||||||
|
|
||||||
#undef EXTERN
|
#undef EXTERN
|
||||||
#if defined(__cplusplus)
|
#if defined(__cplusplus)
|
||||||
}
|
}
|
||||||
|
575
arch/arm/src/stm32/stm32_capture_lowerhalf.c
Normal file
575
arch/arm/src/stm32/stm32_capture_lowerhalf.c
Normal file
@ -0,0 +1,575 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* arch/arm/src/stm32/stm32_capture_lowerhalf.c
|
||||||
|
*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership. The
|
||||||
|
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance with the
|
||||||
|
* License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include <nuttx/irq.h>
|
||||||
|
#include <nuttx/timers/capture.h>
|
||||||
|
|
||||||
|
#include <arch/board/board.h>
|
||||||
|
|
||||||
|
#include "stm32_capture.h"
|
||||||
|
|
||||||
|
#if defined(CONFIG_STM32_CAP)
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Pre-processor Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#define STM32_TIM1_RES 16
|
||||||
|
#if defined(CONFIG_STM32_STM32L15XX) || defined(CONFIG_STM32_STM32F10XX)
|
||||||
|
# define STM32_TIM2_RES 16
|
||||||
|
#else
|
||||||
|
# define STM32_TIM2_RES 32
|
||||||
|
#endif
|
||||||
|
#define STM32_TIM3_RES 16
|
||||||
|
#define STM32_TIM4_RES 16
|
||||||
|
#if defined(CONFIG_STM32_STM32F10XX) || defined(CONFIG_STM32_STM32F30XX)
|
||||||
|
# define STM32_TIM5_RES 16
|
||||||
|
#else
|
||||||
|
# define STM32_TIM5_RES 32
|
||||||
|
#endif
|
||||||
|
#define STM32_TIM8_RES 16
|
||||||
|
#define STM32_TIM9_RES 16
|
||||||
|
#define STM32_TIM10_RES 16
|
||||||
|
#define STM32_TIM11_RES 16
|
||||||
|
#define STM32_TIM12_RES 16
|
||||||
|
#define STM32_TIM13_RES 16
|
||||||
|
#define STM32_TIM14_RES 16
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Types
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* This structure provides the private representation of the "lower-half"
|
||||||
|
* driver state structure. This structure must be cast-compatible with the
|
||||||
|
* cap_lowerhalf_s structure.
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct stm32_lowerhalf_s
|
||||||
|
{
|
||||||
|
const struct cap_ops_s *ops; /* Lower half operations */
|
||||||
|
struct stm32_cap_dev_s *cap; /* stm32 capture driver */
|
||||||
|
bool started; /* True: Timer has been started */
|
||||||
|
const uint8_t resolution; /* Number of bits in the timer */
|
||||||
|
uint8_t channel; /* pwm input channel */
|
||||||
|
uint32_t clock; /* Timer clock frequence */
|
||||||
|
uint8_t duty; /* Result pwm frequence */
|
||||||
|
uint32_t freq; /* Result pwm frequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Function Prototypes
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static int stm32_cap_handler(int irq, void * context, void * arg);
|
||||||
|
|
||||||
|
/* "Lower half" driver methods **********************************************/
|
||||||
|
|
||||||
|
static int stm32_start(struct cap_lowerhalf_s *lower);
|
||||||
|
static int stm32_stop(struct cap_lowerhalf_s *lower);
|
||||||
|
static int stm32_getduty(struct cap_lowerhalf_s *lower, uint8_t *duty);
|
||||||
|
static int stm32_getfreq(struct cap_lowerhalf_s *lower, uint32_t *freq);
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Data
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* "Lower half" driver methods */
|
||||||
|
|
||||||
|
static const struct cap_ops_s g_cap_ops =
|
||||||
|
{
|
||||||
|
.start = stm32_start,
|
||||||
|
.stop = stm32_stop,
|
||||||
|
.getduty = stm32_getduty,
|
||||||
|
.getfreq = stm32_getfreq,
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef CONFIG_STM32_TIM1_CAP
|
||||||
|
static struct stm32_lowerhalf_s g_cap1_lowerhalf =
|
||||||
|
{
|
||||||
|
.ops = &g_cap_ops,
|
||||||
|
.resolution = STM32_TIM1_RES,
|
||||||
|
.channel = CONFIG_STM32_TIM1_CHANNEL,
|
||||||
|
.clock = CONFIG_STM32_TIM1_CLOCK,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_STM32_TIM2_CAP
|
||||||
|
static struct stm32_lowerhalf_s g_cap2_lowerhalf =
|
||||||
|
{
|
||||||
|
.ops = &g_cap_ops,
|
||||||
|
.resolution = STM32_TIM2_RES,
|
||||||
|
.channel = CONFIG_STM32_TIM2_CHANNEL,
|
||||||
|
.clock = CONFIG_STM32_TIM2_CLOCK,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_STM32_TIM3_CAP
|
||||||
|
static struct stm32_lowerhalf_s g_cap3_lowerhalf =
|
||||||
|
{
|
||||||
|
.ops = &g_cap_ops,
|
||||||
|
.resolution = STM32_TIM3_RES,
|
||||||
|
.channel = CONFIG_STM32_TIM3_CHANNEL,
|
||||||
|
.clock = CONFIG_STM32_TIM3_CLOCK,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_STM32_TIM4_CAP
|
||||||
|
static struct stm32_lowerhalf_s g_cap4_lowerhalf =
|
||||||
|
{
|
||||||
|
.ops = &g_cap_ops,
|
||||||
|
.resolution = STM32_TIM4_RES,
|
||||||
|
.channel = CONFIG_STM32_TIM4_CHANNEL,
|
||||||
|
.clock = CONFIG_STM32_TIM4_CLOCK,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_STM32_TIM5_CAP
|
||||||
|
static struct stm32_lowerhalf_s g_cap5_lowerhalf =
|
||||||
|
{
|
||||||
|
.ops = &g_cap_ops,
|
||||||
|
.resolution = STM32_TIM5_RES,
|
||||||
|
.channel = CONFIG_STM32_TIM5_CHANNEL,
|
||||||
|
.clock = CONFIG_STM32_TIM5_CLOCK,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_STM32_TIM8_CAP
|
||||||
|
static struct stm32_lowerhalf_s g_cap8_lowerhalf =
|
||||||
|
{
|
||||||
|
.ops = &g_cap_ops,
|
||||||
|
.resolution = STM32_TIM8_RES,
|
||||||
|
.channel = CONFIG_STM32_TIM8_CHANNEL,
|
||||||
|
.clock = CONFIG_STM32_TIM8_CLOCK,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_STM32_TIM9_CAP
|
||||||
|
static struct stm32_lowerhalf_s g_cap9_lowerhalf =
|
||||||
|
{
|
||||||
|
.ops = &g_cap_ops,
|
||||||
|
.resolution = STM32_TIM9_RES,
|
||||||
|
.channel = CONFIG_STM32_TIM9_CHANNEL,
|
||||||
|
.clock = CONFIG_STM32_TIM9_CLOCK,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_STM32_TIM10_CAP
|
||||||
|
static struct stm32_lowerhalf_s g_cap10_lowerhalf =
|
||||||
|
{
|
||||||
|
.ops = &g_cap_ops,
|
||||||
|
.resolution = STM32_TIM10_RES,
|
||||||
|
.channel = CONFIG_STM32_TIM10_CHANNEL,
|
||||||
|
.clock = CONFIG_STM32_TIM10_CLOCK,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_STM32_TIM11_CAP
|
||||||
|
static struct stm32_lowerhalf_s g_cap11_lowerhalf =
|
||||||
|
{
|
||||||
|
.ops = &g_cap_ops,
|
||||||
|
.resolution = STM32_TIM11_RES,
|
||||||
|
.channel = CONFIG_STM32_TIM11_CHANNEL,
|
||||||
|
.clock = CONFIG_STM32_TIM11_CLOCK,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_STM32_TIM12_CAP
|
||||||
|
static struct stm32_lowerhalf_s g_cap12_lowerhalf =
|
||||||
|
{
|
||||||
|
.ops = &g_cap_ops,
|
||||||
|
.resolution = STM32_TIM12_RES,
|
||||||
|
.channel = CONFIG_STM32_TIM12_CHANNEL,
|
||||||
|
.clock = CONFIG_STM32_TIM12_CLOCK,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_STM32_TIM13_CAP
|
||||||
|
static struct stm32_lowerhalf_s g_cap13_lowerhalf =
|
||||||
|
{
|
||||||
|
.ops = &g_cap_ops,
|
||||||
|
.resolution = STM32_TIM13_RES,
|
||||||
|
.channel = CONFIG_STM32_TIM13_CHANNEL,
|
||||||
|
.clock = CONFIG_STM32_TIM13_CLOCK,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_STM32_TIM14_CAP
|
||||||
|
static struct stm32_lowerhalf_s g_cap14_lowerhalf =
|
||||||
|
{
|
||||||
|
.ops = &g_cap_ops,
|
||||||
|
.resolution = STM32_TIM14_RES,
|
||||||
|
.channel = CONFIG_STM32_TIM14_CHANNEL,
|
||||||
|
.clock = CONFIG_STM32_TIM14_CLOCK,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: stm32_cap_handler
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* timer interrupt handler
|
||||||
|
*
|
||||||
|
* Input Parameters:
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static int stm32_cap_handler(int irq, void * context, void * arg)
|
||||||
|
{
|
||||||
|
struct stm32_lowerhalf_s *lower = (struct stm32_lowerhalf_s *) arg;
|
||||||
|
uint8_t ch = 0x3 & lower->channel;
|
||||||
|
int period = 0;
|
||||||
|
int flags = 0;
|
||||||
|
|
||||||
|
flags = (int)STM32_CAP_GETFLAGS(lower->cap) ;
|
||||||
|
|
||||||
|
STM32_CAP_ACKFLAGS(lower->cap, flags);
|
||||||
|
|
||||||
|
period = STM32_CAP_GETCAPTURE(lower->cap, ch);
|
||||||
|
|
||||||
|
if (period != 0)
|
||||||
|
{
|
||||||
|
lower->duty = (100 * STM32_CAP_GETCAPTURE(lower->cap, 0x3 & (~ch))) /
|
||||||
|
period;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
lower->duty = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
lower->freq = lower->clock / period;
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: stm32_start
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Start the timer, resetting the time to the current timeout,
|
||||||
|
*
|
||||||
|
* Input Parameters:
|
||||||
|
* lower - A pointer the publicly visible representation of the
|
||||||
|
* "lower-half" driver state structure.
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* Zero on success; a negated errno value on failure.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static int stm32_start(struct cap_lowerhalf_s *lower)
|
||||||
|
{
|
||||||
|
struct stm32_lowerhalf_s *priv = (struct stm32_lowerhalf_s *)lower;
|
||||||
|
int flags = 0;
|
||||||
|
uint32_t maxtimeout = (1 << priv->resolution) - 1;
|
||||||
|
|
||||||
|
if (priv->started)
|
||||||
|
{
|
||||||
|
/* Return EBUSY to indicate that the timer was already running */
|
||||||
|
|
||||||
|
return -EBUSY;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (priv->channel)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
STM32_CAP_SETSMC(priv->cap, STM32_CAP_SMS_RST |
|
||||||
|
STM32_CAP_TS_TI1FP1 |
|
||||||
|
STM32_CAP_MSM_MASK);
|
||||||
|
|
||||||
|
STM32_CAP_SETCLOCK(priv->cap, priv->clock, maxtimeout);
|
||||||
|
|
||||||
|
STM32_CAP_SETCHANNEL(priv->cap, 1,
|
||||||
|
STM32_CAP_EDGE_RISING |
|
||||||
|
STM32_CAP_MAPPED_TI1);
|
||||||
|
STM32_CAP_SETCHANNEL(priv->cap, 2,
|
||||||
|
STM32_CAP_EDGE_FALLING |
|
||||||
|
STM32_CAP_MAPPED_TI2);
|
||||||
|
|
||||||
|
flags = (int)STM32_CAP_GETFLAGS(priv->cap);
|
||||||
|
STM32_CAP_ACKFLAGS(priv->cap, flags);
|
||||||
|
|
||||||
|
STM32_CAP_SETISR(priv->cap, stm32_cap_handler, priv);
|
||||||
|
STM32_CAP_ENABLEINT(priv->cap, STM32_CAP_FLAG_IRQ_CH_1, true);
|
||||||
|
|
||||||
|
priv->started = true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
STM32_CAP_SETSMC(priv->cap, STM32_CAP_SMS_RST |
|
||||||
|
STM32_CAP_TS_TI2FP2 |
|
||||||
|
STM32_CAP_MSM_MASK);
|
||||||
|
|
||||||
|
STM32_CAP_SETCLOCK(priv->cap, priv->clock, maxtimeout);
|
||||||
|
|
||||||
|
STM32_CAP_SETCHANNEL(priv->cap, 2,
|
||||||
|
STM32_CAP_EDGE_RISING |
|
||||||
|
STM32_CAP_MAPPED_TI1);
|
||||||
|
STM32_CAP_SETCHANNEL(priv->cap, 1,
|
||||||
|
STM32_CAP_EDGE_FALLING |
|
||||||
|
STM32_CAP_MAPPED_TI2);
|
||||||
|
|
||||||
|
flags = (int)STM32_CAP_GETFLAGS(priv->cap);
|
||||||
|
STM32_CAP_ACKFLAGS(priv->cap, flags);
|
||||||
|
|
||||||
|
STM32_CAP_SETISR(priv->cap, stm32_cap_handler, priv);
|
||||||
|
STM32_CAP_ENABLEINT(priv->cap, STM32_CAP_FLAG_IRQ_CH_2, true);
|
||||||
|
|
||||||
|
priv->started = true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: stm32_stop
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Stop the capture
|
||||||
|
*
|
||||||
|
* Input Parameters:
|
||||||
|
* lower - A pointer the publicly visible representation of the
|
||||||
|
* "lower-half" driver state structure.
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* Zero on success; a negated errno value on failure.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static int stm32_stop(struct cap_lowerhalf_s *lower)
|
||||||
|
{
|
||||||
|
struct stm32_lowerhalf_s *priv = (struct stm32_lowerhalf_s *)lower;
|
||||||
|
|
||||||
|
if (priv->started)
|
||||||
|
{
|
||||||
|
STM32_CAP_SETCHANNEL(priv->cap, STM32_CAP_FLAG_IRQ_COUNTER,
|
||||||
|
STM32_CAP_EDGE_DISABLED);
|
||||||
|
switch (priv->channel)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
STM32_CAP_ENABLEINT(priv->cap, STM32_CAP_FLAG_IRQ_CH_1, false);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
STM32_CAP_ENABLEINT(priv->cap, STM32_CAP_FLAG_IRQ_CH_2, false);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
STM32_CAP_SETISR(priv->cap, NULL, NULL);
|
||||||
|
priv->started = false;
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return ENODEV to indicate that the timer was not running */
|
||||||
|
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: stm32_getduty
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* get result duty
|
||||||
|
*
|
||||||
|
* Input Parameters:
|
||||||
|
* lower - A pointer the publicly visible representation of the
|
||||||
|
* "lower-half" driver state structure.
|
||||||
|
* duty - DutyCycle * 100.
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* Zero on success; a negated errno value on failure.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static int stm32_getduty(struct cap_lowerhalf_s *lower, uint8_t *duty)
|
||||||
|
{
|
||||||
|
struct stm32_lowerhalf_s *priv = (struct stm32_lowerhalf_s *)lower;
|
||||||
|
|
||||||
|
irqstate_t flags = enter_critical_section();
|
||||||
|
|
||||||
|
*duty = priv->duty;
|
||||||
|
|
||||||
|
leave_critical_section(flags);
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: stm32_getfreq
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* get result freq
|
||||||
|
*
|
||||||
|
* Input Parameters:
|
||||||
|
* lower - A pointer the publicly visible representation of the
|
||||||
|
* "lower-half" driver state structure.
|
||||||
|
* freq - Frequence in Hz .
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* Zero on success; a negated errno value on failure.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static int stm32_getfreq(struct cap_lowerhalf_s *lower, uint32_t *freq)
|
||||||
|
{
|
||||||
|
struct stm32_lowerhalf_s *priv = (struct stm32_lowerhalf_s *)lower;
|
||||||
|
|
||||||
|
irqstate_t flags = enter_critical_section();
|
||||||
|
|
||||||
|
*freq = priv->freq;
|
||||||
|
|
||||||
|
leave_critical_section(flags);
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: stm32_cap_initialize
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Initialize one timer for use with the upper_level capture driver.
|
||||||
|
*
|
||||||
|
* Input Parameters:
|
||||||
|
* timer - A number identifying the timer use. The number of valid timer
|
||||||
|
* IDs varies with the STM32 MCU and MCU family but is somewhere in
|
||||||
|
* the range of {1,..,5 8,...,14}.
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* On success, a pointer to the STM32 lower half capture driver returned.
|
||||||
|
* NULL is returned on any failure.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
struct cap_lowerhalf_s *stm32_cap_initialize(int timer)
|
||||||
|
{
|
||||||
|
struct stm32_lowerhalf_s *lower = NULL;
|
||||||
|
|
||||||
|
switch (timer)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_STM32_TIM1_CAP
|
||||||
|
case 1:
|
||||||
|
lower = &g_cap1_lowerhalf;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_STM32_TIM2_CAP
|
||||||
|
case 2:
|
||||||
|
lower = &g_cap2_lowerhalf;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_STM32_TIM3_CAP
|
||||||
|
case 3:
|
||||||
|
lower = &g_cap3_lowerhalf;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_STM32_TIM4_CAP
|
||||||
|
case 4:
|
||||||
|
lower = &g_cap4_lowerhalf;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_STM32_TIM5_CAP
|
||||||
|
case 5:
|
||||||
|
lower = &g_cap5_lowerhalf;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_STM32_TIM6_CAP
|
||||||
|
case 6:
|
||||||
|
lower = &g_cap6_lowerhalf;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_STM32_TIM9_CAP
|
||||||
|
case 9:
|
||||||
|
lower = &g_cap9_lowerhalf;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_STM32_TIM10_CAP
|
||||||
|
case 10:
|
||||||
|
lower = &g_cap10_lowerhalf;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_STM32_TIM11_CAP
|
||||||
|
case 11:
|
||||||
|
lower = &g_cap11_lowerhalf;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_STM32_TIM12_CAP
|
||||||
|
case 12:
|
||||||
|
lower = &g_cap12_lowerhalf;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_STM32_TIM13_CAP
|
||||||
|
case 13:
|
||||||
|
lower = &g_cap13_lowerhalf;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_STM32_TIM14_CAP
|
||||||
|
case 14:
|
||||||
|
lower = &g_cap14_lowerhalf;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
lower = NULL;
|
||||||
|
goto errout;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Initialize the elements of lower half state structure */
|
||||||
|
|
||||||
|
lower->started = false;
|
||||||
|
lower->cap = stm32_cap_init(timer);
|
||||||
|
|
||||||
|
if (lower->cap == NULL)
|
||||||
|
{
|
||||||
|
lower = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
errout:
|
||||||
|
return (struct cap_lowerhalf_s *)lower;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CONFIG_STM32_CAP */
|
@ -71,23 +71,28 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#if defined(CONFIG_STM32_TIM1_PWM) || defined (CONFIG_STM32_TIM1_ADC) || \
|
#if defined(CONFIG_STM32_TIM1_PWM) || defined (CONFIG_STM32_TIM1_ADC) || \
|
||||||
defined(CONFIG_STM32_TIM1_DAC) || defined(CONFIG_STM32_TIM1_QE)
|
defined(CONFIG_STM32_TIM1_DAC) || defined(CONFIG_STM32_TIM1_QE) || \
|
||||||
|
defined(CONFIG_STM32_TIM1_CAP)
|
||||||
# undef CONFIG_STM32_TIM1
|
# undef CONFIG_STM32_TIM1
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_STM32_TIM2_PWM) || defined (CONFIG_STM32_TIM2_ADC) || \
|
#if defined(CONFIG_STM32_TIM2_PWM) || defined (CONFIG_STM32_TIM2_ADC) || \
|
||||||
defined(CONFIG_STM32_TIM2_DAC) || defined(CONFIG_STM32_TIM2_QE)
|
defined(CONFIG_STM32_TIM2_DAC) || defined(CONFIG_STM32_TIM2_QE) || \
|
||||||
|
defined(CONFIG_STM32_TIM2_CAP)
|
||||||
# undef CONFIG_STM32_TIM2
|
# undef CONFIG_STM32_TIM2
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_STM32_TIM3_PWM) || defined (CONFIG_STM32_TIM3_ADC) || \
|
#if defined(CONFIG_STM32_TIM3_PWM) || defined (CONFIG_STM32_TIM3_ADC) || \
|
||||||
defined(CONFIG_STM32_TIM3_DAC) || defined(CONFIG_STM32_TIM3_QE)
|
defined(CONFIG_STM32_TIM3_DAC) || defined(CONFIG_STM32_TIM3_QE) || \
|
||||||
|
defined(CONFIG_STM32_TIM3_CAP)
|
||||||
# undef CONFIG_STM32_TIM3
|
# undef CONFIG_STM32_TIM3
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_STM32_TIM4_PWM) || defined (CONFIG_STM32_TIM4_ADC) || \
|
#if defined(CONFIG_STM32_TIM4_PWM) || defined (CONFIG_STM32_TIM4_ADC) || \
|
||||||
defined(CONFIG_STM32_TIM4_DAC) || defined(CONFIG_STM32_TIM4_QE)
|
defined(CONFIG_STM32_TIM4_DAC) || defined(CONFIG_STM32_TIM4_QE) || \
|
||||||
|
defined(CONFIG_STM32_TIM4_CAP)
|
||||||
# undef CONFIG_STM32_TIM4
|
# undef CONFIG_STM32_TIM4
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_STM32_TIM5_PWM) || defined (CONFIG_STM32_TIM5_ADC) || \
|
#if defined(CONFIG_STM32_TIM5_PWM) || defined (CONFIG_STM32_TIM5_ADC) || \
|
||||||
defined(CONFIG_STM32_TIM5_DAC) || defined(CONFIG_STM32_TIM5_QE)
|
defined(CONFIG_STM32_TIM5_DAC) || defined(CONFIG_STM32_TIM5_QE) || \
|
||||||
|
defined(CONFIG_STM32_TIM5_CAP)
|
||||||
# undef CONFIG_STM32_TIM5
|
# undef CONFIG_STM32_TIM5
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_STM32_TIM6_PWM) || defined (CONFIG_STM32_TIM6_ADC) || \
|
#if defined(CONFIG_STM32_TIM6_PWM) || defined (CONFIG_STM32_TIM6_ADC) || \
|
||||||
@ -99,31 +104,38 @@
|
|||||||
# undef CONFIG_STM32_TIM7
|
# undef CONFIG_STM32_TIM7
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_STM32_TIM8_PWM) || defined (CONFIG_STM32_TIM8_ADC) || \
|
#if defined(CONFIG_STM32_TIM8_PWM) || defined (CONFIG_STM32_TIM8_ADC) || \
|
||||||
defined(CONFIG_STM32_TIM8_DAC) || defined(CONFIG_STM32_TIM8_QE)
|
defined(CONFIG_STM32_TIM8_DAC) || defined(CONFIG_STM32_TIM8_QE) || \
|
||||||
|
defined(CONFIG_STM32_TIM8_CAP)
|
||||||
# undef CONFIG_STM32_TIM8
|
# undef CONFIG_STM32_TIM8
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_STM32_TIM9_PWM) || defined (CONFIG_STM32_TIM9_ADC) || \
|
#if defined(CONFIG_STM32_TIM9_PWM) || defined (CONFIG_STM32_TIM9_ADC) || \
|
||||||
defined(CONFIG_STM32_TIM9_DAC) || defined(CONFIG_STM32_TIM9_QE)
|
defined(CONFIG_STM32_TIM9_DAC) || defined(CONFIG_STM32_TIM9_QE) || \
|
||||||
|
defined(CONFIG_STM32_TIM9_CAP)
|
||||||
# undef CONFIG_STM32_TIM9
|
# undef CONFIG_STM32_TIM9
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_STM32_TIM10_PWM) || defined (CONFIG_STM32_TIM10_ADC) || \
|
#if defined(CONFIG_STM32_TIM10_PWM) || defined (CONFIG_STM32_TIM10_ADC) || \
|
||||||
defined(CONFIG_STM32_TIM10_DAC) || defined(CONFIG_STM32_TIM10_QE)
|
defined(CONFIG_STM32_TIM10_DAC) || defined(CONFIG_STM32_TIM10_QE) || \
|
||||||
|
defined(CONFIG_STM32_TIM10_CAP)
|
||||||
# undef CONFIG_STM32_TIM10
|
# undef CONFIG_STM32_TIM10
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_STM32_TIM11_PWM) || defined (CONFIG_STM32_TIM11_ADC) || \
|
#if defined(CONFIG_STM32_TIM11_PWM) || defined (CONFIG_STM32_TIM11_ADC) || \
|
||||||
defined(CONFIG_STM32_TIM11_DAC) || defined(CONFIG_STM32_TIM11_QE)
|
defined(CONFIG_STM32_TIM11_DAC) || defined(CONFIG_STM32_TIM11_QE) || \
|
||||||
|
defined(CONFIG_STM32_TIM11_CAP)
|
||||||
# undef CONFIG_STM32_TIM11
|
# undef CONFIG_STM32_TIM11
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_STM32_TIM12_PWM) || defined (CONFIG_STM32_TIM12_ADC) || \
|
#if defined(CONFIG_STM32_TIM12_PWM) || defined (CONFIG_STM32_TIM12_ADC) || \
|
||||||
defined(CONFIG_STM32_TIM12_DAC) || defined(CONFIG_STM32_TIM12_QE)
|
defined(CONFIG_STM32_TIM12_DAC) || defined(CONFIG_STM32_TIM12_QE) || \
|
||||||
|
defined(CONFIG_STM32_TIM12_CAP)
|
||||||
# undef CONFIG_STM32_TIM12
|
# undef CONFIG_STM32_TIM12
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_STM32_TIM13_PWM) || defined (CONFIG_STM32_TIM13_ADC) || \
|
#if defined(CONFIG_STM32_TIM13_PWM) || defined (CONFIG_STM32_TIM13_ADC) || \
|
||||||
defined(CONFIG_STM32_TIM13_DAC) || defined(CONFIG_STM32_TIM13_QE)
|
defined(CONFIG_STM32_TIM13_DAC) || defined(CONFIG_STM32_TIM13_QE) || \
|
||||||
|
defined(CONFIG_STM32_TIM13_CAP)
|
||||||
# undef CONFIG_STM32_TIM13
|
# undef CONFIG_STM32_TIM13
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_STM32_TIM14_PWM) || defined (CONFIG_STM32_TIM14_ADC) || \
|
#if defined(CONFIG_STM32_TIM14_PWM) || defined (CONFIG_STM32_TIM14_ADC) || \
|
||||||
defined(CONFIG_STM32_TIM14_DAC) || defined(CONFIG_STM32_TIM14_QE)
|
defined(CONFIG_STM32_TIM14_DAC) || defined(CONFIG_STM32_TIM14_QE) || \
|
||||||
|
defined(CONFIG_STM32_TIM14_CAP)
|
||||||
# undef CONFIG_STM32_TIM14
|
# undef CONFIG_STM32_TIM14
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_STM32_TIM15_PWM) || defined (CONFIG_STM32_TIM15_ADC) || \
|
#if defined(CONFIG_STM32_TIM15_PWM) || defined (CONFIG_STM32_TIM15_ADC) || \
|
||||||
|
Loading…
Reference in New Issue
Block a user