/* ****************************************************************************** * * @file system.c * @brief system module * @ic sy8837 * * @version 1.0 * @date 2024/12/02 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 2024/12/02 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 "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" #include "pwm.h" /******************************************************************************\ Macro definitions \******************************************************************************/ /******************************************************************************\ Variables definitions \******************************************************************************/ /******************************************************************************\ Functions definitions \******************************************************************************/ /* ******************************************************************************* * void System_Init(void) * * Description : System Initialization * * Arguments : NONE * Returns : NONE * Notes : NONE * ******************************************************************************* */ void System_Init(void) { SFRADDR = P0_PD; //Disable P00\P01 Pull Down. SFRDATA = 0x00; #if UART0_ENABLE UART0_Init(); #endif #if UART1_ENABLE UART1_Init(); #endif Sys_Tim0_Init(); #if TIMER1_ENABLE Sys_Tim1_Init(); #endif #if WTG_ENABLE /* WDT_TM = 0,则看门狗时钟为系统时钟的12分频,否则为系统时钟。 wdtrel.7=1 则看门狗计数器时钟为Sys_Fre/12*32,wdtrel.7=0 则看门狗计数器时钟为Sys_Fre/12*2. Sys_Fre = 12MHz,wdtrel.7=0时,定时器范围: (1/Sys_Fre)*12*2*256~(1/Sys_Fre)*12*2*256*128 = 5ms~65ms Sys_Fre = 12MHz,wdtrel.7=1时,定时器范围: (1/Sys_Fre)*12*32*256~(1/Sys_Fre)*12*32*256*128 = 80ms~1s */ /* 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 VOX_ENABLE VOX_CTL0 = EN_VOR_VDS | EN_VOL_VDS | EN_VOR_ADTR | EN_VOL_ADTL ; //vox vds 钳压环使能;vox Adt Enbale; SFRADDR = VOX_CON0; //设置VOX负载识别电流4.5uA。见Config.h文件。 SFRDATA = VOX_ADT_CUR_SET; SFRADDR = VOX_CON2; //设置VOX轻重载转换滤波时间。bit3:2 VOX轻载转重载滤波时间;bit1:0 VOX重载转轻载滤波时间 SFRDATA |= (VOX_LIGHT_TO_HAVEY_DEB << 2) | VOX_HAVEY_TO_LIGHT_DEB | VOX_IOFF_CUR_SET ; #endif #if ADC_ENABLE Adc_Init(); #endif #if KEY_ENABLE SFRADDR = PMU_CTL0; //Enable Key Det Function SFRDATA |= 0x02; #endif SFRADDR = MFP_CTL0; //Set P00 As Key. SFRDATA &=~ 0x03; SFRDATA |= 0x01; /* SFRADDR = MFP_CTL1; //Set P06 As Hall. SFRDATA &=~ 0x30; SFRDATA |= 0x10; */ /* Interrupt Enable 根据应用选择必要的中断 */ SFRADDR = IRQ_EN3; //INT2 --- VOX EDGE LOADON SFRDATA = 0x3C; /* 开外部中断使能 */ EX0 = 1; EAL = 1; //开总中断。 #if CHARGER_ENABLE Charger_Init(); #endif #ifdef PWM_ENABLE PWM_Init_Set(PWM_CLKFRE_SET,PWM_RELOAD_SET); #endif #ifdef LED_DISPLAY LED_Init(); LED_Clr(); #endif #if GAUGE_ENABLE // Bat_Cal_Init(); //电池电量初始化 #endif #ifdef SLEEP_ENABLE WakeUp_Init_Set(); #endif Systerm_State.Next_State = POWER_ON_STATE; } #if 0 /* ******************************************************************************* * void Sys_Clk_Adjust(uint8_t Clk_Div) * * Description : System Clock Division Setting. * * Arguments : NONE * Returns : NONE * Notes : NONE * ******************************************************************************* */ void Sys_Clk_Adjust(uint8_t Clk_Div) { CLKPRE = Clk_Div; } #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 { #if SLEEP_ENABLE Enter_Sleep_Cnt_Restart_Flag = 1; #endif } /* ******************************************************************************* * void EX2_isr(void) interrupt Interrupt_Vector_IE2 * * Description : System External Intterupt 2 * * Arguments : NONE * Returns : NONE * Notes : NONE * ******************************************************************************* */ void EX2_isr(void) interrupt Interrupt_Vector_IE2 { IRQ_FLAG3 = 0x3C; #if SLEEP_ENABLE Enter_Sleep_Cnt_Restart_Flag = 1; #endif } /* ******************************************************************************* * void EX3_isr(void) interrupt Interrupt_Vector_IE2 * * Description : System External Intterupt 2 * * Arguments : NONE * Returns : NONE * Notes : NONE * ******************************************************************************* */ #ifdef TIM_WKUP void EX3_isr(void) interrupt Interrupt_Vector_IE3 { IRQ_FLAG10 = Standby_Tmr_WkUp; #if SLEEP_ENABLE Enter_Sleep_Cnt_Restart_Flag = 1; #endif } #endif