diff --git a/STM32/CM7/Core/Inc/main.h b/STM32/CM7/Core/Inc/main.h index 7cc1344..6792b7c 100644 --- a/STM32/CM7/Core/Inc/main.h +++ b/STM32/CM7/Core/Inc/main.h @@ -43,7 +43,7 @@ extern "C" { /* Exported constants --------------------------------------------------------*/ /* USER CODE BEGIN EC */ extern volatile global_state_t state_g; - +extern TIM_HandleTypeDef htim2; /* USER CODE END EC */ /* Exported macro ------------------------------------------------------------*/ @@ -51,6 +51,8 @@ extern volatile global_state_t state_g; /* USER CODE END EM */ +void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); + /* Exported functions prototypes ---------------------------------------------*/ void Error_Handler(void); diff --git a/STM32/CM7/Core/Src/main.c b/STM32/CM7/Core/Src/main.c index b8be124..12f8b09 100644 --- a/STM32/CM7/Core/Src/main.c +++ b/STM32/CM7/Core/Src/main.c @@ -330,6 +330,7 @@ static void MX_TIM2_Init(void) TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_IC_InitTypeDef sConfigIC = {0}; + TIM_OC_InitTypeDef sConfigOC = {0}; /* USER CODE BEGIN TIM2_Init 1 */ @@ -353,6 +354,10 @@ static void MX_TIM2_Init(void) { Error_Handler(); } + if (HAL_TIM_OC_Init(&htim2) != HAL_OK) + { + Error_Handler(); + } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) @@ -372,10 +377,20 @@ static void MX_TIM2_Init(void) { Error_Handler(); } + sConfigOC.OCMode = TIM_OCMODE_FORCED_INACTIVE; + sConfigOC.Pulse = 0; + sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; + sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; + if (HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_3) != HAL_OK) + { + Error_Handler(); + } /* USER CODE BEGIN TIM2_Init 2 */ HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1); HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2); + HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_3); /* USER CODE END TIM2_Init 2 */ + HAL_TIM_MspPostInit(&htim2); } diff --git a/STM32/CM7/Core/Src/stm32h7xx_hal_msp.c b/STM32/CM7/Core/Src/stm32h7xx_hal_msp.c index c190f68..8e721c5 100644 --- a/STM32/CM7/Core/Src/stm32h7xx_hal_msp.c +++ b/STM32/CM7/Core/Src/stm32h7xx_hal_msp.c @@ -56,7 +56,9 @@ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ -/** + +void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); + /** * Initializes the Global MSP. */ void HAL_MspInit(void) @@ -117,6 +119,32 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base) } +void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(htim->Instance==TIM2) + { + /* USER CODE BEGIN TIM2_MspPostInit 0 */ + + /* USER CODE END TIM2_MspPostInit 0 */ + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**TIM2 GPIO Configuration + PA2 ------> TIM2_CH3 + */ + GPIO_InitStruct.Pin = GPIO_PIN_2; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF1_TIM2; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN TIM2_MspPostInit 1 */ + + /* USER CODE END TIM2_MspPostInit 1 */ + } + +} /** * @brief TIM_Base MSP De-Initialization * This function freeze the hardware resources used in this example @@ -134,10 +162,11 @@ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base) __HAL_RCC_TIM2_CLK_DISABLE(); /**TIM2 GPIO Configuration + PA2 ------> TIM2_CH3 PA1 ------> TIM2_CH2 PA0 ------> TIM2_CH1 */ - HAL_GPIO_DeInit(GPIOA, TIM2_CAM_Pin|TIM2_CRANK_Pin); + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|TIM2_CAM_Pin|TIM2_CRANK_Pin); /* TIM2 interrupt DeInit */ HAL_NVIC_DisableIRQ(TIM2_IRQn); diff --git a/STM32/CM7/Core/Src/tasks/crank.c b/STM32/CM7/Core/Src/tasks/crank.c index 8d74158..c18613c 100644 --- a/STM32/CM7/Core/Src/tasks/crank.c +++ b/STM32/CM7/Core/Src/tasks/crank.c @@ -8,9 +8,16 @@ #include "macros.h" #include "main.h" #include "ring_buffer.h" +#include "stm32h747xx.h" +#include "stm32h7xx.h" +#include "stm32h7xx_hal_tim.h" #include "tasks.h" #include +static inline void TIM2_CH3_SetOCMode(uint32_t oc_mode) { + MODIFY_REG(TIM2->CCMR2, TIM_CCMR2_OC3M | TIM_CCMR2_OC3M_3, oc_mode); +} + void crankHandler(void *argument) { for (;;) { osThreadFlagsWait(0x01, osFlagsWaitAny, osWaitForever); @@ -18,10 +25,10 @@ void crankHandler(void *argument) { ringBufferRead(&state_g.crank_RB, 0)); // FILTER float delta_percentage = ((float)(D1A - D1B)) / D1B; - if ( delta_percentage> 0.4||delta_percentage < -0.4) { - state_g.sync_state = SYNC_NOT_OK; - state_g.crank_state = CYCLE_UNKNOWN; - continue; + if (delta_percentage > 0.4 || delta_percentage < -0.4) { + state_g.sync_state = SYNC_NOT_OK; + state_g.crank_state = CYCLE_UNKNOWN; + continue; } // INCREMENT SWITCH switch (state_g.crank_state) { @@ -72,6 +79,8 @@ void crankHandler(void *argument) { uint32_t d_spark = d1a * (45 - SPARK_ADVANCE) / 180; uint32_t t_spark = CRANK(0) + d_spark; // TODO: schedule spark + // __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3, t_spark); + // TIM2_CH3_SetOCMode(t_spark); } } } diff --git a/STM32/STM32.ioc b/STM32/STM32.ioc index 23b034e..81170be 100644 --- a/STM32/STM32.ioc +++ b/STM32/STM32.ioc @@ -33,18 +33,19 @@ Mcu.Name=STM32H747XIHx Mcu.Package=TFBGA240 Mcu.Pin0=PA14 (JTCK/SWCLK) Mcu.Pin1=PC15-OSC32_OUT (OSC32_OUT) -Mcu.Pin10=VP_SYS_VS_Systick -Mcu.Pin11=VP_SYS_M4_VS_Systick -Mcu.Pin12=VP_TIM2_VS_ClockSourceINT +Mcu.Pin10=VP_FREERTOS_M7_VS_CMSIS_V2 +Mcu.Pin11=VP_SYS_VS_Systick +Mcu.Pin12=VP_SYS_M4_VS_Systick +Mcu.Pin13=VP_TIM2_VS_ClockSourceINT Mcu.Pin2=PC14-OSC32_IN (OSC32_IN) Mcu.Pin3=PA13 (JTMS/SWDIO) Mcu.Pin4=PI12 Mcu.Pin5=PH1-OSC_OUT (PH1) Mcu.Pin6=PH0-OSC_IN (PH0) -Mcu.Pin7=PA1 -Mcu.Pin8=PA0 -Mcu.Pin9=VP_FREERTOS_M7_VS_CMSIS_V2 -Mcu.PinsNb=13 +Mcu.Pin7=PA2 +Mcu.Pin8=PA1 +Mcu.Pin9=PA0 +Mcu.PinsNb=14 Mcu.ThirdPartyNb=0 Mcu.UserConstants= Mcu.UserName=STM32H747XIHx @@ -94,6 +95,10 @@ PA14\ (JTCK/SWCLK).GPIOParameters=PinAttribute PA14\ (JTCK/SWCLK).Locked=true PA14\ (JTCK/SWCLK).PinAttribute=CortexM7 PA14\ (JTCK/SWCLK).Signal=DEBUG_JTCK-SWCLK +PA2.GPIOParameters=PinAttribute +PA2.Locked=true +PA2.PinAttribute=CortexM7 +PA2.Signal=S_TIM2_CH3 PC14-OSC32_IN\ (OSC32_IN).GPIOParameters=PinAttribute PC14-OSC32_IN\ (OSC32_IN).Locked=true PC14-OSC32_IN\ (OSC32_IN).Mode=LSE-External-Oscillator @@ -245,14 +250,18 @@ SH.S_TIM2_CH1_ETR.0=TIM2_CH1,Input_Capture1_from_TI1 SH.S_TIM2_CH1_ETR.ConfNb=1 SH.S_TIM2_CH2.0=TIM2_CH2,Input_Capture2_from_TI2 SH.S_TIM2_CH2.ConfNb=1 +SH.S_TIM2_CH3.0=TIM2_CH3,Output Compare3 CH3 +SH.S_TIM2_CH3.ConfNb=1 SYS.userName=SYS_M7 TIM2.Channel-Input_Capture1_from_TI1=TIM_CHANNEL_1 TIM2.Channel-Input_Capture2_from_TI2=TIM_CHANNEL_2 +TIM2.Channel-Output\ Compare3\ CH3=TIM_CHANNEL_3 TIM2.ClockDivision=TIM_CLOCKDIVISION_DIV4 TIM2.ICFilter_CH1=10 TIM2.ICFilter_CH2=10 TIM2.ICPolarity_CH1=TIM_INPUTCHANNELPOLARITY_FALLING -TIM2.IPParameters=ClockDivision,Prescaler,Channel-Input_Capture1_from_TI1,ICPolarity_CH1,Channel-Input_Capture2_from_TI2,ICFilter_CH2,ICFilter_CH1 +TIM2.IPParameters=ClockDivision,Prescaler,Channel-Input_Capture1_from_TI1,ICPolarity_CH1,Channel-Input_Capture2_from_TI2,ICFilter_CH2,ICFilter_CH1,Channel-Output Compare3 CH3,OCMode_3 +TIM2.OCMode_3=TIM_OCMODE_FORCED_INACTIVE TIM2.Prescaler=0 VP_FREERTOS_M7_VS_CMSIS_V2.Mode=CMSIS_V2 VP_FREERTOS_M7_VS_CMSIS_V2.Signal=FREERTOS_M7_VS_CMSIS_V2