Auto mode switch implemented

This commit is contained in:
2023-02-05 04:11:21 +03:00
parent efc6bbac57
commit e33492f758
5 changed files with 113 additions and 10 deletions

View File

@@ -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 */

View File

@@ -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 */

View File

@@ -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 */

View File

@@ -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.
*/

View File

@@ -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