⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 foreground.c

📁 FE42X单相防窃电电表DEMO(编译器 AQ430 AQ430 V2.0.6.5)
💻 C
字号:
/********************************************************************************
*					           杭州利尔达                   *
*                 MSP430FE42X单相防窃电多功能电表平台                           *
*                          -----  ESP SD16实现                                  *
*                                                                               *
*                                                                               *
* 说明:本软件为杭州利尔达单相防窃电多功能电表DEMO软件                          *
* 软件功能:FE42X,ESP SD16模块实现单相电表防窃电多功能功能                      *
* 版本:V1.2                                                                    *
* 编辑:周震宇                                                                  *
* 修改:                                                                        *
* 修改日期:2005.7.20                                                           *
* 修改说明:测试频率一致性,测试结果频率一致性理想                              *
* 备注:未经利尔达公司同意,不得随意传播                                        *
* 编译器要求:AQ430 V2.0.6.5及以上版本                                          *
*                                                                               *
*********************************************************************************/


#include "msp430xe42x.h"
#include "globe.h"
#include "extern_function.h"
#include "emeter_cfg.h"

extern uint32 ul_actensper1;
extern uint32 ul_actensper2;

struct phase_parms_s phase_nv;
struct phase_parms_s *phase = &phase_nv;
struct emeter_var emeter;




/*******************************************************************************
*                            初始化时钟                                        *
********************************************************************************/
static __inline__ void init_fll(void)
{
	FLL_CTL0 |= XCAP14PF;      	    /* 配置电容 */
    SCFI0 = FLLD_1;  			    /* Freq = 1.024MHz */
    SCFQCTL = 32 - 1;
    FLL_CTL0 |= DCOPLUS;
    
} // End of fll_init()

/*******************************************************************************
*                           提升主频到 8MHz                                    *
********************************************************************************/
static __inline__ void goto_high_freq(void)
{
    /* 提升主频前,应确认电源电压是合适跑高频 */
    SVSCTL |= (SVSON | 0x60);
	/* 等待电源电压到适合跑高频 */
    while ((SVSCTL & SVSOP));
    /* 电源电压已适合CPU跑高频,SVS进入低电压检测复位状态 */
    SVSCTL |= PORON;
    
    /* 提升主频到 8MHz */
    SCFI0 = FN_3 | FLLD_4;
    SCFQCTL = 64 - 1;
    
} // End of goto_high_freq()

/*******************************************************************************
*                          初始化基本定时器                                    *
********************************************************************************/
static __inline__ void init_bt(void)
{
    /* 初始化LCD控制器 */
  	LCDCTL = 0x03D;       // 4mux LCD, segs16-23 = outputs
    /* 设置中断频率为 1/64s, 液晶时钟原32分频 */
    BTCTL = BT_fLCD_DIV32 | BT_fCLK2_DIV8 | BT_fCLK2_ACLK_DIV256;
    /* 1s 中断使能 */
    IE2 |= BTIE;

} // End of init_bt()

/********************************************************************************
*                         初始化定时器A和TIMERA CCR0                            *
*                                                                               *
* 说明:定时器工作模式,增计数模式,计数到CCR0,再清零计数。                    *
* 作用:定时检查能量累计,判断是否输出校表脉冲。                                *
*********************************************************************************/
static __inline__ void init_TA(void)
{
	TACTL = TACLR  | TASSEL_1;
 	TACTL |= MC_2;
 	TACCR0 = SAMPLE_PERIOD;
 	TACCTL0 = CCIE; 
} //End of init_TA()
/*******************************************************************************
*                                系统初始化                                    *
********************************************************************************/
static __inline__ void init_sys(void)
{
	/* 初始化内部时钟寄存器 */
  	if (!check_rtc_sumcheck())      
  	{
  		rtc.second = 1;
  		rtc.minute = 1;
  		rtc.hour = 1;
  		rtc.day = 1;
  		rtc.month = 1;
  		rtc.year = 5;
  		set_rtc_sumcheck();
  	}
	// P1.7中断设置
  	P1SEL &= ~(BIT0+BIT1);
  	P1IES |= BIT0+BIT1;
  	P1DIR &= ~(BIT0+BIT1);
  	P1IFG = 0;
  	P1IE |= BIT0+BIT1;
} //End of init_sys()
static __inline__ void DefaultSetting(void)
{
	if((emeter.ucFlashOperated[0] != 0x55) || (emeter.ucFlashOperated[1] != 0x55))
    {
        emeter.ucFlashOperated[0] = 0x55;
        emeter.ucFlashOperated[1] = 0x55;
        // 校表寄存器初始化
  		emeter.f_Cz1 = CURRENT_CH1_100_Cz;
  		emeter.f_Cz2 = CURRENT_CH2_100_Cz;
  		emeter.l_PowerOffset1 = 0;
  		emeter.l_PowerOffset2 = 0;
  		emeter.f_PhaseCorr1 = 0;
  		emeter.f_PhaseCorr2 = 0;
  		emeter.ui_GainCorr1 = 0x4000;
  		emeter.ui_GainCorr2 = 0x4000;
  		emeter.ui_SD16_CurrentCorr1 = 2300;
  		emeter.ui_SD16_CurrentCorr2 = 2228;
  		emeter.ui_SD16_VoltageCorr1 = 9359;
  		emeter.ul_TempSampleOffset = TEMPERATURE_OFFSET;
        store_flash_var((char *)0x1010,(char *)&emeter.ucFlashOperated[0], STORE_IN_FLASH_NUM);
    }
}
static __inline__ void ReadDataFromFlash(void)
{
	char * flash_ptr;
    char * ram_ptr;
	uint8 i;
	
	flash_ptr = (char *)0x1010;
    ram_ptr = (char *)&emeter.ucFlashOperated[0];
    for(i=0;i<STORE_IN_FLASH_NUM;i++)
    {
        * ram_ptr++ = * flash_ptr++;    
    }
}

////////////////////////////////////////////
void main (void)
{
 	
 	WDTCTL = WDTPW + WDTHOLD;
	
	init_sys();
  	ReadDataFromFlash();	// 从flash 中恢复数据,初始化
  	DefaultSetting();
  	init_bt();	// 初始化基本定时器
  	init_TA();	// 初始化TA,为校表脉冲用
  	init_fll();	// 初始化时钟,锁相环
    goto_high_freq();	// 提升主频到 8MHz
    clr_lcd_display();	// 清LCD显示
    
    //_BIS_SR(LPM3_bits);
    
    
    emeter.ucCalibrationOption = 1;
    emeter.ui_meter_status |= REQUIRE_LCD_UPDATE;
    
    _EINT();
    while (1)
    {
  		if((emeter.ui_anti_tamperring_status & IN_ONLY_RTC_MODE) == IN_ONLY_RTC_MODE)
  			_BIS_SR(LPM3_bits); //低功耗模式3
  		else
  			_BIS_SR(LPM0_bits); //低功耗模式0
  		
  		if((emeter.ui_anti_tamperring_status & EXTERN_VOLTAGE_SENSOR) == EXTERN_VOLTAGE_SENSOR)
    	{
    		if(emeter.ui_voltage_V1RMS < 8000)
    		{
    			SwitchToSD16Measure();
    		}
    		else
    		{
    			SwitchToESPMeasure();	
    		}
    	}
    	else
    	{
    		OnlyRTCMode();
    	}
    	if(((emeter.ui_anti_tamperring_status & IN_SD16_MEASURE_MODE) == IN_SD16_MEASURE_MODE) 
    		&& ((emeter.ui_anti_tamperring_status & IN_ESP_MEASURE_MODE) == 0))
    	{
    		// In SD16 Measure Mode
    		if((emeter.ui_anti_tamperring_status & SD16_MEASURE_NEW_LOG) == SD16_MEASURE_NEW_LOG)
    		{
    			log_parameters();
    			if(++emeter.uc_switch_delay_counter >= 2)
    			{
    				emeter.ui_voltage_V1RMS = voltage();
    				emeter.ui_current_IRMS = current()/10;
    				emeter.uc_switch_delay_counter = 2;
    			}
    			emeter.ui_anti_tamperring_status &= ~SD16_MEASURE_NEW_LOG;
    		}
    	}
    	else if(((emeter.ui_anti_tamperring_status & IN_ESP_MEASURE_MODE) == IN_ESP_MEASURE_MODE)
    		&& ((emeter.ui_anti_tamperring_status & IN_SD16_MEASURE_MODE) == 0))
    	{
    		//In ESP Measure Mode
    		#ifndef    ENERGY_1SEC
  			if((emeter.ui_meter_status & ENSPER_INT_OCCUR)== ENSPER_INT_OCCUR)
  			{
  				emeter.ui_meter_status &= ~ENSPER_INT_OCCUR;
  				ActensperReadyIntMapping();
  			}
  			#endif
  			// 若在后台按键中断传递了调整ESP参数的信息,则重设ESP参数
  			if((emeter.ui_meter_status & REQUIRE_MODIFY_ESP_PARAM) == REQUIRE_MODIFY_ESP_PARAM)
  			{
  				init_esp_parameter();	// 初始化ESP参数寄存器
  				start_measurement();	// 进入测量模式
        		emeter.ui_meter_status &= ~REQUIRE_MODIFY_ESP_PARAM;
  			}
  			if((emeter.ui_meter_status & ENRDY_INT_OCCUR) == ENRDY_INT_OCCUR)
  			{
  				// 新一秒的能量准备好
  				if(++emeter.uc_switch_delay_counter >= 2)
    			{
    				EnergyReadyIntMapping();
    				emeter.uc_switch_delay_counter = 2;
    			}
  				emeter.ui_meter_status &= ~ENRDY_INT_OCCUR;
  			}
  		}
    	else
  		{
  			// In Only RTC Mode of In Error Mode, Correcting
  			emeter.ui_anti_tamperring_status &= ~IN_ESP_MEASURE_MODE;
  			emeter.ui_anti_tamperring_status &= ~IN_SD16_MEASURE_MODE; 
  		}
  		if((emeter.ui_meter_status & REQUIRE_RTC_CORRENT) == REQUIRE_RTC_CORRENT)
  		{
  			correct_rtc();
  			emeter.ui_meter_status &= ~REQUIRE_RTC_CORRENT;
  		}
  		if((emeter.ui_meter_status & REQUIRE_FLASH_OP) == REQUIRE_FLASH_OP)
        {
        	store_flash_var((char *)0x1010,(char *)&emeter.ucFlashOperated[0], STORE_IN_FLASH_NUM);
            emeter.ui_meter_status &= ~REQUIRE_FLASH_OP;
	    }
	    if((emeter.ui_meter_status & BT_1SEC_INT_OCCUR) == BT_1SEC_INT_OCCUR)
        {
        	BasicTimerIntMapping();
  			emeter.ui_meter_status &= ~BT_1SEC_INT_OCCUR;
	    }
	    if((emeter.ui_meter_status & REQUIRE_LCD_UPDATE) == REQUIRE_LCD_UPDATE)
        {
        	update_display();
  			emeter.ui_meter_status &= ~REQUIRE_LCD_UPDATE;
	    }
  	} // End of while (1)
} // End of main()


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -