/** * @copyright 2015 Indie Semiconductor. * * This file is proprietary to Indie Semiconductor. * All rights reserved. Reproduction or distribution, in whole * or in part, is forbidden except by express written permission * of Indie Semiconductor. * * @file safetyMonitorTask.c * @Author: Jack.Pan * @E-mail:jack.pan@indiemicro.com * @Date: 2020/09/10 */ #include #define OVER_TEMPERATURE_HIGH (130) /*celsius degree */ #define OVER_TEMPERATURE_RELEASE (OVER_TEMPERATURE_HIGH - 10U) /*celsius degree */ #define LED_PN_SHORT_VOLT (500U) /* mV */ #define LED_PN_SHORT_OPEN (4000U) /* mV */ #define INTENSITY_RATIO_TYPICAL (1024U) /* 100% of max intensity */ #define INTENSITY_RATIO_HIGH_TEMPERATURE (INTENSITY_RATIO_TYPICAL*4U/5U) /* 80% of max intensity */ #define INTENSITY_RATIO_BATT_ISSUE (0U) /* 0% of max intensity */ static TaskState_t safeMonitorState = TASK_STATE_INIT; static BatteryState_t battState = BATT_STATE_NORMAL; static BatteryState_t battLastState = BATT_STATE_NORMAL; static ChipTemperatureState_t chipTemperatureState = CHIP_TEMPERATURE_STATE_NORMAL; static ChipTemperatureState_t chipTemperatureLastState = CHIP_TEMPERATURE_STATE_NORMAL; static void UnderVoltageProtection_ISR(void); static void OverVoltageProtection_ISR(void); static void safetyHandle(void); static void safetyInit(void); static void safeMonitorTimerExpired(SoftTimer_t *timer); static SoftTimer_t safeMonitorTimer = { .mode = TIMER_PERIODIC_MODE, .interval = 200U, .handler = safeMonitorTimerExpired }; static void safeMonitorTimerExpired(SoftTimer_t *timer) { TM_PostTask(TASK_ID_SAFETY_MONITOR); NVIC_EnableIRQ(UV_OV_IRQn); NVIC_EnableIRQ(OVTEMP_IRQn); CRGA_SFRS->RESETCTRL.OVTEMPFLAGCLR = 1U; } void SAFM_TaskHandler(void) { switch(safeMonitorState){ case TASK_STATE_INIT: safetyInit(); SoftTimer_Start(&safeMonitorTimer); safeMonitorState = TASK_STATE_ACTIVE; break; case TASK_STATE_ACTIVE: safetyHandle(); break; default: break; } } static void safetyHandle(void) { /* Battery Voltage Protection Handling */ battState = (BatteryState_t)HW_PROT_GetBattVoltState(); if ((chipTemperatureLastState != chipTemperatureState) || (battLastState != battState)){ chipTemperatureLastState = chipTemperatureState; battLastState = battState; if (battState == BATT_STATE_LOW){ }else{ /* Restart OV UV ISR */ PMUA_SFRS->PMUIRQ.CLEAR.OV_CLR = 1U; PMUA_SFRS->PMUIRQ.CLEAR.UV_CLR = 1U; NVIC_ClearPendingIRQ(UV_OV_IRQn); NVIC_EnableIRQ(UV_OV_IRQn); } } } static void UnderVoltageProtection_ISR(void) { TM_PostTask(TASK_ID_SAFETY_MONITOR); } static void OverVoltageProtection_ISR(void) { TM_PostTask(TASK_ID_SAFETY_MONITOR); } static void safetyInit(void) { HW_PROT_SetUnderVoltage(UV_VOLT_5_1V,UNDER_VOLT_HYS_830mV, VOLT_DEBOUNCE_TIME_10ms, VOLT_DEBOUNCE_TIME_10ms); HW_PROT_RegisterUnderVoltageIRQ(UnderVoltageProtection_ISR); HW_PROT_SetOverVoltage(OV_VOLT_20_0V, OV_VOLT_HYS_1440mV, VOLT_DEBOUNCE_TIME_10ms, VOLT_DEBOUNCE_TIME_10ms); HW_PROT_RegisterOverVoltageIRQ(OverVoltageProtection_ISR); } BatteryState_t SAFM_GetBatteryState(void) { return battState; } ChipTemperatureState_t SAFM_GetChipTemperatureState(void) { return chipTemperatureState; }