Both_Way_Comm_SY8833/TP3310_Demo.si4project/Backup/system(5139).c

362 lines
7.7 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
******************************************************************************
*
* @file system.c
* @brief system module
*
*
* @version 1.0
* @date 2022/08/04 15:00:40
* @author Alex Xu
*
* Copyright (c) 2013-2099,Tkplusemi Technology Co.,Ltd.
* All Rights Reserved
*
* History:
* Revision Date Author Desc
* 1.0.0 2022/08/15 Alex build this file
* Attention:1、由于同一个Byte的中断标志位会分配在不同的中断中对于清中断标志位写1清不能用 |= ,需要用 =
例如IRQ_FLAG10 = 0x02; //Clear bit0,bit1 interrupt flag
2、外部中断0主要是用于系统唤醒功能中断处理函数中无需作逻辑功能处理必需预留接口
******************************************************************************/
/*_____ I N C L U D E S ____________________________________________________*/
#include "system.h"
#include "gpio.h"
#include "adc.h"
#include "hall.h"
#include "key.h"
#include "sleep.h"
#include "uart.h"
#include "bat.h"
#include "sys_tim.h"
#include "charger_module.h"
#include "discharge_module.h"
#include "led.h"
#include "vox_module.h"
#include "watchdog.h"
#include "userapp.h"
/******************************************************************************\
Macro definitions
\******************************************************************************/
/******************************************************************************\
Variables definitions
\******************************************************************************/
idata uint16_t Protect_Type_Flg = 0;
idata uint8_t gIrq_Event_Type = 0; //中断事件记录
//idata uint8_t g_Plug_Irq_Flg = 0;
/******************************************************************************\
Functions definitions
\******************************************************************************/
/*
*******************************************************************************
* void System_Init(void)
*
* Description : System Initialization
*
* Arguments : NONE
* Returns : NONE
* Notes : NONE
*
*******************************************************************************
*/
void System_Init(void)
{
CLKPRE = 0x00; //frequency division: 2^0, 12M 后续根据系统功耗情况调整。
#if UART0_ENABLE
UART0_Init();
#endif
#if VOX_ENABLE
Vox_init(); //上电后尽快初始化VOX为自动识别模式为后续识别VOX是否有LOADON做好准备。
#endif
Sys_Tim0_Init();
#if TIMER1_ENABLE
Sys_Tim1_Init();
#endif
//Boost_Init();
GPIO_Init();
#ifdef LED_DISPLAY
LED_Init(); // LED pin 配置为GPIO输出
LED_Clr();
#endif
#ifdef DISPLAY_LED_188
g_188_Num = 0;
LED_188_Init();
#endif
#if WTG_ENABLE
/* 65ms */
WDTREL = 0x00; //WDTPS = 0,wdt_f = wdt_f1/2;WDTPS = 1,wdt_f = wdt_f1/32;
/* 1s */
// WDTREL = 0x80; //WDTPS = 0,wdt_f = wdt_f1/2;WDTPS = 1,wdt_f = wdt_f1/32;
#endif
#if ADC_ENABLE
Adc_Init();
#endif
#if KEY_HALL_ENABLE
// Key_Init();
Hall_Init();
#endif
#if SLEEP_ENABLE
WakeUp_Init_Set(); //唤醒中断使能设置
#endif
//Charger_Init();
Systerm_State.Next_State = POWER_ON_STATE;
/* Interrupt Enable 根据应用选择必要的中断 */
// SFRADDR = IRQ_EN0; //INT0 --- OCP\DIE OT\VBUS\BAT LOW\VOR\VOL\Boost UVLO\Boost output short.
// SFRDATA = 0xFF;
// SFRADDR = IRQ_EN3; //INT2 --- VOX EDGE LOADON\VOX LOADIN
// SFRDATA = 0xFF;
// SFRADDR = IRQ_EN4; //INT2 --- VOX IOFF EDGE\VOX Recharge Edge
// SFRDATA = 0xFF;
SFRADDR = IRQ_EN7; //INT7 --- Key Interrupt Flag
SFRDATA = 0xFF;
SFRADDR = IRQ_EN9; //INT9 --- VIN DPM\Temp Loop\BAT Overvoltage\Charge Complete\Fast charge timer expire\Tricle charge timer expire\VBUS power good edge.
SFRDATA = 0xFF;
SFRADDR = IRQ_EN10; //INT3 --- VBUS plugout\VBUS plugin\Comparator output edge\Hall\Standby wakeup timer
SFRDATA = 0xFF;
/* 开外部中断使能 */
EX0 = 1;
EX2 = 1;
EX3 = 1;
EX4 = 1;
EX7 = 1;
EAL = 1; //开总中断。
#ifdef LED_DISPLAY
LED_B_FLASH(200,5);
#endif
}
#if SLEEP_ENABLE
/*
*******************************************************************************
* void OutSleep_Handler(void)
*
* Description : 出Standby模式后开启中断和部分接口使能。
*
* Arguments : NONE
* Returns : NONE
* Notes : NONE
*
*******************************************************************************
*/
void OutSleep_Handler(void)
{
ES0 = 1; //UART0 IRQ
EX4 = 1;
EX3 = 1;
EX2 = 1;
EX7 = 1;
ET0 = 1; //timer0 IRQ
ET1 = 1; //timer1 IRQ
SFRADDR = ADC_CTL0;
SFRDATA |= 0x80; //ADC enable.
}
/*
*******************************************************************************
* void InSleep_Handler(void)
*
* Description : 进Standby模式前的准备工作关闭中断、关闭部分接口的使能
*
* Arguments : NONE
* Returns : NONE
* Notes : NONE
*
*******************************************************************************
*/
void InSleep_Handler(void)
{
ES0 = 0; //UART0 IRQ Disable
EX4 = 0;
EX3 = 0;
EX2 = 0;
EX7 = 0;
ET0 = 0; //timer0 IRQ Disable
ET1 = 0; //timer1 IRQ Disable
SFRADDR = ADC_CTL0;
SFRDATA &= ~0x80; //ADC Disable.
}
#endif
#if 0
void Delay_us(volatile uint16_t us) //@11.0592MHz
{
do
{
_nop_();
_nop_();
_nop_();
}while(us--);
}
#endif
/*
*******************************************************************************
* void EX0_isr(void ) interrupt Interrupt_Vector_IE0
*
* Description : System External Intterupt 0
*
* Arguments : NONE
* Returns : NONE
* Notes : NONE
*
*******************************************************************************
*/
void EX0_isr(void) interrupt Interrupt_Vector_IE0
{
}
/*
*******************************************************************************
* void EX3_isr(void ) interrupt Interrupt_Vector_IE3
*
* Description : System External Intterupt 3 ,系统异常中断、电源插拔中断、Standby定时器中断
*
* Arguments : NONE
* Returns : NONE
* Notes : NONE
*
*******************************************************************************
*/
void EX3_isr(void) interrupt Interrupt_Vector_IE3
{
uint8_t IRQ0_Flag = 0;
uint8_t IRQ10_Flag = 0;
IRQ0_Flag = IRQ_FLAG0;
IRQ_FLAG0 = IRQ0_Flag;
IRQ10_Flag = IRQ_FLAG10;
IRQ_FLAG10 = IRQ10_Flag; //Clear interrupt flag
if(IRQ0_Flag != 0)
{
/* Coding */
Protect_Type_Flg |= 0xFF;
}
if( IRQ10_Flag & 0xC0 )
{
gIrq_Event_Type |= VBUS_PLUG_IRQ_EVENT;
}
#if SLEEP_ENABLE
if(!Enter_Sleep_Cnt_Restart_Flag)
{
Enter_Sleep_Cnt_Restart_Flag = 1;
}
#endif
}
/*
*******************************************************************************
* void EX7_isr(void ) interrupt Interrupt_Vector_IE7
*
* Description : System External Intterupt 7 I2C/PWM/Charger中断
*
* Arguments : NONE
* Returns : NONE
* Notes : NONE
*
*******************************************************************************
*/
void EX7_isr(void) interrupt Interrupt_Vector_IE7
{
uint8_t IRQ9_Flag = 0;
IRQ9_Flag = IRQ_FLAG9;
IRQ_FLAG9 = IRQ9_Flag; //Clear interrupt flag
/*VIN DPM*/
if(IRQ9_Flag & 0x80) //VIN DPM
{
/*将充电超时时间设长,具体时间需要测试。*/
/* Coding */
Protect_Type_Flg |= VIN_DPM_PRO_TYPE;
}
/*电池过压保护*/
if(IRQ9_Flag & 0x20)
{
/*软件检测到电池过压一段时间,可以关闭充电, 直到电压恢复正常,重新开始充电流程*/
/* Coding */
Protect_Type_Flg |= BAT_OVERVOL_PRO_TYPE;
}
/*充电超时关闭CHG*/
if(IRQ9_Flag & 0x08)
{
CHG_CTL &= ~0x01; //Disable Charger
}
if(IRQ9_Flag & 0x10) //Charge Done
{
Charger_Done = 1;
}
#if SLEEP_ENABLE
if(!Enter_Sleep_Cnt_Restart_Flag)
{
Enter_Sleep_Cnt_Restart_Flag = 1;
}
#endif
}