diff --git a/firmware/Core/Inc/stm32g0xx_it.h b/firmware/Core/Inc/stm32g0xx_it.h index 68f14af..dd25f65 100644 --- a/firmware/Core/Inc/stm32g0xx_it.h +++ b/firmware/Core/Inc/stm32g0xx_it.h @@ -53,6 +53,7 @@ void PendSV_Handler(void); void SysTick_Handler(void); void EXTI0_1_IRQHandler(void); void EXTI4_15_IRQHandler(void); +void TIM14_IRQHandler(void); void TIM16_IRQHandler(void); void TIM17_IRQHandler(void); /* USER CODE BEGIN EFP */ diff --git a/firmware/Core/Src/main.c b/firmware/Core/Src/main.c index 51e3547..2f7ae92 100644 --- a/firmware/Core/Src/main.c +++ b/firmware/Core/Src/main.c @@ -65,6 +65,8 @@ typedef enum DLMode_t_enum { #define CONF_FLASH_ADDR ((uint32_t)0x0800F800) //FLASH address of the page to save configuration to #define CONF_FLASH_PAGE 31 //FLASH page number (from 0 to PgCount-1) +#define AUTO_SWITCH_TIME 7200 //Time in seconds to auto switch to normal mode from manual_off mode + /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ @@ -78,6 +80,7 @@ CRC_HandleTypeDef hcrc; I2C_HandleTypeDef hi2c1; TIM_HandleTypeDef htim3; +TIM_HandleTypeDef htim14; TIM_HandleTypeDef htim16; TIM_HandleTypeDef htim17; @@ -101,6 +104,7 @@ int8_t dLevel = 1; // Direction of fade: -1 for fade out; 1 for fade in DLMode_t DLmode = DL_normal; // Global mode: DL_normal, DL_manual_on, DL_manual_off, DL_need_config, DL_config_waiting, DL_config_accepted, DL_error DLMode_t prev_mode = DL_normal; // To hold the mode during temporary mode switches uint8_t modeSwitch = 0; // Flag to switch the mode after the button tap +uint16_t autoSwitchTime = 0; // Time counter until mode auto switch /* USER CODE END PV */ @@ -112,6 +116,7 @@ static void MX_TIM3_Init(void); static void MX_TIM17_Init(void); static void MX_CRC_Init(void); static void MX_TIM16_Init(void); +static void MX_TIM14_Init(void); /* USER CODE BEGIN PFP */ volatile void loadConfig(void); // Load configuration from the FLASH memory @@ -281,9 +286,11 @@ int main(void) MX_TIM17_Init(); MX_CRC_Init(); MX_TIM16_Init(); + MX_TIM14_Init(); /* USER CODE BEGIN 2 */ // TIM3 - PWM timer + // TIM14 - to measure time for mode auto switch (1Hz) // TIM16 - ticks timer (10Hz - 100ms) // TIM17 - timer for light fading @@ -331,13 +338,15 @@ int main(void) DLmode = DL_manual_on; fastBlink(1); dLevel = 2; - HAL_TIM_Base_Start_IT(&htim17); + HAL_TIM_Base_Start_IT(&htim17); // Rise up the light break; case DL_manual_on: DLmode = DL_manual_off; fastBlink(1); dLevel = -1; - HAL_TIM_Base_Start_IT(&htim17); + HAL_TIM_Base_Start_IT(&htim17); // Fade out the light + autoSwitchTime = AUTO_SWITCH_TIME; + HAL_TIM_Base_Start_IT(&htim14); // Start counting OFF time break; case DL_manual_off: DLmode = DL_normal; @@ -540,6 +549,37 @@ static void MX_TIM3_Init(void) } +/** + * @brief TIM14 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM14_Init(void) +{ + + /* USER CODE BEGIN TIM14_Init 0 */ + + /* USER CODE END TIM14_Init 0 */ + + /* USER CODE BEGIN TIM14_Init 1 */ + + /* USER CODE END TIM14_Init 1 */ + htim14.Instance = TIM14; + htim14.Init.Prescaler = 6400-1; + htim14.Init.CounterMode = TIM_COUNTERMODE_UP; + htim14.Init.Period = 10000-1; + htim14.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim14.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_Base_Init(&htim14) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM14_Init 2 */ + + /* USER CODE END TIM14_Init 2 */ + +} + /** * @brief TIM16 Initialization Function * @param None @@ -659,6 +699,7 @@ volatile void setLightLevel(uint8_t level) { } void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin) { + // Button has been pressed // Start counting "ticks" when the sense-button is pressed if (GPIO_Pin == Btn_INT_Pin) { btn_ticks = 0; @@ -704,7 +745,7 @@ void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin) { } void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { - if(htim->Instance == TIM16) { //check if the interrupt comes from TIM16 // TIM16 - ticks timer (10Hz - 100ms) + if (htim->Instance == TIM16) { //check if the interrupt comes from TIM16 // TIM16 - ticks timer (10Hz - 100ms) if (btn_ticks < 60) { btn_ticks++; } else { @@ -716,7 +757,7 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { } // Fade-in / fade-out animation - if(htim->Instance == TIM17) { //check if the interrupt comes from TIM17 // TIM17 - timer for light fading + if (htim->Instance == TIM17) { //check if the interrupt comes from TIM17 // TIM17 - timer for light fading if ((curLightLevel >= 99 && dLevel > 0) || (curLightLevel == 0 && dLevel < 0)) { HAL_TIM_Base_Stop_IT(&htim17); } else { @@ -724,6 +765,16 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { setLightLevel(curLightLevel); } } + + // Mode auto-switch time counter + if (htim->Instance == TIM14) { //check if the interrupt comes from TIM14 // TIM14 - to measure time for mode auto switch (1Hz) + if (autoSwitchTime > 0) { + autoSwitchTime--; + } else { + modeSwitch = 1; + HAL_TIM_Base_Stop_IT(&htim14); + } + } } /* USER CODE END 4 */ diff --git a/firmware/Core/Src/stm32g0xx_hal_msp.c b/firmware/Core/Src/stm32g0xx_hal_msp.c index b54fb6f..2fc05e2 100644 --- a/firmware/Core/Src/stm32g0xx_hal_msp.c +++ b/firmware/Core/Src/stm32g0xx_hal_msp.c @@ -218,6 +218,20 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base) /* USER CODE END TIM3_MspInit 1 */ } + else if(htim_base->Instance==TIM14) + { + /* USER CODE BEGIN TIM14_MspInit 0 */ + + /* USER CODE END TIM14_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM14_CLK_ENABLE(); + /* TIM14 interrupt Init */ + HAL_NVIC_SetPriority(TIM14_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(TIM14_IRQn); + /* USER CODE BEGIN TIM14_MspInit 1 */ + + /* USER CODE END TIM14_MspInit 1 */ + } else if(htim_base->Instance==TIM16) { /* USER CODE BEGIN TIM16_MspInit 0 */ @@ -294,6 +308,20 @@ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base) /* USER CODE END TIM3_MspDeInit 1 */ } + else if(htim_base->Instance==TIM14) + { + /* USER CODE BEGIN TIM14_MspDeInit 0 */ + + /* USER CODE END TIM14_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM14_CLK_DISABLE(); + + /* TIM14 interrupt DeInit */ + HAL_NVIC_DisableIRQ(TIM14_IRQn); + /* USER CODE BEGIN TIM14_MspDeInit 1 */ + + /* USER CODE END TIM14_MspDeInit 1 */ + } else if(htim_base->Instance==TIM16) { /* USER CODE BEGIN TIM16_MspDeInit 0 */ diff --git a/firmware/Core/Src/stm32g0xx_it.c b/firmware/Core/Src/stm32g0xx_it.c index 98efff9..39e0973 100644 --- a/firmware/Core/Src/stm32g0xx_it.c +++ b/firmware/Core/Src/stm32g0xx_it.c @@ -55,6 +55,7 @@ /* USER CODE END 0 */ /* External variables --------------------------------------------------------*/ +extern TIM_HandleTypeDef htim14; extern TIM_HandleTypeDef htim16; extern TIM_HandleTypeDef htim17; /* USER CODE BEGIN EV */ @@ -169,6 +170,20 @@ void EXTI4_15_IRQHandler(void) /* USER CODE END EXTI4_15_IRQn 1 */ } +/** + * @brief This function handles TIM14 global interrupt. + */ +void TIM14_IRQHandler(void) +{ + /* USER CODE BEGIN TIM14_IRQn 0 */ + + /* USER CODE END TIM14_IRQn 0 */ + HAL_TIM_IRQHandler(&htim14); + /* USER CODE BEGIN TIM14_IRQn 1 */ + + /* USER CODE END TIM14_IRQn 1 */ +} + /** * @brief This function handles TIM16 global interrupt. */ diff --git a/firmware/DiLight.ioc b/firmware/DiLight.ioc index 19f7290..71a76f9 100644 --- a/firmware/DiLight.ioc +++ b/firmware/DiLight.ioc @@ -16,16 +16,18 @@ Mcu.IP2=NVIC Mcu.IP3=RCC Mcu.IP4=SYS Mcu.IP5=TIM3 -Mcu.IP6=TIM16 -Mcu.IP7=TIM17 -Mcu.IPNb=8 +Mcu.IP6=TIM14 +Mcu.IP7=TIM16 +Mcu.IP8=TIM17 +Mcu.IPNb=9 Mcu.Name=STM32G031G(4-6-8)Ux Mcu.Package=UFQFPN28 Mcu.Pin0=PA0 Mcu.Pin1=PC6 Mcu.Pin10=VP_TIM3_VS_ClockSourceINT -Mcu.Pin11=VP_TIM16_VS_ClockSourceINT -Mcu.Pin12=VP_TIM17_VS_ClockSourceINT +Mcu.Pin11=VP_TIM14_VS_ClockSourceINT +Mcu.Pin12=VP_TIM16_VS_ClockSourceINT +Mcu.Pin13=VP_TIM17_VS_ClockSourceINT Mcu.Pin2=PA13 Mcu.Pin3=PA14-BOOT0 Mcu.Pin4=PB4 @@ -34,7 +36,7 @@ Mcu.Pin6=PB6 Mcu.Pin7=PB7 Mcu.Pin8=VP_CRC_VS_CRC Mcu.Pin9=VP_SYS_VS_Systick -Mcu.PinsNb=13 +Mcu.PinsNb=14 Mcu.ThirdPartyNb=0 Mcu.UserConstants= Mcu.UserName=STM32G031G8Ux @@ -48,6 +50,7 @@ NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false NVIC.SVC_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true NVIC.SysTick_IRQn=true\:3\:0\:false\:false\:true\:false\:true\:false +NVIC.TIM14_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true NVIC.TIM16_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true NVIC.TIM17_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true PA0.GPIOParameters=GPIO_Label,GPIO_ModeDefaultEXTI @@ -147,6 +150,9 @@ SH.GPXTI5.0=GPIO_EXTI5 SH.GPXTI5.ConfNb=1 SH.S_TIM3_CH1.0=TIM3_CH1,PWM Generation1 CH1 SH.S_TIM3_CH1.ConfNb=1 +TIM14.IPParameters=Prescaler,Period +TIM14.Period=10000-1 +TIM14.Prescaler=6400-1 TIM16.IPParameters=Prescaler,Period TIM16.Period=10000-1 TIM16.Prescaler=640-1 @@ -163,6 +169,8 @@ VP_CRC_VS_CRC.Mode=CRC_Activate VP_CRC_VS_CRC.Signal=CRC_VS_CRC VP_SYS_VS_Systick.Mode=SysTick VP_SYS_VS_Systick.Signal=SYS_VS_Systick +VP_TIM14_VS_ClockSourceINT.Mode=Enable_Timer +VP_TIM14_VS_ClockSourceINT.Signal=TIM14_VS_ClockSourceINT VP_TIM16_VS_ClockSourceINT.Mode=Enable_Timer VP_TIM16_VS_ClockSourceINT.Signal=TIM16_VS_ClockSourceINT VP_TIM17_VS_ClockSourceINT.Mode=Enable_Timer