diff --git a/Core/Src/main.c b/Core/Src/main.c index 372a3fd..6e7cf9e 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -40,6 +40,7 @@ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ +TIM_HandleTypeDef htim5; TIM_HandleTypeDef htim6; TIM_HandleTypeDef htim7; TIM_HandleTypeDef htim8; @@ -60,6 +61,7 @@ static void MX_USART1_UART_Init(void); static void MX_TIM6_Init(void); static void MX_TIM7_Init(void); static void MX_TIM8_Init(void); +static void MX_TIM5_Init(void); /* USER CODE BEGIN PFP */ /* USER CODE END PFP */ @@ -102,6 +104,7 @@ int main(void) MX_TIM6_Init(); MX_TIM7_Init(); MX_TIM8_Init(); + MX_TIM5_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ @@ -159,6 +162,73 @@ 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 = 3; + htim5.Init.CounterMode = TIM_COUNTERMODE_UP; + htim5.Init.Period = 65535; + 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(); + } + /* USER CODE BEGIN TIM5_Init 2 */ + + /* USER CODE END TIM5_Init 2 */ + HAL_TIM_MspPostInit(&htim5); + +} + +/** * @brief TIM6 Initialization Function * @param None * @retval None @@ -424,12 +494,12 @@ static void MX_GPIO_Init(void) GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); - /*Configure GPIO pins : PA0 PA1 PA2 PA3 - PA4 PA5 PA6 PA7 - PA8 PA11 PA12 PA15 */ - 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; + /*Configure GPIO pins : PA3 PA4 PA5 PA6 + PA7 PA8 PA11 PA12 + PA15 */ + GPIO_InitStruct.Pin = 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 200d889..c81d4aa 100644 --- a/Core/Src/stm32f1xx_hal_msp.c +++ b/Core/Src/stm32f1xx_hal_msp.c @@ -63,7 +63,7 @@ extern DMA_HandleTypeDef hdma_usart1_tx; /* USER CODE END 0 */ void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); - /** + /** * Initializes the Global MSP. */ void HAL_MspInit(void) @@ -94,7 +94,18 @@ void HAL_MspInit(void) */ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base) { - if(htim_base->Instance==TIM6) + 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) { /* USER CODE BEGIN TIM6_MspInit 0 */ @@ -136,7 +147,27 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base) void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim) { GPIO_InitTypeDef GPIO_InitStruct = {0}; - if(htim->Instance==TIM8) + if(htim->Instance==TIM5) + { + /* USER CODE BEGIN TIM5_MspPostInit 0 */ + + /* USER CODE END TIM5_MspPostInit 0 */ + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**TIM5 GPIO Configuration + PA0-WKUP ------> TIM5_CH1 + PA1 ------> TIM5_CH2 + PA2 ------> TIM5_CH3 + */ + GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN TIM5_MspPostInit 1 */ + + /* USER CODE END TIM5_MspPostInit 1 */ + } + else if(htim->Instance==TIM8) { /* USER CODE BEGIN TIM8_MspPostInit 0 */ @@ -168,7 +199,18 @@ void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim) */ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base) { - if(htim_base->Instance==TIM6) + 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) { /* USER CODE BEGIN TIM6_MspDeInit 0 */ diff --git a/Core/Src/stm32f1xx_it.c b/Core/Src/stm32f1xx_it.c index 7531ecc..7cf39e0 100644 --- a/Core/Src/stm32f1xx_it.c +++ b/Core/Src/stm32f1xx_it.c @@ -265,13 +265,13 @@ void TIM7_IRQHandler(void) { /* USER CODE BEGIN TIM7_IRQn 0 */ - extern void tim7_irq_trigger(); + // extern void tim7_irq_trigger(); - if (__HAL_TIM_GET_FLAG(&htim7, TIM_FLAG_UPDATE) != RESET) { - if (__HAL_TIM_GET_IT_SOURCE(&htim7, TIM_IT_UPDATE) != RESET) { - tim7_irq_trigger(); - } - } + // if (__HAL_TIM_GET_FLAG(&htim7, TIM_FLAG_UPDATE) != RESET) { + // if (__HAL_TIM_GET_IT_SOURCE(&htim7, TIM_IT_UPDATE) != RESET) { + // tim7_irq_trigger(); + // } + // } /* USER CODE END TIM7_IRQn 0 */ HAL_TIM_IRQHandler(&htim7); /* USER CODE BEGIN TIM7_IRQn 1 */ diff --git a/bak/pluse_generator.c b/bak/pluse_generator.c deleted file mode 100644 index 4f0b3f6..0000000 --- a/bak/pluse_generator.c +++ /dev/null @@ -1,101 +0,0 @@ -#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 int32_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) { - // 启动定时器,同时触发第一个波形 - - // 这里之所以设置成-1,是因为不知道啥原因,第一个脉冲会少一个定时器周期 - m_cnt = -1; - - m_pluse_state = 1; - m_pluse_num = 0; - __HAL_TIM_SET_COUNTER(&PLUSE_CTRL_TIMER, 1); - 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_pulldown, kxs_gpio_rising_irq, false); -} - -void PluseGenerator_updatePraram() { - m_pluse_width_cnt = config_get()->pulse_width_us * 10; - m_pluse_interval_cnt = config_get()->pulse_interval_us * 10; -} \ No newline at end of file diff --git a/bak/pluse_generator.h b/bak/pluse_generator.h deleted file mode 100644 index 76edfbe..0000000 --- a/bak/pluse_generator.h +++ /dev/null @@ -1,13 +0,0 @@ -#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/light_src_ctrl_stm32_port.ioc b/light_src_ctrl_stm32_port.ioc index 52622a8..02899e5 100644 --- a/light_src_ctrl_stm32_port.ioc +++ b/light_src_ctrl_stm32_port.ioc @@ -32,30 +32,35 @@ Mcu.IP0=DMA Mcu.IP1=NVIC Mcu.IP2=RCC Mcu.IP3=SYS -Mcu.IP4=TIM6 -Mcu.IP5=TIM7 -Mcu.IP6=TIM8 -Mcu.IP7=USART1 -Mcu.IPNb=8 +Mcu.IP4=TIM5 +Mcu.IP5=TIM6 +Mcu.IP6=TIM7 +Mcu.IP7=TIM8 +Mcu.IP8=USART1 +Mcu.IPNb=9 Mcu.Name=STM32F103Z(C-D-E)Tx Mcu.Package=LQFP144 Mcu.Pin0=PC14-OSC32_IN Mcu.Pin1=PC15-OSC32_OUT -Mcu.Pin10=PA13 -Mcu.Pin11=PA14 -Mcu.Pin12=VP_SYS_VS_tim4 -Mcu.Pin13=VP_TIM6_VS_ClockSourceINT -Mcu.Pin14=VP_TIM7_VS_ClockSourceINT -Mcu.Pin15=VP_TIM8_VS_ClockSourceINT +Mcu.Pin10=PC9 +Mcu.Pin11=PA9 +Mcu.Pin12=PA10 +Mcu.Pin13=PA13 +Mcu.Pin14=PA14 +Mcu.Pin15=VP_SYS_VS_tim4 +Mcu.Pin16=VP_TIM5_VS_ClockSourceINT +Mcu.Pin17=VP_TIM6_VS_ClockSourceINT +Mcu.Pin18=VP_TIM7_VS_ClockSourceINT +Mcu.Pin19=VP_TIM8_VS_ClockSourceINT Mcu.Pin2=OSC_IN Mcu.Pin3=OSC_OUT -Mcu.Pin4=PC6 -Mcu.Pin5=PC7 -Mcu.Pin6=PC8 -Mcu.Pin7=PC9 -Mcu.Pin8=PA9 -Mcu.Pin9=PA10 -Mcu.PinsNb=16 +Mcu.Pin4=PA0-WKUP +Mcu.Pin5=PA1 +Mcu.Pin6=PA2 +Mcu.Pin7=PC6 +Mcu.Pin8=PC7 +Mcu.Pin9=PC8 +Mcu.PinsNb=20 Mcu.ThirdPartyNb=0 Mcu.UserConstants= Mcu.UserName=STM32F103ZETx @@ -83,12 +88,15 @@ 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 PA9.Mode=Asynchronous PA9.Signal=USART1_TX PC14-OSC32_IN.Mode=LSE-External-Oscillator @@ -130,7 +138,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,7-MX_TIM8_Init-TIM8-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_TIM8_Init-TIM8-false-HAL-true,8-MX_TIM5_Init-TIM5-false-HAL-true RCC.ADCFreqValue=36000000 RCC.AHBFreq_Value=72000000 RCC.APB1CLKDivider=RCC_HCLK_DIV2 @@ -157,6 +165,12 @@ 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_TIM8_CH1.0=TIM8_CH1,PWM Generation1 CH1 SH.S_TIM8_CH1.ConfNb=1 SH.S_TIM8_CH2.0=TIM8_CH2,PWM Generation2 CH2 @@ -165,6 +179,12 @@ SH.S_TIM8_CH3.0=TIM8_CH3,PWM Generation3 CH3 SH.S_TIM8_CH3.ConfNb=1 SH.S_TIM8_CH4.0=TIM8_CH4,PWM Generation4 CH4 SH.S_TIM8_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.IPParameters=Channel-PWM Generation1 CH1,Channel-PWM Generation2 CH2,Channel-PWM Generation3 CH3,Prescaler,AutoReloadPreload +TIM5.Prescaler=3 TIM7.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_ENABLE TIM7.IPParameters=AutoReloadPreload,Prescaler,Period TIM7.Period=65534 @@ -180,6 +200,8 @@ 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 diff --git a/usrc/config_service.c b/usrc/config_service.c index ad444aa..e8c102b 100644 --- a/usrc/config_service.c +++ b/usrc/config_service.c @@ -6,10 +6,13 @@ static config_t _default_val_config; #define TAG "config" static void create_default_config(config_t *default_cfg) { // - default_cfg->light_intensity = 50; - default_cfg->pulse_width_us = 25; - default_cfg->pulse_interval_us = 2; - default_cfg->cmd_echo = 1; + default_cfg->light_intensity = 50; + default_cfg->pulse_width_x25ns = 30 * 4; + default_cfg->pulse_interval_x25ns = 1 * 4; + default_cfg->shutter_delay_x25ns = 1 * 4; + default_cfg->shutter_delay_x25ns = 1 * 4; + default_cfg->trigger_mirror = 1; + default_cfg->cmd_echo = 1; } void config_init(void) { diff --git a/usrc/config_service.h b/usrc/config_service.h index 2bc7d23..3a82c46 100644 --- a/usrc/config_service.h +++ b/usrc/config_service.h @@ -8,11 +8,13 @@ extern "C" { typedef struct { uint32_t config_mark; - uint32_t light_intensity; // 光强 0->100 - uint32_t pulse_width_us; // 脉冲宽度 - uint32_t pulse_interval_us; // 脉冲间隔 - uint32_t cmd_echo; // 命令回显 - uint32_t checksum; // + uint32_t light_intensity; // 光强 0->100 + uint32_t pulse_width_x25ns; // 脉冲宽度 + uint32_t pulse_interval_x25ns; // 脉冲间隔 + uint32_t shutter_delay_x25ns; // 快门延时 + uint32_t trigger_mirror; // 触发镜像 + uint32_t cmd_echo; // 命令回显 + uint32_t checksum; // } config_t; void config_init(void); diff --git a/usrc/pluse_generator.c b/usrc/pluse_generator.c index 7864028..9912956 100644 --- a/usrc/pluse_generator.c +++ b/usrc/pluse_generator.c @@ -2,144 +2,62 @@ #include "config_service.h" -extern TIM_HandleTypeDef PLUSE_CTRL_TIMER; - -#define ZARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr[0])) - -static zgpio_t trigger_io; -static zgpio_t ch_io[4]; -static zgpio_t chx_io; - -static inline void set_io_state(int off, bool state); - -void tim7_irq_trigger() {} - -typedef enum { - kaction_set_io0_high = 0, - kaction_set_io0_low, - kaction_set_io1_high, - kaction_set_io1_low, - kaction_set_io2_high, - kaction_set_io2_low, - kaction_set_io3_high, - kaction_set_io3_low, -} step_action_t; - -typedef struct { - step_action_t action; - int32_t tp; -} step_t; - -step_t m_steps[] = { // - {kaction_set_io0_high, 0}, // - {kaction_set_io0_low, 0}, // - {kaction_set_io1_high, 0}, // - {kaction_set_io1_low, 0}, // - {kaction_set_io2_high, 0}, // - {kaction_set_io2_low, 0}, // - {kaction_set_io3_high, 0}, // - {kaction_set_io3_low, 0}}; - -/******************************************************************************* - * 中断 * - *******************************************************************************/ - -void prv_delay_us(uint32_t us) { - for (uint32_t j = 0; j < us; j++) { - for (uint32_t i = 0; i < 350; i++) { - __NOP(); - } - } -} -static inline void set_io_state(int off, bool state) { - HAL_GPIO_WritePin(ch_io[off].gpio, ch_io[off].pinoff, state); - HAL_GPIO_WritePin(chx_io.gpio, chx_io.pinoff, state); -} - -void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { - if (GPIO_Pin != trigger_io.pinoff) { - return; - } - // 启动定时器,同时触发第一个波形 - - // 这里之所以设置成-1,是因为不知道啥原因,第一个脉冲会少一个定时器周期 - __HAL_TIM_SET_COUNTER(&PLUSE_CTRL_TIMER, 0); - HAL_TIM_Base_Start(&PLUSE_CTRL_TIMER); - - // set_io_state(0, true); - uint32_t counter = 0; - for (uint32_t i = 0; i < ZARRAY_SIZE(m_steps); i++) { - while ((int32_t)counter < m_steps[i].tp) { - counter = __HAL_TIM_GET_COUNTER(&PLUSE_CTRL_TIMER); - } - - switch (m_steps[i].action) { - case kaction_set_io0_high: - set_io_state(0, true); - break; - case kaction_set_io0_low: - set_io_state(0, false); - break; - case kaction_set_io1_high: - set_io_state(1, true); - break; - case kaction_set_io1_low: - set_io_state(1, false); - break; - case kaction_set_io2_high: - set_io_state(2, true); - break; - case kaction_set_io2_low: - set_io_state(2, false); - break; - case kaction_set_io3_high: - set_io_state(3, true); - break; - case kaction_set_io3_low: - set_io_state(3, false); - break; - default: - break; - } - } - - HAL_TIM_Base_Stop(&PLUSE_CTRL_TIMER); -} +extern TIM_HandleTypeDef PLUSE_CTRL_TIMER; +static TIM_HandleTypeDef* m_htim = &PLUSE_CTRL_TIMER; /******************************************************************************* * FUNCTION * *******************************************************************************/ +static zgpio_t trigger_mirror_ctrl_io; void PluseGenerator_init() { - // - - ZASSERT(&PLUSE_CTRL_TIMER == &htim7); - 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_pulldown, kxs_gpio_rising_irq, false); + // zgpio_init_as_output(&chx_io, PLUSE_OUTPUT_CHX, kxs_gpio_nopull, false, false); + zgpio_init_as_output(&trigger_mirror_ctrl_io, TRIGGER_MIRROR_CTRL_PIN, kxs_gpio_pullup, false, false); + PluseGenerator_cfg_update(); } -void PluseGenerator_updatePraram() { - config_t* cfg = config_get(); - - m_steps[kaction_set_io0_high].tp = 1 + ((cfg->pulse_width_us + cfg->pulse_interval_us) * 1) * 0; - m_steps[kaction_set_io0_low].tp = 1 + ((cfg->pulse_width_us + cfg->pulse_interval_us) * 1) * 0 + (cfg->pulse_width_us * 1); - m_steps[kaction_set_io1_high].tp = 1 + ((cfg->pulse_width_us + cfg->pulse_interval_us) * 1) * 1; - m_steps[kaction_set_io1_low].tp = 1 + ((cfg->pulse_width_us + cfg->pulse_interval_us) * 1) * 1 + (cfg->pulse_width_us * 1); - m_steps[kaction_set_io2_high].tp = 1 + ((cfg->pulse_width_us + cfg->pulse_interval_us) * 1) * 2; - m_steps[kaction_set_io2_low].tp = 1 + ((cfg->pulse_width_us + cfg->pulse_interval_us) * 1) * 2 + (cfg->pulse_width_us * 1); - m_steps[kaction_set_io3_high].tp = 1 + ((cfg->pulse_width_us + cfg->pulse_interval_us) * 1) * 3; - m_steps[kaction_set_io3_low].tp = 1 + ((cfg->pulse_width_us + cfg->pulse_interval_us) * 1) * 3 + (cfg->pulse_width_us * 1); - - for (uint32_t i = 0; i < ZARRAY_SIZE(m_steps); i++) { - // printf("m_steps[%d].tp = %d\n", i, m_steps[i].tp); - } +void PluseGenerator_cfg_update() { + uint32_t prescaler = 0; + uint32_t autoreload = 0; + config_t* cfg = NULL; + uint32_t timClkFreq; + ZASSERT(&PLUSE_CTRL_TIMER == &htim5); + + cfg = config_get(); + // timClkFreq = chip_get_timer_clock_sorce_freq(&PLUSE_CTRL_TIMER); + // ZASSERT(timClkFreq = 36000000); + + prescaler = 17; // 4M 0.25us + autoreload = 4 * 1000; // 1ms + + // m_htim-> + HAL_TIM_PWM_Stop(m_htim, TIM_CHANNEL_1); + HAL_TIM_PWM_Stop(m_htim, TIM_CHANNEL_2); + HAL_TIM_PWM_Stop(m_htim, TIM_CHANNEL_3); + + __HAL_TIM_SET_AUTORELOAD(m_htim, autoreload); + __HAL_TIM_SET_PRESCALER(m_htim, prescaler); + + // 配置模式 + TIM_OC_InitTypeDef sConfigOC = {0}; + sConfigOC.OCMode = TIM_OCMODE_PWM1; + sConfigOC.Pulse = 1; + sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; + sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; + sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; + sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET; + + sConfigOC.Pulse = cfg->pulse_width_x25ns; + ZSTM32_CHECK(HAL_TIM_PWM_ConfigChannel(m_htim, &sConfigOC, TIM_CHANNEL_1)); + sConfigOC.Pulse = cfg->pulse_interval_x25ns; + ZSTM32_CHECK(HAL_TIM_PWM_ConfigChannel(m_htim, &sConfigOC, TIM_CHANNEL_2)); + sConfigOC.Pulse = cfg->shutter_delay_x25ns; + ZSTM32_CHECK(HAL_TIM_PWM_ConfigChannel(m_htim, &sConfigOC, TIM_CHANNEL_3)); + + ZSTM32_CHECK(HAL_TIM_PWM_Start(m_htim, TIM_CHANNEL_1)); + ZSTM32_CHECK(HAL_TIM_PWM_Start(m_htim, TIM_CHANNEL_2)); + ZSTM32_CHECK(HAL_TIM_PWM_Start(m_htim, TIM_CHANNEL_3)); + + // TRIGGER_MIRROR_CTRL_PIN + zgpio_write(&trigger_mirror_ctrl_io, cfg->trigger_mirror); } diff --git a/usrc/pluse_generator.h b/usrc/pluse_generator.h index 76edfbe..853e68a 100644 --- a/usrc/pluse_generator.h +++ b/usrc/pluse_generator.h @@ -7,7 +7,7 @@ extern "C" { #endif void PluseGenerator_init(); -void PluseGenerator_updatePraram(); +void PluseGenerator_cfg_update(); #ifdef __cplusplus } #endif \ No newline at end of file diff --git a/usrc/project_configs.h b/usrc/project_configs.h index ce01d26..df151a1 100644 --- a/usrc/project_configs.h +++ b/usrc/project_configs.h @@ -1,35 +1,25 @@ #pragma once -#define PC_VERSION 1 -#define PC_MANUFACTURER0 ('i' | 'f' << 8 | 'l' << 16 | 'y' << 24) -#define PC_MANUFACTURER1 ('t' | 'o' << 8 | 'p' << 16 | '\0' << 24) +#define PC_VERSION 1 +#define PC_MANUFACTURER0 ('i' | 'f' << 8 | 'l' << 16 | 'y' << 24) +#define PC_MANUFACTURER1 ('t' | 'o' << 8 | 'p' << 16 | '\0' << 24) #define PC_DEBUG_UART huart1 #define PC_DEBUG_UART_DMA_HANDLER hdma_usart1_rx #define PC_DEBUG_UART_RX_BUF_SIZE 1024 #define PC_DEBUG_LIGHT_GPIO PB0 -#define PC_SYS_DELAY_US_TIMER htim6 // +#define PC_SYS_DELAY_US_TIMER htim6 // #define PC_IRQ_PREEMPTPRIORITY_DEFAULT 5 #define PC_NVS_ENABLE 1 - #define LIGHT_INTENSITY_TIM htim8 - -#define PLUSE_CTRL_TIMER htim7 -#define PLUSE_TRIGGER PA0 -#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 +#define PLUSE_CTRL_TIMER htim5 +#define TRIGGER_MIRROR_CTRL_PIN PA4 // ===================================================================== // ===================================================================== // ===================================================================== - -#define FACTORY_RESET_KEY PB1 -#define POWER_LED_PIN PB2 \ No newline at end of file diff --git a/usrc/umain.c b/usrc/umain.c index 47a23dd..404afbe 100644 --- a/usrc/umain.c +++ b/usrc/umain.c @@ -75,23 +75,43 @@ void prv_process_uart_rx_data() { cfg->light_intensity = val; LightIntensityCtrl_updatePraram(); printf("OK\n"); - } else if (strcmp(param, "pulse_width_us") == 0) { - if (val <= 0 || val > 100) { - printf("FAIL,pulse_width_us should be in range 1-100\n"); + } else if (strcmp(param, "pulse_width_x25ns") == 0) { + if (val <= 0 || val > 100 * 8) { + printf("FAIL,pulse_width_x25ns should be in range 1-800\n"); return; } - cfg->pulse_width_us = val; - PluseGenerator_updatePraram(); + cfg->pulse_width_x25ns = val; + PluseGenerator_cfg_update(); printf("OK\n"); - } else if (strcmp(param, "pulse_interval_us") == 0) { - if (val > 100) { - printf("FAIL,pulse_interval_us should be in range 0-100\n"); + } else if (strcmp(param, "pulse_interval_x25ns") == 0) { + if (val <= 0 || val > 100 * 8) { + printf("FAIL,pulse_interval_x25ns should be in range 1-800\n"); return; } - cfg->pulse_interval_us = val; - PluseGenerator_updatePraram(); + cfg->pulse_interval_x25ns = val; + PluseGenerator_cfg_update(); printf("OK\n"); - } else if (strcmp(param, "cmd_echo") == 0) { + } else if (strcmp(param, "shutter_delay_x25ns") == 0) { + if (val <= 0 || val > 100 * 8) { + printf("FAIL,shutter_delay_x25ns should be in range 1-800\n"); + return; + } + cfg->shutter_delay_x25ns = val; + PluseGenerator_cfg_update(); + printf("OK\n"); + } + + else if (strcmp(param, "trigger_mirror") == 0) { + if (val != 0 && val != 1) { + printf("FAIL,trigger_mirror should be 0 or 1\n"); + return; + } + cfg->trigger_mirror = val; + PluseGenerator_cfg_update(); + printf("OK\n"); + } + + else if (strcmp(param, "cmd_echo") == 0) { if (val != 0 && val != 1) { printf("FAIL,cmd_echo should be 0 or 1\n"); return; @@ -107,12 +127,14 @@ void prv_process_uart_rx_data() { const char *param = argc[1]; if (strcmp(param, "light_intensity") == 0) { printf("OK,%ld\n", cfg->light_intensity); - } else if (strcmp(param, "pulse_width_us") == 0) { - printf("OK,%ld\n", cfg->pulse_width_us); - PluseGenerator_updatePraram(); - } else if (strcmp(param, "pulse_interval_us") == 0) { - printf("OK,%ld\n", cfg->pulse_interval_us); - PluseGenerator_updatePraram(); + } else if (strcmp(param, "pulse_width_x25ns") == 0) { + printf("OK,%ld\n", cfg->pulse_width_x25ns); + } else if (strcmp(param, "pulse_interval_x25ns") == 0) { + printf("OK,%ld\n", cfg->pulse_interval_x25ns); + } else if (strcmp(param, "shutter_delay_x25ns") == 0) { + printf("OK,%ld\n", cfg->shutter_delay_x25ns); + } else if (strcmp(param, "trigger_mirror") == 0) { + printf("OK,%ld\n", cfg->trigger_mirror); } else if (strcmp(param, "cmd_echo") == 0) { printf("OK,%ld\n", cfg->cmd_echo); } @@ -136,8 +158,10 @@ void prv_process_uart_rx_data() { config_t *cfg = config_get(); printf("------ param list ------\n"); printf(" light_intensity : %ld\n", cfg->light_intensity); - printf(" pulse_width_us : %ld\n", cfg->pulse_width_us); - printf(" pulse_interval_us : %ld\n", cfg->pulse_interval_us); + printf(" pulse_width_x25ns : %ld\n", cfg->pulse_width_x25ns); + printf(" pulse_interval_x25ns : %ld\n", cfg->pulse_interval_x25ns); + printf(" shutter_delay_x25ns : %ld\n", cfg->shutter_delay_x25ns); + printf(" trigger_mirror : %ld\n", cfg->trigger_mirror); printf(" cmd_echo : %ld\n", cfg->cmd_echo); }