diff --git a/.settings/com.st.stm32cube.ide.mcu.sfrview.prefs b/.settings/com.st.stm32cube.ide.mcu.sfrview.prefs new file mode 100644 index 0000000..98a69fc --- /dev/null +++ b/.settings/com.st.stm32cube.ide.mcu.sfrview.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +sfrviewstate={"fFavorites"\:{"fLists"\:{}},"fProperties"\:{"fNodeProperties"\:{}}} diff --git a/.vscode/settings.json b/.vscode/settings.json index 0eb2537..bb5dd2c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -113,7 +113,8 @@ "features.h": "c", "stdlib.h": "c", "stm32f1xx_hal_def.h": "c", - "light_intensity_ctrl.h": "c" + "light_intensity_ctrl.h": "c", + "pluse_generator.h": "c" }, "files.autoGuessEncoding": false, "files.encoding": "gbk" diff --git a/Core/Src/main.c b/Core/Src/main.c index cadce2d..1f7e4e6 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -40,9 +40,9 @@ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ -TIM_HandleTypeDef htim5; TIM_HandleTypeDef htim6; TIM_HandleTypeDef htim7; +TIM_HandleTypeDef htim8; UART_HandleTypeDef huart1; DMA_HandleTypeDef hdma_usart1_rx; @@ -59,7 +59,7 @@ static void MX_DMA_Init(void); static void MX_USART1_UART_Init(void); static void MX_TIM6_Init(void); static void MX_TIM7_Init(void); -static void MX_TIM5_Init(void); +static void MX_TIM8_Init(void); /* USER CODE BEGIN PFP */ /* USER CODE END PFP */ @@ -101,7 +101,7 @@ int main(void) MX_USART1_UART_Init(); MX_TIM6_Init(); MX_TIM7_Init(); - MX_TIM5_Init(); + MX_TIM8_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ @@ -159,77 +159,6 @@ void SystemClock_Config(void) } /** - * @brief TIM5 Initialization Function - * @param None - * @retval None - */ -static void MX_TIM5_Init(void) -{ - - /* USER CODE BEGIN TIM5_Init 0 */ - - /* USER CODE END TIM5_Init 0 */ - - TIM_ClockConfigTypeDef sClockSourceConfig = {0}; - TIM_MasterConfigTypeDef sMasterConfig = {0}; - TIM_OC_InitTypeDef sConfigOC = {0}; - - /* USER CODE BEGIN TIM5_Init 1 */ - - /* USER CODE END TIM5_Init 1 */ - htim5.Instance = TIM5; - htim5.Init.Prescaler = 71; - htim5.Init.CounterMode = TIM_COUNTERMODE_UP; - htim5.Init.Period = 1000; - htim5.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; - htim5.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; - if (HAL_TIM_Base_Init(&htim5) != HAL_OK) - { - Error_Handler(); - } - sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; - if (HAL_TIM_ConfigClockSource(&htim5, &sClockSourceConfig) != HAL_OK) - { - Error_Handler(); - } - if (HAL_TIM_PWM_Init(&htim5) != HAL_OK) - { - Error_Handler(); - } - sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; - sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; - if (HAL_TIMEx_MasterConfigSynchronization(&htim5, &sMasterConfig) != HAL_OK) - { - Error_Handler(); - } - sConfigOC.OCMode = TIM_OCMODE_PWM1; - sConfigOC.Pulse = 0; - sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; - sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; - if (HAL_TIM_PWM_ConfigChannel(&htim5, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) - { - Error_Handler(); - } - if (HAL_TIM_PWM_ConfigChannel(&htim5, &sConfigOC, TIM_CHANNEL_2) != HAL_OK) - { - Error_Handler(); - } - if (HAL_TIM_PWM_ConfigChannel(&htim5, &sConfigOC, TIM_CHANNEL_3) != HAL_OK) - { - Error_Handler(); - } - if (HAL_TIM_PWM_ConfigChannel(&htim5, &sConfigOC, TIM_CHANNEL_4) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN TIM5_Init 2 */ - - /* USER CODE END TIM5_Init 2 */ - HAL_TIM_MspPostInit(&htim5); - -} - -/** * @brief TIM6 Initialization Function * @param None * @retval None @@ -287,7 +216,7 @@ static void MX_TIM7_Init(void) htim7.Instance = TIM7; htim7.Init.Prescaler = 71; htim7.Init.CounterMode = TIM_COUNTERMODE_UP; - htim7.Init.Period = 1000; + htim7.Init.Period = 100; htim7.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; if (HAL_TIM_Base_Init(&htim7) != HAL_OK) { @@ -306,6 +235,98 @@ static void MX_TIM7_Init(void) } /** + * @brief TIM8 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM8_Init(void) +{ + + /* USER CODE BEGIN TIM8_Init 0 */ + + /* USER CODE END TIM8_Init 0 */ + + TIM_ClockConfigTypeDef sClockSourceConfig = {0}; + TIM_MasterConfigTypeDef sMasterConfig = {0}; + TIM_OC_InitTypeDef sConfigOC = {0}; + TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0}; + + /* USER CODE BEGIN TIM8_Init 1 */ + + /* USER CODE END TIM8_Init 1 */ + htim8.Instance = TIM8; + htim8.Init.Prescaler = 71; + htim8.Init.CounterMode = TIM_COUNTERMODE_UP; + htim8.Init.Period = 65535; + htim8.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim8.Init.RepetitionCounter = 0; + htim8.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; + if (HAL_TIM_Base_Init(&htim8) != HAL_OK) + { + Error_Handler(); + } + sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; + if (HAL_TIM_ConfigClockSource(&htim8, &sClockSourceConfig) != HAL_OK) + { + Error_Handler(); + } + if (HAL_TIM_PWM_Init(&htim8) != HAL_OK) + { + Error_Handler(); + } + if (HAL_TIM_OC_Init(&htim8) != HAL_OK) + { + Error_Handler(); + } + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim8, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + sConfigOC.OCMode = TIM_OCMODE_PWM1; + sConfigOC.Pulse = 0; + sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; + sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH; + sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; + sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; + sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET; + if (HAL_TIM_PWM_ConfigChannel(&htim8, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) + { + Error_Handler(); + } + sConfigOC.OCMode = TIM_OCMODE_TIMING; + if (HAL_TIM_OC_ConfigChannel(&htim8, &sConfigOC, TIM_CHANNEL_2) != HAL_OK) + { + Error_Handler(); + } + if (HAL_TIM_OC_ConfigChannel(&htim8, &sConfigOC, TIM_CHANNEL_3) != HAL_OK) + { + Error_Handler(); + } + if (HAL_TIM_OC_ConfigChannel(&htim8, &sConfigOC, TIM_CHANNEL_4) != HAL_OK) + { + Error_Handler(); + } + sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE; + sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE; + sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF; + sBreakDeadTimeConfig.DeadTime = 0; + sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE; + sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH; + sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE; + if (HAL_TIMEx_ConfigBreakDeadTime(&htim8, &sBreakDeadTimeConfig) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM8_Init 2 */ + + /* USER CODE END TIM8_Init 2 */ + HAL_TIM_MspPostInit(&htim8); + +} + +/** * @brief USART1 Initialization Function * @param None * @retval None @@ -389,12 +410,10 @@ static void MX_GPIO_Init(void) HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); /*Configure GPIO pins : PC13 PC0 PC1 PC2 - PC3 PC4 PC5 PC6 - PC7 PC8 PC9 PC10 + PC3 PC4 PC5 PC10 PC11 PC12 */ GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2 - |GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6 - |GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10 + |GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_10 |GPIO_PIN_11|GPIO_PIN_12; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); @@ -410,9 +429,11 @@ static void MX_GPIO_Init(void) GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); - /*Configure GPIO pins : PA4 PA5 PA6 PA7 + /*Configure GPIO pins : PA0 PA1 PA2 PA3 + PA4 PA5 PA6 PA7 PA8 PA11 PA12 PA15 */ - GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7 + GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 + |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7 |GPIO_PIN_8|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_15; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); diff --git a/Core/Src/stm32f1xx_hal_msp.c b/Core/Src/stm32f1xx_hal_msp.c index 0777d4b..200d889 100644 --- a/Core/Src/stm32f1xx_hal_msp.c +++ b/Core/Src/stm32f1xx_hal_msp.c @@ -94,18 +94,7 @@ void HAL_MspInit(void) */ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base) { - if(htim_base->Instance==TIM5) - { - /* USER CODE BEGIN TIM5_MspInit 0 */ - - /* USER CODE END TIM5_MspInit 0 */ - /* Peripheral clock enable */ - __HAL_RCC_TIM5_CLK_ENABLE(); - /* USER CODE BEGIN TIM5_MspInit 1 */ - - /* USER CODE END TIM5_MspInit 1 */ - } - else if(htim_base->Instance==TIM6) + if(htim_base->Instance==TIM6) { /* USER CODE BEGIN TIM6_MspInit 0 */ @@ -130,33 +119,44 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base) /* USER CODE END TIM7_MspInit 1 */ } + else if(htim_base->Instance==TIM8) + { + /* USER CODE BEGIN TIM8_MspInit 0 */ + + /* USER CODE END TIM8_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM8_CLK_ENABLE(); + /* USER CODE BEGIN TIM8_MspInit 1 */ + + /* USER CODE END TIM8_MspInit 1 */ + } } void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim) { GPIO_InitTypeDef GPIO_InitStruct = {0}; - if(htim->Instance==TIM5) + if(htim->Instance==TIM8) { - /* USER CODE BEGIN TIM5_MspPostInit 0 */ + /* USER CODE BEGIN TIM8_MspPostInit 0 */ - /* USER CODE END TIM5_MspPostInit 0 */ + /* USER CODE END TIM8_MspPostInit 0 */ - __HAL_RCC_GPIOA_CLK_ENABLE(); - /**TIM5 GPIO Configuration - PA0-WKUP ------> TIM5_CH1 - PA1 ------> TIM5_CH2 - PA2 ------> TIM5_CH3 - PA3 ------> TIM5_CH4 + __HAL_RCC_GPIOC_CLK_ENABLE(); + /**TIM8 GPIO Configuration + PC6 ------> TIM8_CH1 + PC7 ------> TIM8_CH2 + PC8 ------> TIM8_CH3 + PC9 ------> TIM8_CH4 */ - GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3; + GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); - /* USER CODE BEGIN TIM5_MspPostInit 1 */ + /* USER CODE BEGIN TIM8_MspPostInit 1 */ - /* USER CODE END TIM5_MspPostInit 1 */ + /* USER CODE END TIM8_MspPostInit 1 */ } } @@ -168,18 +168,7 @@ void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim) */ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base) { - if(htim_base->Instance==TIM5) - { - /* USER CODE BEGIN TIM5_MspDeInit 0 */ - - /* USER CODE END TIM5_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_TIM5_CLK_DISABLE(); - /* USER CODE BEGIN TIM5_MspDeInit 1 */ - - /* USER CODE END TIM5_MspDeInit 1 */ - } - else if(htim_base->Instance==TIM6) + if(htim_base->Instance==TIM6) { /* USER CODE BEGIN TIM6_MspDeInit 0 */ @@ -204,6 +193,17 @@ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base) /* USER CODE END TIM7_MspDeInit 1 */ } + else if(htim_base->Instance==TIM8) + { + /* USER CODE BEGIN TIM8_MspDeInit 0 */ + + /* USER CODE END TIM8_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM8_CLK_DISABLE(); + /* USER CODE BEGIN TIM8_MspDeInit 1 */ + + /* USER CODE END TIM8_MspDeInit 1 */ + } } diff --git a/README.md b/README.md index ffd323f..5d9994e 100644 --- a/README.md +++ b/README.md @@ -9,10 +9,19 @@ STM32 引脚分配: 灯光强度PWM4路输出: - TIM5_CH1:PA0 - TIM5_CH2:PA1 - TIM5_CH3:PA2 - TIM5_CH4:PA3 + TIM8_CH1:PC6 + TIM8_CH2:PC7 + TIM8_CH3:PC8 + TIM8_CH4:PA9 + + 输入捕获引脚: + PA7 + 输出引脚: + CH1:PA1 + CH2:PA2 + CH3:PA3 + CH4:PA4 + CH1|CH2|CH3|CH4 :PA5 ``` diff --git a/light_src_ctrl_stm32_port.ioc b/light_src_ctrl_stm32_port.ioc index cf5f69e..0357287 100644 --- a/light_src_ctrl_stm32_port.ioc +++ b/light_src_ctrl_stm32_port.ioc @@ -32,9 +32,9 @@ Mcu.IP0=DMA Mcu.IP1=NVIC Mcu.IP2=RCC Mcu.IP3=SYS -Mcu.IP4=TIM5 -Mcu.IP5=TIM6 -Mcu.IP6=TIM7 +Mcu.IP4=TIM6 +Mcu.IP5=TIM7 +Mcu.IP6=TIM8 Mcu.IP7=USART1 Mcu.IPNb=8 Mcu.Name=STM32F103Z(C-D-E)Tx @@ -44,15 +44,15 @@ Mcu.Pin1=PC15-OSC32_OUT Mcu.Pin10=PA13 Mcu.Pin11=PA14 Mcu.Pin12=VP_SYS_VS_tim4 -Mcu.Pin13=VP_TIM5_VS_ClockSourceINT -Mcu.Pin14=VP_TIM6_VS_ClockSourceINT -Mcu.Pin15=VP_TIM7_VS_ClockSourceINT +Mcu.Pin13=VP_TIM6_VS_ClockSourceINT +Mcu.Pin14=VP_TIM7_VS_ClockSourceINT +Mcu.Pin15=VP_TIM8_VS_ClockSourceINT Mcu.Pin2=OSC_IN Mcu.Pin3=OSC_OUT -Mcu.Pin4=PA0-WKUP -Mcu.Pin5=PA1 -Mcu.Pin6=PA2 -Mcu.Pin7=PA3 +Mcu.Pin4=PC6 +Mcu.Pin5=PC7 +Mcu.Pin6=PC8 +Mcu.Pin7=PC9 Mcu.Pin8=PA9 Mcu.Pin9=PA10 Mcu.PinsNb=16 @@ -83,22 +83,22 @@ OSC_IN.Mode=HSE-External-Oscillator OSC_IN.Signal=RCC_OSC_IN OSC_OUT.Mode=HSE-External-Oscillator OSC_OUT.Signal=RCC_OSC_OUT -PA0-WKUP.Signal=S_TIM5_CH1 -PA1.Signal=S_TIM5_CH2 PA10.Mode=Asynchronous PA10.Signal=USART1_RX PA13.Mode=Serial_Wire PA13.Signal=SYS_JTMS-SWDIO PA14.Mode=Serial_Wire PA14.Signal=SYS_JTCK-SWCLK -PA2.Signal=S_TIM5_CH3 -PA3.Signal=S_TIM5_CH4 PA9.Mode=Asynchronous PA9.Signal=USART1_TX PC14-OSC32_IN.Mode=LSE-External-Oscillator PC14-OSC32_IN.Signal=RCC_OSC32_IN PC15-OSC32_OUT.Mode=LSE-External-Oscillator PC15-OSC32_OUT.Signal=RCC_OSC32_OUT +PC6.Signal=S_TIM8_CH1 +PC7.Signal=S_TIM8_CH2 +PC8.Signal=S_TIM8_CH3 +PC9.Signal=S_TIM8_CH4 PinOutPanel.RotationAngle=0 ProjectManager.AskForMigrate=true ProjectManager.BackupPrevious=false @@ -130,7 +130,7 @@ ProjectManager.ToolChainLocation= ProjectManager.UAScriptAfterPath= ProjectManager.UAScriptBeforePath= ProjectManager.UnderRoot=true -ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_USART1_UART_Init-USART1-false-HAL-true,5-MX_TIM6_Init-TIM6-false-HAL-true,6-MX_TIM7_Init-TIM7-false-HAL-true +ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_USART1_UART_Init-USART1-false-HAL-true,5-MX_TIM6_Init-TIM6-false-HAL-true,6-MX_TIM7_Init-TIM7-false-HAL-true,7-MX_TIM5_Init-TIM5-false-HAL-true RCC.ADCFreqValue=36000000 RCC.AHBFreq_Value=72000000 RCC.APB1CLKDivider=RCC_HCLK_DIV2 @@ -157,35 +157,34 @@ RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK RCC.TimSysFreq_Value=72000000 RCC.USBFreq_Value=72000000 RCC.VCOOutput2Freq_Value=8000000 -SH.S_TIM5_CH1.0=TIM5_CH1,PWM Generation1 CH1 -SH.S_TIM5_CH1.ConfNb=1 -SH.S_TIM5_CH2.0=TIM5_CH2,PWM Generation2 CH2 -SH.S_TIM5_CH2.ConfNb=1 -SH.S_TIM5_CH3.0=TIM5_CH3,PWM Generation3 CH3 -SH.S_TIM5_CH3.ConfNb=1 -SH.S_TIM5_CH4.0=TIM5_CH4,PWM Generation4 CH4 -SH.S_TIM5_CH4.ConfNb=1 -TIM5.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_ENABLE -TIM5.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1 -TIM5.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2 -TIM5.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3 -TIM5.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4 -TIM5.IPParameters=Prescaler,Period,AutoReloadPreload,Channel-PWM Generation1 CH1,Channel-PWM Generation2 CH2,Channel-PWM Generation3 CH3,Channel-PWM Generation4 CH4 -TIM5.Period=1000 -TIM5.Prescaler=71 +SH.S_TIM8_CH1.0=TIM8_CH1,PWM Generation1 CH1 +SH.S_TIM8_CH1.ConfNb=1 +SH.S_TIM8_CH2.0=TIM8_CH2,Output Compare2 CH2 +SH.S_TIM8_CH2.ConfNb=1 +SH.S_TIM8_CH3.0=TIM8_CH3,Output Compare3 CH3 +SH.S_TIM8_CH3.ConfNb=1 +SH.S_TIM8_CH4.0=TIM8_CH4,Output Compare4 CH4 +SH.S_TIM8_CH4.ConfNb=1 TIM7.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_ENABLE TIM7.IPParameters=AutoReloadPreload,Prescaler,Period -TIM7.Period=1000 +TIM7.Period=100 TIM7.Prescaler=71 +TIM8.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_ENABLE +TIM8.Channel-Output\ Compare2\ CH2=TIM_CHANNEL_2 +TIM8.Channel-Output\ Compare3\ CH3=TIM_CHANNEL_3 +TIM8.Channel-Output\ Compare4\ CH4=TIM_CHANNEL_4 +TIM8.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1 +TIM8.IPParameters=Channel-PWM Generation1 CH1,Channel-Output Compare2 CH2,Channel-Output Compare3 CH3,Channel-Output Compare4 CH4,AutoReloadPreload,Prescaler +TIM8.Prescaler=71 USART1.IPParameters=VirtualMode USART1.VirtualMode=VM_ASYNC VP_SYS_VS_tim4.Mode=TIM4 VP_SYS_VS_tim4.Signal=SYS_VS_tim4 -VP_TIM5_VS_ClockSourceINT.Mode=Internal -VP_TIM5_VS_ClockSourceINT.Signal=TIM5_VS_ClockSourceINT VP_TIM6_VS_ClockSourceINT.Mode=Enable_Timer VP_TIM6_VS_ClockSourceINT.Signal=TIM6_VS_ClockSourceINT VP_TIM7_VS_ClockSourceINT.Mode=Enable_Timer VP_TIM7_VS_ClockSourceINT.Signal=TIM7_VS_ClockSourceINT +VP_TIM8_VS_ClockSourceINT.Mode=Internal +VP_TIM8_VS_ClockSourceINT.Signal=TIM8_VS_ClockSourceINT board=custom isbadioc=false diff --git a/usrc/light_intensity_ctrl.c b/usrc/light_intensity_ctrl.c index 65f0361..10a6895 100644 --- a/usrc/light_intensity_ctrl.c +++ b/usrc/light_intensity_ctrl.c @@ -1,5 +1,6 @@ #include "light_intensity_ctrl.h" +#include "config_service.h" extern TIM_HandleTypeDef LIGHT_INTENSITY_TIM; static uint32_t m_light_intensity = 50; @@ -52,4 +53,9 @@ void LightIntensityCtrl_start() { ZSTM32_CHECK(HAL_TIM_PWM_Start(m_htim, TIM_CHANNEL_2)); ZSTM32_CHECK(HAL_TIM_PWM_Start(m_htim, TIM_CHANNEL_3)); ZSTM32_CHECK(HAL_TIM_PWM_Start(m_htim, TIM_CHANNEL_4)); +} + +void LightIntensityCtrl_updatePraram() { + LightIntensityCtrl_setIntensity(config_get()->light_intensity); + LightIntensityCtrl_start(); } \ No newline at end of file diff --git a/usrc/light_intensity_ctrl.h b/usrc/light_intensity_ctrl.h index 3c63620..838349f 100644 --- a/usrc/light_intensity_ctrl.h +++ b/usrc/light_intensity_ctrl.h @@ -18,6 +18,8 @@ void LightIntensityCtrl_setIntensity(uint32_t intensity); uint32_t LightIntensityCtrl_getIntensity(); void LightIntensityCtrl_start(); +void LightIntensityCtrl_updatePraram(); + #ifdef __cplusplus } #endif \ No newline at end of file diff --git a/usrc/pluse_generator.c b/usrc/pluse_generator.c new file mode 100644 index 0000000..1ef1b99 --- /dev/null +++ b/usrc/pluse_generator.c @@ -0,0 +1,99 @@ +#include "pluse_generator.h" + +#include "config_service.h" + +extern TIM_HandleTypeDef PLUSE_CTRL_TIMER; + +static zgpio_t trigger_io; +static zgpio_t ch_io[4]; +static zgpio_t chx_io; +static uint32_t m_cnt; + +static uint32_t m_pluse_width_cnt; +static uint32_t m_pluse_interval_cnt; + +static uint32_t m_pluse_num; +static uint32_t m_pluse_state; // 0:低,1:高 + +static inline void set_io_state(int off, bool state); + +/******************************************************************************* + * 中断 * + *******************************************************************************/ +void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { + if (GPIO_Pin == trigger_io.pinoff) { + // 启动定时器,同时触发第一个波形 + + m_cnt = 0; + m_pluse_state = 0; + m_pluse_num = 0; + + HAL_TIM_Base_Start_IT(&PLUSE_CTRL_TIMER); + set_io_state(0, true); + } +} + +static inline void pluse_wave_schedule() { + if (m_pluse_state == 0) { + if (m_cnt >= m_pluse_interval_cnt) { + m_pluse_state = 1; + m_pluse_num++; + m_cnt = 0; + set_io_state(m_pluse_num, 1); + } + } + + else if (m_pluse_state == 1) { + if (m_cnt >= m_pluse_width_cnt) { + m_pluse_state = 0; + m_cnt = 0; + set_io_state(m_pluse_num, 0); + if (m_pluse_num == 3) { + HAL_TIM_Base_Stop(&PLUSE_CTRL_TIMER); + } + + if (m_pluse_interval_cnt == 0) { + m_pluse_state = 1; + m_pluse_num++; + m_cnt = 0; + set_io_state(m_pluse_num, 1); + } + } + } +} + +void tim7_irq_trigger() { + m_cnt++; + pluse_wave_schedule(); +} + +/******************************************************************************* + * FUNCTION * + *******************************************************************************/ +static inline void set_io_state(int off, bool state) { + zgpio_write(&ch_io[off], state); + zgpio_write(&chx_io, state); +} + +void PluseGenerator_init() { + // + + ZASSERT(&PLUSE_CTRL_TIMER == &htim7); + ZASSERT(PLUSE_CTRL_TIMER.Init.AutoReloadPreload = 100); + ZASSERT(PLUSE_CTRL_TIMER.Init.Prescaler = 71); + // PLUSE_CTRL_TIMER.Init. + + PluseGenerator_updatePraram(); + + zgpio_init_as_output(&ch_io[0], PLUSE_OUTPUT_CH0, kxs_gpio_nopull, false, false); + zgpio_init_as_output(&ch_io[1], PLUSE_OUTPUT_CH1, kxs_gpio_nopull, false, false); + zgpio_init_as_output(&ch_io[2], PLUSE_OUTPUT_CH2, kxs_gpio_nopull, false, false); + zgpio_init_as_output(&ch_io[3], PLUSE_OUTPUT_CH3, kxs_gpio_nopull, false, false); + zgpio_init_as_output(&chx_io, PLUSE_OUTPUT_CHX, kxs_gpio_nopull, false, false); + zgpio_init_as_input(&trigger_io, PLUSE_TRIGGER, kxs_gpio_nopull, kxs_gpio_rising_irq, false); +} + +void PluseGenerator_updatePraram() { + m_pluse_width_cnt = config_get()->pulse_width_ms * 10; + m_pluse_interval_cnt = config_get()->pulse_interval_ms * 10; +} \ No newline at end of file diff --git a/usrc/pluse_generator.h b/usrc/pluse_generator.h new file mode 100644 index 0000000..76edfbe --- /dev/null +++ b/usrc/pluse_generator.h @@ -0,0 +1,13 @@ +#pragma once +#include + +#include "zlib.h" +#ifdef __cplusplus +extern "C" { +#endif + +void PluseGenerator_init(); +void PluseGenerator_updatePraram(); +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/usrc/project_configs.h b/usrc/project_configs.h index ab0c24a..5d7bc61 100644 --- a/usrc/project_configs.h +++ b/usrc/project_configs.h @@ -16,7 +16,16 @@ #define PC_NVS_ENABLE 1 -#define LIGHT_INTENSITY_TIM htim5 +#define LIGHT_INTENSITY_TIM htim8 + + +#define PLUSE_CTRL_TIMER htim7 +#define PLUSE_TRIGGER PA7 +#define PLUSE_OUTPUT_CH0 PA1 +#define PLUSE_OUTPUT_CH1 PA2 +#define PLUSE_OUTPUT_CH2 PA3 +#define PLUSE_OUTPUT_CH3 PA4 +#define PLUSE_OUTPUT_CHX PA5 // ===================================================================== // ===================================================================== diff --git a/usrc/umain.c b/usrc/umain.c index b364137..7c524df 100644 --- a/usrc/umain.c +++ b/usrc/umain.c @@ -5,6 +5,7 @@ #include "config_service.h" #include "light_intensity_ctrl.h" #include "main.h" +#include "pluse_generator.h" #include "zlib.h" #define TAG "MAIN" @@ -15,19 +16,16 @@ /******************************************************************************* * DECLEAR * *******************************************************************************/ -extern TIM_HandleTypeDef htim6; -extern TIM_HandleTypeDef htim7; +extern TIM_HandleTypeDef htim6; + extern DMA_HandleTypeDef hdma_usart1_rx; extern DMA_HandleTypeDef hdma_usart1_tx; extern UART_HandleTypeDef huart1; static uint8_t g_uart_rx_buf[128]; static uint32_t g_uart_rx_buf_index = 0; -static uint32_t g_count = 0; -void tim7_irq_trigger() { g_count++; } void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) { g_uart_rx_buf_index = Size; } -void start_generat_wave() { HAL_TIM_Base_Start_IT(&htim7); } bool uart_is_rxing(UART_HandleTypeDef *huart) { // uint32_t uartstate = HAL_UART_GetState(huart); @@ -82,8 +80,7 @@ void prv_process_uart_rx_data() { return; } cfg->pulse_width_ms = val; - LightIntensityCtrl_setIntensity(val); - LightIntensityCtrl_start(); + LightIntensityCtrl_updatePraram(); printf("OK\n"); } else if (strcmp(param, "pulse_interval_ms") == 0) { if (val > 100) { @@ -91,6 +88,8 @@ void prv_process_uart_rx_data() { return; } cfg->pulse_interval_ms = val; + LightIntensityCtrl_updatePraram(); + printf("OK\n"); } else if (strcmp(param, "cmd_echo") == 0) { if (val != 0 && val != 1) { @@ -110,8 +109,10 @@ void prv_process_uart_rx_data() { printf("OK,%ld\n", cfg->light_intensity); } else if (strcmp(param, "pulse_width_ms") == 0) { printf("OK,%ld\n", cfg->pulse_width_ms); + PluseGenerator_updatePraram(); } else if (strcmp(param, "pulse_interval_ms") == 0) { printf("OK,%ld\n", cfg->pulse_interval_ms); + PluseGenerator_updatePraram(); } else if (strcmp(param, "cmd_echo") == 0) { printf("OK,%ld\n", cfg->cmd_echo); } @@ -158,6 +159,8 @@ void umain() { LightIntensityCtrl_setIntensity(config_get()->light_intensity); LightIntensityCtrl_start(); + PluseGenerator_init(); + while (true) { /** * @brief 接收串口消息并处理