127 lines
3.6 KiB
C
127 lines
3.6 KiB
C
|
/**
|
||
|
* @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 <safetyMonitorTask.h>
|
||
|
|
||
|
#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;
|
||
|
}
|
||
|
|