diff --git a/.config b/.config index 68b28ab..b0a38e9 100644 --- a/.config +++ b/.config @@ -150,7 +150,8 @@ CONFIG_RT_USING_WDT=y # CONFIG_RT_USING_TOUCH is not set # CONFIG_RT_USING_HWCRYPTO is not set # CONFIG_RT_USING_PULSE_ENCODER is not set -# CONFIG_RT_USING_INPUT_CAPTURE is not set +CONFIG_RT_USING_INPUT_CAPTURE=y +CONFIG_RT_INPUT_CAPTURE_RB_SIZE=100 # CONFIG_RT_USING_WIFI is not set # @@ -1051,6 +1052,17 @@ CONFIG_BSP_USING_PWM4_CH1=y CONFIG_BSP_USING_PWM4_CH2=y CONFIG_BSP_USING_PWM4_CH3=y CONFIG_BSP_USING_PWM4_CH4=y +CONFIG_BSP_USING_CAPTURE=y +CONFIG_BSP_USING_CAPTURE1=y +CONFIG_BSP_USING_CAPTURE1_CH1=y +CONFIG_BSP_USING_CAPTURE1_CH2=y +# CONFIG_BSP_USING_CAPTURE1_CH3 is not set +# CONFIG_BSP_USING_CAPTURE1_CH4 is not set +CONFIG_BSP_USING_CAPTURE2=y +# CONFIG_BSP_USING_CAPTURE2_CH1 is not set +# CONFIG_BSP_USING_CAPTURE2_CH2 is not set +CONFIG_BSP_USING_CAPTURE2_CH3=y +CONFIG_BSP_USING_CAPTURE2_CH4=y CONFIG_BSP_USING_ADC=y CONFIG_BSP_USING_ADC1=y # CONFIG_BSP_USING_ONCHIP_RTC is not set diff --git a/board/CubeMX_Config/CubeMX_Config.ioc b/board/CubeMX_Config/CubeMX_Config.ioc index 7997be3..ae35ea5 100644 --- a/board/CubeMX_Config/CubeMX_Config.ioc +++ b/board/CubeMX_Config/CubeMX_Config.ioc @@ -74,51 +74,49 @@ Mcu.Pin24=PE8 Mcu.Pin25=PE9 Mcu.Pin26=PE11 Mcu.Pin27=PE12 -Mcu.Pin28=PE13 -Mcu.Pin29=PE14 +Mcu.Pin28=PB10 +Mcu.Pin29=PB12 Mcu.Pin3=PE5 -Mcu.Pin30=PB10 -Mcu.Pin31=PB12 -Mcu.Pin32=PB13 -Mcu.Pin33=PB14 -Mcu.Pin34=PB15 -Mcu.Pin35=PD14 -Mcu.Pin36=PD15 -Mcu.Pin37=PC6 -Mcu.Pin38=PC7 -Mcu.Pin39=PC9 +Mcu.Pin30=PB13 +Mcu.Pin31=PB14 +Mcu.Pin32=PB15 +Mcu.Pin33=PD14 +Mcu.Pin34=PD15 +Mcu.Pin35=PC6 +Mcu.Pin36=PC7 +Mcu.Pin37=PC9 +Mcu.Pin38=PA8 +Mcu.Pin39=PA9 Mcu.Pin4=PE6 -Mcu.Pin40=PA8 -Mcu.Pin41=PA9 -Mcu.Pin42=PA10 -Mcu.Pin43=PA11 -Mcu.Pin44=PA12 -Mcu.Pin45=PA13 -Mcu.Pin46=PA14 -Mcu.Pin47=PC10 -Mcu.Pin48=PC11 -Mcu.Pin49=PC12 +Mcu.Pin40=PA10 +Mcu.Pin41=PA11 +Mcu.Pin42=PA12 +Mcu.Pin43=PA13 +Mcu.Pin44=PA14 +Mcu.Pin45=PC10 +Mcu.Pin46=PC11 +Mcu.Pin47=PC12 +Mcu.Pin48=PD2 +Mcu.Pin49=PD5 Mcu.Pin5=PH0 - OSC_IN -Mcu.Pin50=PD2 -Mcu.Pin51=PD5 -Mcu.Pin52=PD6 -Mcu.Pin53=PB3 -Mcu.Pin54=PB4 -Mcu.Pin55=PB6 -Mcu.Pin56=PB7 -Mcu.Pin57=PB8 -Mcu.Pin58=PB9 -Mcu.Pin59=PE0 +Mcu.Pin50=PD6 +Mcu.Pin51=PB3 +Mcu.Pin52=PB4 +Mcu.Pin53=PB6 +Mcu.Pin54=PB7 +Mcu.Pin55=PB8 +Mcu.Pin56=PB9 +Mcu.Pin57=PE0 +Mcu.Pin58=PE1 +Mcu.Pin59=VP_SYS_VS_Systick Mcu.Pin6=PH1 - OSC_OUT -Mcu.Pin60=PE1 -Mcu.Pin61=VP_SYS_VS_Systick -Mcu.Pin62=VP_TIM1_VS_ClockSourceINT -Mcu.Pin63=VP_TIM3_VS_ClockSourceINT -Mcu.Pin64=VP_TIM4_VS_ClockSourceINT +Mcu.Pin60=VP_TIM1_VS_ClockSourceINT +Mcu.Pin61=VP_TIM3_VS_ClockSourceINT +Mcu.Pin62=VP_TIM4_VS_ClockSourceINT Mcu.Pin7=PC0 Mcu.Pin8=PC1 Mcu.Pin9=PC2 -Mcu.PinsNb=65 +Mcu.PinsNb=63 Mcu.ThirdPartyNb=0 Mcu.UserConstants= Mcu.UserName=STM32F413VGTx @@ -224,8 +222,6 @@ PE1.Signal=UART8_TX PE11.Signal=S_TIM1_CH2 PE12.Mode=Full_Duplex_Master PE12.Signal=SPI4_SCK -PE13.Signal=S_TIM1_CH3 -PE14.Signal=S_TIM1_CH4 PE2.Mode=Asynchronous PE2.Signal=UART10_RX PE3.Mode=Asynchronous @@ -338,10 +334,6 @@ SH.S_TIM1_CH1.0=TIM1_CH1,Input_Capture1_from_TI1 SH.S_TIM1_CH1.ConfNb=1 SH.S_TIM1_CH2.0=TIM1_CH2,Input_Capture2_from_TI2 SH.S_TIM1_CH2.ConfNb=1 -SH.S_TIM1_CH3.0=TIM1_CH3,Input_Capture3_from_TI3 -SH.S_TIM1_CH3.ConfNb=1 -SH.S_TIM1_CH4.0=TIM1_CH4,Input_Capture4_from_TI4 -SH.S_TIM1_CH4.ConfNb=1 SH.S_TIM2_CH3.0=TIM2_CH3,Input_Capture3_from_TI3 SH.S_TIM2_CH3.ConfNb=1 SH.S_TIM2_CH4.0=TIM2_CH4,Input_Capture4_from_TI4 @@ -375,9 +367,7 @@ SPI4.VirtualNSS=VM_NSSHARD SPI4.VirtualType=VM_MASTER TIM1.Channel-Input_Capture1_from_TI1=TIM_CHANNEL_1 TIM1.Channel-Input_Capture2_from_TI2=TIM_CHANNEL_2 -TIM1.Channel-Input_Capture3_from_TI3=TIM_CHANNEL_3 -TIM1.Channel-Input_Capture4_from_TI4=TIM_CHANNEL_4 -TIM1.IPParameters=Channel-Input_Capture1_from_TI1,Channel-Input_Capture2_from_TI2,Channel-Input_Capture3_from_TI3,Channel-Input_Capture4_from_TI4 +TIM1.IPParameters=Channel-Input_Capture1_from_TI1,Channel-Input_Capture2_from_TI2 TIM12.Channel-Input_Capture1_from_TI1=TIM_CHANNEL_1 TIM12.Channel-Input_Capture2_from_TI2=TIM_CHANNEL_2 TIM12.IPParameters=Channel-Input_Capture1_from_TI1,Channel-Input_Capture2_from_TI2 diff --git a/board/CubeMX_Config/Inc/main.h b/board/CubeMX_Config/Inc/main.h index b257260..65f428f 100644 --- a/board/CubeMX_Config/Inc/main.h +++ b/board/CubeMX_Config/Inc/main.h @@ -7,7 +7,7 @@ ****************************************************************************** * @attention * - * Copyright (c) 2022 STMicroelectronics. + * Copyright (c) 2023 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file diff --git a/board/CubeMX_Config/Inc/stm32f4xx_it.h b/board/CubeMX_Config/Inc/stm32f4xx_it.h index 14e5c37..37f04b4 100644 --- a/board/CubeMX_Config/Inc/stm32f4xx_it.h +++ b/board/CubeMX_Config/Inc/stm32f4xx_it.h @@ -6,7 +6,7 @@ ****************************************************************************** * @attention * - * Copyright (c) 2022 STMicroelectronics. + * Copyright (c) 2023 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file diff --git a/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c b/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c index dd2e789..0b78113 100644 --- a/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c +++ b/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c @@ -7,7 +7,7 @@ ****************************************************************************** * @attention * - * Copyright (c) 2022 STMicroelectronics. + * Copyright (c) 2023 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file @@ -525,12 +525,10 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base) /**TIM1 GPIO Configuration PE9 ------> TIM1_CH1 PE11 ------> TIM1_CH2 - PE13 ------> TIM1_CH3 - PE14 ------> TIM1_CH4 */ - GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_11|GPIO_PIN_13|GPIO_PIN_14; + GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Pull = GPIO_PULLDOWN; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF1_TIM1; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); @@ -588,7 +586,7 @@ void HAL_TIM_IC_MspInit(TIM_HandleTypeDef* htim_ic) */ GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Pull = GPIO_PULLDOWN; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF1_TIM2; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); @@ -703,10 +701,8 @@ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base) /**TIM1 GPIO Configuration PE9 ------> TIM1_CH1 PE11 ------> TIM1_CH2 - PE13 ------> TIM1_CH3 - PE14 ------> TIM1_CH4 */ - HAL_GPIO_DeInit(GPIOE, GPIO_PIN_9|GPIO_PIN_11|GPIO_PIN_13|GPIO_PIN_14); + HAL_GPIO_DeInit(GPIOE, GPIO_PIN_9|GPIO_PIN_11); /* USER CODE BEGIN TIM1_MspDeInit 1 */ diff --git a/board/CubeMX_Config/Src/stm32f4xx_it.c b/board/CubeMX_Config/Src/stm32f4xx_it.c index 3ee6609..3501567 100644 --- a/board/CubeMX_Config/Src/stm32f4xx_it.c +++ b/board/CubeMX_Config/Src/stm32f4xx_it.c @@ -6,7 +6,7 @@ ****************************************************************************** * @attention * - * Copyright (c) 2022 STMicroelectronics. + * Copyright (c) 2023 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file diff --git a/board/Kconfig b/board/Kconfig index 28108ac..1b6c39b 100644 --- a/board/Kconfig +++ b/board/Kconfig @@ -194,7 +194,7 @@ menu "On-chip Peripheral Drivers" depends on BSP_USING_SPI2 select BSP_SPI2_TX_USING_DMA default n - + endif menuconfig BSP_USING_I2C1 @@ -275,6 +275,50 @@ menu "On-chip Peripheral Drivers" endif endif + menuconfig BSP_USING_CAPTURE + bool "Enable input capture" + default n + select RT_USING_INPUT_CAPTURE + if BSP_USING_CAPTURE + + menuconfig BSP_USING_CAPTURE1 + bool "Enable capture1" + default n + if BSP_USING_CAPTURE1 + config BSP_USING_CAPTURE1_CH1 + bool "Enable capture1 channel1" + default n + config BSP_USING_CAPTURE1_CH2 + bool "Enable capture1 channel2" + default n + config BSP_USING_CAPTURE1_CH3 + bool "Enable capture1 channel3" + default n + config BSP_USING_CAPTURE1_CH4 + bool "Enable capture1 channel4" + default n + endif + + menuconfig BSP_USING_CAPTURE2 + bool "Enable capture2" + default n + if BSP_USING_CAPTURE2 + config BSP_USING_CAPTURE2_CH1 + bool "Enable capture2 channel1" + default n + config BSP_USING_CAPTURE2_CH2 + bool "Enable capture2 channel2" + default n + config BSP_USING_CAPTURE2_CH3 + bool "Enable capture2 channel3" + default n + config BSP_USING_CAPTURE2_CH4 + bool "Enable capture2 channel4" + default n + endif + + endif + menuconfig BSP_USING_ADC bool "Enable ADC" default n diff --git a/board/board.c b/board/board.c index 6ab2bbc..8ca1a5e 100644 --- a/board/board.c +++ b/board/board.c @@ -104,3 +104,6 @@ INIT_DEVICE_EXPORT(stm32_pwm_init); extern int stm32_adc_init(void); INIT_BOARD_EXPORT(stm32_adc_init); + +extern int stm32_capture_init(void); +INIT_APP_EXPORT(stm32_capture_init); diff --git a/libraries/HAL_Drivers/SConscript b/libraries/HAL_Drivers/SConscript index de3b27a..7632fa2 100644 --- a/libraries/HAL_Drivers/SConscript +++ b/libraries/HAL_Drivers/SConscript @@ -105,6 +105,9 @@ if GetDepend(['BSP_USING_USBD']): if GetDepend(['BSP_USING_PULSE_ENCODER']): src += ['drv_pulse_encoder.c'] +if GetDepend(['BSP_USING_CAPTURE']): + src += ['drv_inputcapture.c'] + if GetDepend(['BSP_USING_USBH']): src += ['drv_usbh.c'] diff --git a/libraries/HAL_Drivers/drv_inputcapture.c b/libraries/HAL_Drivers/drv_inputcapture.c new file mode 100644 index 0000000..4e69ea9 --- /dev/null +++ b/libraries/HAL_Drivers/drv_inputcapture.c @@ -0,0 +1,605 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ + +#include + +#ifdef BSP_USING_CAPTURE + +#include "drv_config.h" + +#define CAPTURE1_CONFIG \ +{ \ + .timer.Instance = TIM1, \ + .iqrn = TIM1_CC_IRQn, \ + .timerx = 1, \ + .advanced = RT_TRUE, \ +} + +#define CAPTURE2_CONFIG \ +{ \ + .timer.Instance = TIM2, \ + .iqrn = TIM2_IRQn, \ + .timerx = 2, \ +} + +#define LOG_TAG "drv.tcap" +#include + +#define MAX_PERIOD 65535 +#define MAX_PULSE 1000 + +typedef enum { + POLARITY_BOTHEDGE, + POLARITY_RISING, + POLARITY_FALLING, +}trigger_polarity; + +struct pulse_data +{ + rt_uint32_t last_overflow; + rt_uint32_t last_cnt; + trigger_polarity polarity; +}; + +struct stm32_capture_device; + +struct stm32_capture +{ + TIM_HandleTypeDef timer; + IRQn_Type iqrn; + rt_uint8_t timerx; + rt_uint8_t advanced; + + rt_uint8_t inited; + rt_uint32_t tim_overflow; + struct stm32_capture_device *channels[4]; +}; + +enum +{ +#ifdef BSP_USING_CAPTURE1 + CAPTURE1_INDEX, +#endif +#ifdef BSP_USING_CAPTURE2 + CAPTURE2_INDEX, +#endif +#ifdef BSP_USING_CAPTURE3 + CAPTURE3_INDEX, +#endif +#ifdef BSP_USING_CAPTURE4 + CAPTURE4_INDEX, +#endif +#ifdef BSP_USING_CAPTURE5 + CAPTURE5_INDEX, +#endif +#ifdef BSP_USING_CAPTURE6 + CAPTURE6_INDEX, +#endif +#ifdef BSP_USING_CAPTURE7 + CAPTURE7_INDEX, +#endif +#ifdef BSP_USING_CAPTURE8 + CAPTURE8_INDEX, +#endif +#ifdef BSP_USING_CAPTURE9 + CAPTURE9_INDEX, +#endif +#ifdef BSP_USING_CAPTURE10 + CAPTURE10_INDEX, +#endif +}; + +static struct stm32_capture stm32_capture_obj[] = +{ +#ifdef BSP_USING_CAPTURE1 + CAPTURE1_CONFIG, +#endif +#ifdef BSP_USING_CAPTURE2 + CAPTURE2_CONFIG, +#endif +#ifdef BSP_USING_CAPTURE3 + CAPTURE3_CONFIG, +#endif +#ifdef BSP_USING_CAPTURE4 + CAPTURE4_CONFIG, +#endif +#ifdef BSP_USING_CAPTURE5 + CAPTURE5_CONFIG, +#endif +#ifdef BSP_USING_CAPTURE6 + CAPTURE6_CONFIG, +#endif +#ifdef BSP_USING_CAPTURE7 + CAPTURE7_CONFIG, +#endif +#ifdef BSP_USING_CAPTURE8 + CAPTURE8_CONFIG, +#endif +#ifdef BSP_USING_CAPTURE9 + CAPTURE9_CONFIG, +#endif +#ifdef BSP_USING_CAPTURE10 + CAPTURE10_CONFIG, +#endif +}; + +struct stm32_capture_device +{ + struct rt_inputcapture_device parent; + struct stm32_capture *timer; + rt_uint8_t ch; + rt_uint8_t opend; + struct pulse_data data; + rt_uint32_t pulsewidth_us; +}; + +static struct stm32_capture_device stm32_capture_devices[] = +{ +#ifdef BSP_USING_CAPTURE1_CH1 + {{0}, &stm32_capture_obj[CAPTURE1_INDEX], 1, {0}}, +#endif +#ifdef BSP_USING_CAPTURE1_CH2 + {{0}, &stm32_capture_obj[CAPTURE1_INDEX], 2, {0}}, +#endif +#ifdef BSP_USING_CAPTURE1_CH3 + {{0}, &stm32_capture_obj[CAPTURE1_INDEX], 3, {0}}, +#endif +#ifdef BSP_USING_CAPTURE1_CH4 + {{0}, &stm32_capture_obj[CAPTURE1_INDEX], 4, {0}}, +#endif +#ifdef BSP_USING_CAPTURE2_CH1 + {{0}, &stm32_capture_obj[CAPTURE2_INDEX], 1, {0}}, +#endif +#ifdef BSP_USING_CAPTURE2_CH2 + {{0}, &stm32_capture_obj[CAPTURE2_INDEX], 2, {0}}, +#endif +#ifdef BSP_USING_CAPTURE2_CH3 + {{0}, &stm32_capture_obj[CAPTURE2_INDEX], 3, {0}}, +#endif +#ifdef BSP_USING_CAPTURE2_CH4 + {{0}, &stm32_capture_obj[CAPTURE2_INDEX], 4, {0}}, +#endif +#ifdef BSP_USING_CAPTURE3_CH1 + {{0}, &stm32_capture_obj[CAPTURE3_INDEX], 1, {0}}, +#endif +#ifdef BSP_USING_CAPTURE3_CH2 + {{0}, &stm32_capture_obj[CAPTURE3_INDEX], 2, {0}}, +#endif +#ifdef BSP_USING_CAPTURE3_CH3 + {{0}, &stm32_capture_obj[CAPTURE3_INDEX], 3, {0}}, +#endif +#ifdef BSP_USING_CAPTURE3_CH4 + {{0}, &stm32_capture_obj[CAPTURE3_INDEX], 4, {0}}, +#endif +#ifdef BSP_USING_CAPTURE4_CH1 + {{0}, &stm32_capture_obj[CAPTURE4_INDEX], 1, {0}}, +#endif +#ifdef BSP_USING_CAPTURE4_CH2 + {{0}, &stm32_capture_obj[CAPTURE4_INDEX], 2, {0}}, +#endif +#ifdef BSP_USING_CAPTURE4_CH3 + {{0}, &stm32_capture_obj[CAPTURE4_INDEX], 3, {0}}, +#endif +#ifdef BSP_USING_CAPTURE4_CH4 + {{0}, &stm32_capture_obj[CAPTURE4_INDEX], 4, {0}}, +#endif +#ifdef BSP_USING_CAPTURE5_CH1 + {{0}, &stm32_capture_obj[CAPTURE5_INDEX], 1, {0}}, +#endif +#ifdef BSP_USING_CAPTURE5_CH2 + {{0}, &stm32_capture_obj[CAPTURE5_INDEX], 2, {0}}, +#endif +#ifdef BSP_USING_CAPTURE5_CH3 + {{0}, &stm32_capture_obj[CAPTURE5_INDEX], 3, {0}}, +#endif +#ifdef BSP_USING_CAPTURE5_CH4 + {{0}, &stm32_capture_obj[CAPTURE5_INDEX], 4, {0}}, +#endif +#ifdef BSP_USING_CAPTURE6_CH1 + {{0}, &stm32_capture_obj[CAPTURE6_INDEX], 1, {0}}, +#endif +#ifdef BSP_USING_CAPTURE6_CH2 + {{0}, &stm32_capture_obj[CAPTURE6_INDEX], 2, {0}}, +#endif +#ifdef BSP_USING_CAPTURE6_CH3 + {{0}, &stm32_capture_obj[CAPTURE6_INDEX], 3, {0}}, +#endif +#ifdef BSP_USING_CAPTURE6_CH4 + {{0}, &stm32_capture_obj[CAPTURE6_INDEX], 4, {0}}, +#endif +#ifdef BSP_USING_CAPTURE7_CH1 + {{0}, &stm32_capture_obj[CAPTURE7_INDEX], 1, {0}}, +#endif +#ifdef BSP_USING_CAPTURE7_CH2 + {{0}, &stm32_capture_obj[CAPTURE7_INDEX], 2, {0}}, +#endif +#ifdef BSP_USING_CAPTURE7_CH3 + {{0}, &stm32_capture_obj[CAPTURE7_INDEX], 3, {0}}, +#endif +#ifdef BSP_USING_CAPTURE7_CH4 + {{0}, &stm32_capture_obj[CAPTURE7_INDEX], 4, {0}}, +#endif +#ifdef BSP_USING_CAPTURE8_CH1 + {{0}, &stm32_capture_obj[CAPTURE8_INDEX], 1, {0}}, +#endif +#ifdef BSP_USING_CAPTURE8_CH2 + {{0}, &stm32_capture_obj[CAPTURE8_INDEX], 2, {0}}, +#endif +#ifdef BSP_USING_CAPTURE8_CH3 + {{0}, &stm32_capture_obj[CAPTURE8_INDEX], 3, {0}}, +#endif +#ifdef BSP_USING_CAPTURE8_CH4 + {{0}, &stm32_capture_obj[CAPTURE8_INDEX], 4, {0}}, +#endif +#ifdef BSP_USING_CAPTURE9_CH1 + {{0}, &stm32_capture_obj[CAPTURE9_INDEX], 1, {0}}, +#endif +#ifdef BSP_USING_CAPTURE9_CH2 + {{0}, &stm32_capture_obj[CAPTURE9_INDEX], 2, {0}}, +#endif +#ifdef BSP_USING_CAPTURE9_CH3 + {{0}, &stm32_capture_obj[CAPTURE9_INDEX], 3, {0}}, +#endif +#ifdef BSP_USING_CAPTURE9_CH4 + {{0}, &stm32_capture_obj[CAPTURE9_INDEX], 4, {0}}, +#endif +#ifdef BSP_USING_CAPTURE10_CH1 + {{0}, &stm32_capture_obj[CAPTURE10_INDEX], 1, {0}}, +#endif +#ifdef BSP_USING_CAPTURE10_CH2 + {{0}, &stm32_capture_obj[CAPTURE10_INDEX], 2, {0}}, +#endif +#ifdef BSP_USING_CAPTURE10_CH3 + {{0}, &stm32_capture_obj[CAPTURE10_INDEX], 3, {0}}, +#endif +#ifdef BSP_USING_CAPTURE10_CH4 + {{0}, &stm32_capture_obj[CAPTURE10_INDEX], 4, {0}}, +#endif +}; + +static rt_uint64_t get_timer_clock(TIM_HandleTypeDef *htim) +{ + rt_uint64_t tim_clock = 0; + +#if defined(SOC_SERIES_STM32F2) || defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) + if (htim->Instance == TIM9 || htim->Instance == TIM10 || htim->Instance == TIM11 || htim->Instance == TIM1 || htim->Instance == TIM8) +#elif defined(SOC_SERIES_STM32L4) + if (htim->Instance == TIM15 || htim->Instance == TIM16 || htim->Instance == TIM17) +#elif defined(SOC_SERIES_STM32MP1) + if (htim->Instance == TIM4) +#elif defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32G0) + if (0) +#endif + { +#if !defined(SOC_SERIES_STM32F0) && !defined(SOC_SERIES_STM32G0) +#ifdef STM32F413xx + tim_clock = HAL_RCC_GetPCLK2Freq(); +#else + tim_clock = HAL_RCC_GetPCLK2Freq() * 2; +#endif +#endif + } + else + { +#if defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32G0) + tim_clock = HAL_RCC_GetPCLK1Freq(); +#else + tim_clock = HAL_RCC_GetPCLK1Freq() * 2; +#endif + } + + return tim_clock; +} + +static void rt_hw_capture_timer_init(struct stm32_capture *device) +{ + TIM_ClockConfigTypeDef sClockSourceConfig = {0}; + TIM_MasterConfigTypeDef sMasterConfig = {0}; + TIM_IC_InitTypeDef sConfigIC = {0}; + rt_uint64_t tim_clock; + + if (device->inited) + { + return; + } + + tim_clock = get_timer_clock(&device->timer) / 1000000; + + /* configure the timer to ic mode */ + device->timer.Init.Prescaler = tim_clock-1; + device->timer.Init.CounterMode = TIM_COUNTERMODE_UP; + device->timer.Init.Period = MAX_PERIOD-1; + device->timer.Init.AutoReloadPreload = MAX_PERIOD-1; + device->timer.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; +#if defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32L4) + device->timer.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; +#else + device->timer.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; +#endif + + if (device->advanced && HAL_TIM_Base_Init(&device->timer) != HAL_OK) + { + Error_Handler(); + } + + if (HAL_TIM_IC_Init(&device->timer) != HAL_OK) + { + Error_Handler(); + } + + HAL_NVIC_SetPriority(device->iqrn, 0, 0); + HAL_NVIC_EnableIRQ(device->iqrn); + + sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; + if (HAL_TIM_ConfigClockSource(&device->timer, &sClockSourceConfig) != HAL_OK) + { + Error_Handler(); + } + + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&device->timer, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + + sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING; + sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI; + sConfigIC.ICPrescaler = TIM_ICPSC_DIV1; + sConfigIC.ICFilter = 0; + + if (device->channels[0] != RT_NULL && HAL_TIM_IC_ConfigChannel(&device->timer, &sConfigIC, TIM_CHANNEL_1) != HAL_OK) + { + Error_Handler(); + } + if (device->channels[1] != RT_NULL && HAL_TIM_IC_ConfigChannel(&device->timer, &sConfigIC, TIM_CHANNEL_2) != HAL_OK) + { + Error_Handler(); + } + if (device->channels[2] != RT_NULL && HAL_TIM_IC_ConfigChannel(&device->timer, &sConfigIC, TIM_CHANNEL_3) != HAL_OK) + { + Error_Handler(); + } + if (device->channels[3] != RT_NULL && HAL_TIM_IC_ConfigChannel(&device->timer, &sConfigIC, TIM_CHANNEL_4) != HAL_OK) + { + Error_Handler(); + } + + __HAL_TIM_DISABLE(&device->timer); + __HAL_TIM_SET_COUNTER(&device->timer,0); + __HAL_TIM_ENABLE_IT(&device->timer,TIM_IT_UPDATE); + __HAL_TIM_ENABLE(&device->timer); + + device->inited = RT_TRUE; +} + +static rt_err_t rt_hw_capture_open(struct rt_inputcapture_device *inputcapture) +{ + struct stm32_capture_device *device_ch; + rt_uint32_t ch; + + rt_enter_critical(); + + device_ch = rt_container_of(inputcapture, struct stm32_capture_device, parent); + if (device_ch->opend) + { + rt_exit_critical(); + return RT_EOK; + } + device_ch->opend = RT_TRUE; + + rt_hw_capture_timer_init(device_ch->timer); + + rt_exit_critical(); + + switch (device_ch->ch) + { + case 1: + ch = TIM_CHANNEL_1; + break; + case 2: + ch = TIM_CHANNEL_2; + break; + case 3: + ch = TIM_CHANNEL_3; + break; + default: + ch = TIM_CHANNEL_4; + break; + } + + HAL_TIM_IC_Start_IT(&device_ch->timer->timer, ch); + + return RT_EOK; +} + +void TIM2_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + HAL_TIM_IRQHandler(&stm32_capture_obj[CAPTURE2_INDEX].timer); + /* leave interrupt */ + rt_interrupt_leave(); +} + +void TIM1_CC_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + HAL_TIM_IRQHandler(&stm32_capture_obj[CAPTURE1_INDEX].timer); + /* leave interrupt */ + rt_interrupt_leave(); +} + +void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) +{ + int i = 0; + + for (i = 0; i < sizeof(stm32_capture_obj) / sizeof(stm32_capture_obj[0]); i++) + { + if (stm32_capture_obj[i].timer.Instance == htim->Instance) + { + stm32_capture_obj[i].tim_overflow ++; + } + } +} + +static void _capture_computer(struct stm32_capture_device *dev, rt_uint32_t channel) +{ + rt_uint32_t trigger_overflow = 0; + rt_uint32_t trigger_cnt = 0; + + if (dev->data.polarity == POLARITY_RISING) + { + TIM_RESET_CAPTUREPOLARITY(&dev->timer->timer, channel); + TIM_SET_CAPTUREPOLARITY(&dev->timer->timer,channel, TIM_ICPOLARITY_FALLING); + dev->data.polarity = POLARITY_FALLING; + } + else + { + TIM_RESET_CAPTUREPOLARITY(&dev->timer->timer, channel); + TIM_SET_CAPTUREPOLARITY(&dev->timer->timer,channel, TIM_ICPOLARITY_RISING); + dev->data.polarity = POLARITY_RISING; + } + + trigger_cnt = HAL_TIM_ReadCapturedValue(&dev->timer->timer, channel); + trigger_overflow = dev->timer->tim_overflow; + + if((trigger_overflow < dev->data.last_overflow) || + ((trigger_overflow - dev->data.last_overflow) > MAX_PULSE)) + { + dev->data.last_overflow = trigger_overflow; + dev->data.last_cnt = trigger_cnt; + + return; + } + + dev->pulsewidth_us = (trigger_overflow - dev->data.last_overflow)*MAX_PERIOD + + trigger_cnt - dev->data.last_cnt; + + rt_hw_inputcapture_isr(&dev->parent, dev->data.polarity != POLARITY_FALLING); + + dev->data.last_overflow = trigger_overflow; + dev->data.last_cnt = trigger_cnt; + + return; +} + +void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) +{ + int i = 0; + rt_uint32_t ch, to; + + for (i = 0; i < sizeof(stm32_capture_devices) / sizeof(stm32_capture_devices[0]); i++) + { + switch (stm32_capture_devices[i].ch) + { + case 1: + ch = HAL_TIM_ACTIVE_CHANNEL_1; + to = TIM_CHANNEL_1; + break; + case 2: + ch = HAL_TIM_ACTIVE_CHANNEL_2; + to = TIM_CHANNEL_2; + break; + case 3: + ch = HAL_TIM_ACTIVE_CHANNEL_3; + to = TIM_CHANNEL_3; + break; + default: + ch = HAL_TIM_ACTIVE_CHANNEL_4; + to = TIM_CHANNEL_4; + break; + } + + if (htim->Channel == ch && htim->Instance == stm32_capture_devices[i].timer->timer.Instance) + { + _capture_computer(&stm32_capture_devices[i], to); + } + } +} + +static rt_err_t rt_hw_capture_get_pulsewidth (struct rt_inputcapture_device *inputcapture, rt_uint32_t *pulsewidth_us) +{ + struct stm32_capture_device *device; + + device = rt_container_of(inputcapture, struct stm32_capture_device, parent); + *pulsewidth_us = device->pulsewidth_us; + + return RT_EOK; +} + +static rt_err_t rt_hw_capture_init (struct rt_inputcapture_device *inputcapture) +{ + return RT_EOK; +} + +static rt_err_t rt_hw_capture_close (struct rt_inputcapture_device *inputcapture) +{ + struct stm32_capture_device *device_ch; + rt_uint32_t ch; + + rt_enter_critical(); + + device_ch = rt_container_of(inputcapture, struct stm32_capture_device, parent); + if (!device_ch->opend) + { + rt_exit_critical(); + return RT_EOK; + } + + switch (device_ch->ch) + { + case 1: + ch = TIM_CHANNEL_1; + break; + case 2: + ch = TIM_CHANNEL_2; + break; + case 3: + ch = TIM_CHANNEL_3; + break; + default: + ch = TIM_CHANNEL_4; + break; + } + + HAL_TIM_IC_Stop_IT(&device_ch->timer->timer, ch); + device_ch->opend = RT_FALSE; + + rt_exit_critical(); + + return RT_EOK; +} + +static const struct rt_inputcapture_ops _drv_ops = { + .init = rt_hw_capture_init, + .open = rt_hw_capture_open, + .close = rt_hw_capture_close, + .get_pulsewidth = rt_hw_capture_get_pulsewidth, +}; + +int stm32_capture_init(void) +{ + int i = 0; + char name[] = "tc00ch0"; + + for (i = 0; i < sizeof(stm32_capture_devices) / sizeof(stm32_capture_devices[0]); i++) + { + stm32_capture_devices[i].timer->channels[stm32_capture_devices[i].ch - 1] = &stm32_capture_devices[i]; + stm32_capture_devices[i].parent.ops = &_drv_ops; + + rt_snprintf(name, sizeof(name),"tc%dch%d", stm32_capture_devices[i].timer->timerx, stm32_capture_devices[i].ch); + rt_device_inputcapture_register(&stm32_capture_devices[i].parent, name, RT_NULL); + } + + return RT_EOK; +} + +#endif diff --git a/libraries/STM32F4xx_HAL/SConscript b/libraries/STM32F4xx_HAL/SConscript index 52376c0..4d64ec8 100644 --- a/libraries/STM32F4xx_HAL/SConscript +++ b/libraries/STM32F4xx_HAL/SConscript @@ -46,7 +46,7 @@ if GetDepend(['RT_USING_USB']): if GetDepend(['RT_USING_CAN']): src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_can.c'] -if GetDepend(['RT_USING_HWTIMER']) or GetDepend(['RT_USING_PWM']) or GetDepend(['RT_USING_PULSE_ENCODER']): +if GetDepend(['RT_USING_HWTIMER']) or GetDepend(['RT_USING_PWM']) or GetDepend(['RT_USING_PULSE_ENCODER']) or GetDepend(['RT_USING_INPUT_CAPTURE']): src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c'] src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c'] src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_lptim.c'] diff --git a/project.uvoptx b/project.uvoptx index 7e4e9b0..4a21d4c 100644 --- a/project.uvoptx +++ b/project.uvoptx @@ -303,18 +303,6 @@ 0 0 0 - rt-thread\components\libc\cplusplus\cxx_crt.cpp - cxx_crt.cpp - 0 - 0 - - - 2 - 10 - 8 - 0 - 0 - 0 rt-thread\components\libc\cplusplus\cxx_Thread.cpp cxx_Thread.cpp 0 @@ -322,7 +310,7 @@ 2 - 11 + 10 1 0 0 @@ -334,7 +322,7 @@ 2 - 12 + 11 8 0 0 @@ -344,6 +332,18 @@ 0 0 + + 2 + 12 + 8 + 0 + 0 + 0 + rt-thread\components\libc\cplusplus\cxx_crt.cpp + cxx_crt.cpp + 0 + 0 + 2 13 @@ -571,6 +571,18 @@ 0 0 0 + rt-thread\components\drivers\misc\rt_inputcapture.c + rt_inputcapture.c + 0 + 0 + + + 4 + 31 + 1 + 0 + 0 + 0 rt-thread\components\drivers\serial\serial.c serial.c 0 @@ -578,7 +590,7 @@ 4 - 31 + 32 1 0 0 @@ -598,7 +610,7 @@ 0 5 - 32 + 33 1 0 0 @@ -610,7 +622,7 @@ 5 - 33 + 34 1 0 0 @@ -622,7 +634,7 @@ 5 - 34 + 35 2 0 0 @@ -634,7 +646,7 @@ 5 - 35 + 36 1 0 0 @@ -646,7 +658,7 @@ 5 - 36 + 37 1 0 0 @@ -658,7 +670,7 @@ 5 - 37 + 38 1 0 0 @@ -670,7 +682,7 @@ 5 - 38 + 39 1 0 0 @@ -682,7 +694,7 @@ 5 - 39 + 40 1 0 0 @@ -694,7 +706,19 @@ 5 - 40 + 41 + 1 + 0 + 0 + 0 + libraries\HAL_Drivers\drv_inputcapture.c + drv_inputcapture.c + 0 + 0 + + + 5 + 42 1 0 0 @@ -706,7 +730,7 @@ 5 - 41 + 43 1 0 0 @@ -726,7 +750,7 @@ 0 6 - 42 + 44 1 0 0 @@ -738,7 +762,7 @@ 6 - 43 + 45 1 0 0 @@ -750,19 +774,7 @@ 6 - 44 - 1 - 0 - 0 - 0 - rt-thread\components\fal\src\fal.c - fal.c - 0 - 0 - - - 6 - 45 + 46 1 0 0 @@ -772,6 +784,18 @@ 0 0 + + 6 + 47 + 1 + 0 + 0 + 0 + rt-thread\components\fal\src\fal.c + fal.c + 0 + 0 + @@ -782,7 +806,7 @@ 0 7 - 46 + 48 1 0 0 @@ -794,7 +818,7 @@ 7 - 47 + 49 1 0 0 @@ -806,7 +830,7 @@ 7 - 48 + 50 1 0 0 @@ -818,7 +842,7 @@ 7 - 49 + 51 1 0 0 @@ -838,7 +862,7 @@ 0 8 - 50 + 52 1 0 0 @@ -858,7 +882,7 @@ 0 9 - 51 + 53 1 0 0 @@ -870,7 +894,7 @@ 9 - 52 + 54 1 0 0 @@ -882,7 +906,7 @@ 9 - 53 + 55 1 0 0 @@ -894,7 +918,7 @@ 9 - 54 + 56 1 0 0 @@ -906,7 +930,7 @@ 9 - 55 + 57 1 0 0 @@ -918,7 +942,7 @@ 9 - 56 + 58 1 0 0 @@ -930,7 +954,7 @@ 9 - 57 + 59 1 0 0 @@ -942,7 +966,7 @@ 9 - 58 + 60 1 0 0 @@ -954,7 +978,7 @@ 9 - 59 + 61 1 0 0 @@ -966,7 +990,7 @@ 9 - 60 + 62 1 0 0 @@ -978,7 +1002,7 @@ 9 - 61 + 63 1 0 0 @@ -990,7 +1014,7 @@ 9 - 62 + 64 1 0 0 @@ -1002,7 +1026,7 @@ 9 - 63 + 65 1 0 0 @@ -1022,7 +1046,7 @@ 0 10 - 64 + 66 1 0 0 @@ -1034,7 +1058,7 @@ 10 - 65 + 67 1 0 0 @@ -1046,7 +1070,7 @@ 10 - 66 + 68 1 0 0 @@ -1058,7 +1082,7 @@ 10 - 67 + 69 1 0 0 @@ -1070,7 +1094,7 @@ 10 - 68 + 70 1 0 0 @@ -1082,7 +1106,7 @@ 10 - 69 + 71 1 0 0 @@ -1094,7 +1118,7 @@ 10 - 70 + 72 1 0 0 @@ -1106,7 +1130,7 @@ 10 - 71 + 73 1 0 0 @@ -1118,7 +1142,7 @@ 10 - 72 + 74 1 0 0 @@ -1130,7 +1154,7 @@ 10 - 73 + 75 1 0 0 @@ -1142,7 +1166,7 @@ 10 - 74 + 76 1 0 0 @@ -1154,7 +1178,7 @@ 10 - 75 + 77 1 0 0 @@ -1166,7 +1190,7 @@ 10 - 76 + 78 1 0 0 @@ -1178,7 +1202,7 @@ 10 - 77 + 79 1 0 0 @@ -1190,7 +1214,7 @@ 10 - 78 + 80 1 0 0 @@ -1202,7 +1226,7 @@ 10 - 79 + 81 1 0 0 @@ -1214,7 +1238,7 @@ 10 - 80 + 82 1 0 0 @@ -1226,7 +1250,7 @@ 10 - 81 + 83 1 0 0 @@ -1238,7 +1262,7 @@ 10 - 82 + 84 1 0 0 @@ -1250,7 +1274,7 @@ 10 - 83 + 85 1 0 0 @@ -1262,7 +1286,7 @@ 10 - 84 + 86 1 0 0 @@ -1274,7 +1298,7 @@ 10 - 85 + 87 1 0 0 @@ -1286,7 +1310,7 @@ 10 - 86 + 88 1 0 0 @@ -1298,7 +1322,7 @@ 10 - 87 + 89 1 0 0 @@ -1310,7 +1334,7 @@ 10 - 88 + 90 1 0 0 @@ -1322,7 +1346,7 @@ 10 - 89 + 91 1 0 0 @@ -1334,7 +1358,7 @@ 10 - 90 + 92 1 0 0 @@ -1346,7 +1370,7 @@ 10 - 91 + 93 1 0 0 @@ -1366,7 +1390,7 @@ 0 11 - 92 + 94 1 0 0 @@ -1380,13 +1404,13 @@ Utilities - 1 + 0 0 0 0 12 - 93 + 95 1 0 0 @@ -1398,7 +1422,7 @@ 12 - 94 + 96 1 0 0 @@ -1410,7 +1434,7 @@ 12 - 95 + 97 1 0 0 diff --git a/project.uvprojx b/project.uvprojx index acb0b8d..328ccfa 100644 --- a/project.uvprojx +++ b/project.uvprojx @@ -428,11 +428,6 @@ CPlusPlus - - cxx_crt.cpp - 8 - rt-thread\components\libc\cplusplus\cxx_crt.cpp - cxx_Thread.cpp 8 @@ -448,6 +443,11 @@ 8 rt-thread\components\libc\cplusplus\cxx_Mutex.cpp + + cxx_crt.cpp + 8 + rt-thread\components\libc\cplusplus\cxx_crt.cpp + cxx_Semaphore.cpp 8 @@ -543,6 +543,11 @@ 1 rt-thread\components\drivers\misc\rt_drv_pwm.c + + rt_inputcapture.c + 1 + rt-thread\components\drivers\misc\rt_inputcapture.c + serial.c 1 @@ -598,6 +603,11 @@ 1 libraries\HAL_Drivers\drv_gpio.c + + drv_inputcapture.c + 1 + libraries\HAL_Drivers\drv_inputcapture.c + drv_pwm.c 1 @@ -623,16 +633,16 @@ 1 rt-thread\components\fal\src\fal_partition.c - - fal.c - 1 - rt-thread\components\fal\src\fal.c - fal_flash.c 1 rt-thread\components\fal\src\fal_flash.c + + fal.c + 1 + rt-thread\components\fal\src\fal.c + diff --git a/rt-thread/components/drivers/misc/rt_inputcapture.c b/rt-thread/components/drivers/misc/rt_inputcapture.c index c7a9eda..6f4c229 100644 --- a/rt-thread/components/drivers/misc/rt_inputcapture.c +++ b/rt-thread/components/drivers/misc/rt_inputcapture.c @@ -181,10 +181,7 @@ void rt_hw_inputcapture_isr(struct rt_inputcapture_device *inputcapture, rt_bool } data.is_high = level; - if (rt_ringbuffer_put(inputcapture->ringbuff, (rt_uint8_t *)&data, sizeof(struct rt_inputcapture_data)) == 0) - { - LOG_W("inputcapture ringbuffer doesn't have enough space."); - } + rt_ringbuffer_put(inputcapture->ringbuff, (rt_uint8_t *)&data, sizeof(struct rt_inputcapture_data)); receive_size = rt_ringbuffer_data_len(inputcapture->ringbuff) / sizeof(struct rt_inputcapture_data); diff --git a/rtconfig.h b/rtconfig.h index 8397591..0f18562 100644 --- a/rtconfig.h +++ b/rtconfig.h @@ -88,6 +88,8 @@ #define RT_USING_ADC #define RT_USING_PWM #define RT_USING_WDT +#define RT_USING_INPUT_CAPTURE +#define RT_INPUT_CAPTURE_RB_SIZE 100 /* Using USB */ @@ -304,6 +306,13 @@ #define BSP_USING_PWM4_CH2 #define BSP_USING_PWM4_CH3 #define BSP_USING_PWM4_CH4 +#define BSP_USING_CAPTURE +#define BSP_USING_CAPTURE1 +#define BSP_USING_CAPTURE1_CH1 +#define BSP_USING_CAPTURE1_CH2 +#define BSP_USING_CAPTURE2 +#define BSP_USING_CAPTURE2_CH3 +#define BSP_USING_CAPTURE2_CH4 #define BSP_USING_ADC #define BSP_USING_ADC1 #define BSP_USING_ON_CHIP_FLASH