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

📄 tool.c

📁 MSP430FE42X防窍电电表DEMO(编译器IAR3.42)
💻 C
字号:
/**********************************************************************
*                     无符号 int与float 相乘                          *
***********************************************************************/
unsigned int scale_int(unsigned int i, float f)
{
	float ff;

  	ff = (float) i;
  	ff *= f;
  	return ((unsigned int) ff);
}

/***********************************************************************
*                     无符号 long与float 相乘                          *
***********************************************************************/
unsigned long scale_long(unsigned long l, float f)
{
	float ff;

	ff = (float) l;
	ff *= f;
	return ((unsigned long) ff);
}

/**********************************************************************
*                  无符号 long转换成BCD码存入bcd数组                  *
*                                                                     *
* 说明:高位存入bcd数组的低字节                                       *
***********************************************************************/
void bin2bcd32(unsigned char bcd[5], unsigned long bin)
{
	unsigned char i,j;
	int k;
	long l;

	for (k=4;k>=0;k--)
	{
		l=bin%10;
		i = (unsigned char) l;  // remainder = character in table to display
		bin = bin/10;           // shifts right so next character can be displayed
		l=bin%10;
		j = (unsigned char) l;  // remainder = character in table to display
		bin = bin/10;           // shifts right so next character can be displayed
		j=(j<<4)+i;
		bcd[k]=j;
	}
}

/**********************************************************************
*                  无符号 int转换成BCD码存入bcd数组                   *
*                                                                     *
* 说明:高位存入bcd数组的低字节                                       *
***********************************************************************/
void bin2bcd16(unsigned char bcd[3], unsigned int bin)
{
	unsigned char i,j;
	int k;
	int l;

	for (k=2;k>=0;k--)
	{
		l=bin%10;
		i = (unsigned char) l;  // remainder = character in table to display
		bin = bin/10;           // shifts right so next character can be displayed
		l=bin%10;
		j = (unsigned char) l;  // remainder = character in table to display
		bin = bin/10;           // shifts right so next character can be displayed
		j=(j<<4)+i;
		bcd[k]=j;
	}
}

/*********************************************************************
*                          Flash工具                                 *
**********************************************************************/
void flash_clr(int *ptr)
{
  	_DINT();
  	FCTL3 = FWKEY;          			/* Lock = 0 */
  	FCTL1 = FWKEY | ERASE;
  	*((int *) ptr) = 0;       			/* Erase flash segment */
}

void flash_memcpy(char *ptr, char *from, int len)
{
  	_DINT();
  	FCTL3 = FWKEY;          			/* Lock = 0 */
  	FCTL1 = FWKEY | WRT;
	while (len)
	{
	  	*ptr++ = *from++;
	  	len--;
	}
}

void flash_secure(void)
{
  	_DINT();
  	FCTL1 = FWKEY;          			/* Erase, write = 0 */
  	FCTL3 = FWKEY | LOCK;
	_EINT();
}
// End of Flash Tool

char store_flash_var(char *ptr,char *from, int len)
{
    char * tmp;
    char i;
    flash_clr((int *)ptr);
    flash_memcpy(ptr, from, len);
    flash_secure();
    tmp = ptr;
    for(i=0;i<len;i++)
    {
        if(*tmp++ != *from++)
            return(0);
    }
    return(1);
}
/**********************************************************************
*                          防窃电测量工具                             *
***********************************************************************/
void CheckExternVoltage(void)
{
	/* 电网电压检测口 */
	//P1SEL &= ~BIT4;
	//P1DIR &= ~BIT4;
	//if((P1IN & BIT4) == BIT4)
  	//{
  	    // 外部电压传感信号存在
  	    //emeter.ui_anti_tamperring_status |= EXTERN_VOLTAGE_SENSOR;
  	//}
  	//else
  	//{
  		// 没有外部电压传感信号存在
  	//	emeter.ui_anti_tamperring_status &= ~EXTERN_VOLTAGE_SENSOR;
  	//}
}
/*
void ClrDispVary(unsigned char OpMode)
{
	if(OpMode == 1)
	{
		emeter.ui_voltage_V1RMS = 0;
    	emeter.ui_current_IRMS = 0;
    }
    emeter.ul_react_power = 0;
    emeter.ul_app_power = 0;
    emeter.ui_main_frequency = 0;
    emeter.ui_power_factor = 0;
    emeter.ul_act_power1 = 0;
    emeter.ul_act_power2 = 0;
}*/
/*
void EnterSD16Measure (void)
{
	// 若已在SD16测量模式,则跳过
	if((emeter.ui_anti_tamperring_status & IN_SD16_MEASURE_MODE) == 0)
	{
		init_analog_front_end_SD16();
		TACCTL0 &= ~CCIE;	// Disable TimerA CCR0 Interrupt
		emeter.uc_switch_delay_counter = 0;
		emeter.ui_anti_tamperring_status |= IN_SD16_MEASURE_MODE;
		ClrDispVary(1);
		SCFI0 = FLLD_1;  			    // Freq = 1.024MHz
    	SCFQCTL = 32 - 1;
    	FLL_CTL0 |= DCOPLUS;
	}			
}
void ExitSD16Measure (void)
{
	// 若已不在SD16测量模式,则跳过
	if((emeter.ui_anti_tamperring_status & IN_SD16_MEASURE_MODE) == IN_SD16_MEASURE_MODE)
	{
		SD16CCTL2 &= ~SD16SC;
		SD16CTL &= ~SD16REFON; // Switch Reference off
		emeter.ui_anti_tamperring_status &= ~IN_SD16_MEASURE_MODE;
	}
}
void EnterESPMeasure (void)
{
	// 若已在ESP测量模式,则跳过
	if((emeter.ui_anti_tamperring_status & IN_ESP_MEASURE_MODE) == 0)
	{
		Init_Analog_Front_End_ESP();	// 初始化模拟前端
  		Init_ESP_Parameter();	// 初始化ESP参数寄存器
  		Start_Measurement();	// 进入测量模式
  		TACCTL0 |= CCIE;	// Enable TimerA CCR0 Interrupt
  		emeter.uc_switch_delay_counter = 0;
  		emeter.ui_anti_tamperring_status |= IN_ESP_MEASURE_MODE;
  		
	}
}
void ExitESPMeasure (void)
{
	// 若已不在ESP测量模式,则跳过
	if((emeter.ui_anti_tamperring_status & IN_ESP_MEASURE_MODE) == IN_ESP_MEASURE_MODE)
	{
		MBOUT1= modeIDLE; // ESP_IDLE;
        MBOUT0= mSET_MODE;
        while ((ESP430_STAT0 & ACTIVEME) == ACTIVEME); // Wait for Idle mode
        if ((ESP430_STAT0 & ACTIVEME) == 0)
        {
        	ESPCTL = 0;
        	// wait 10 clock till proper access to the SD16 is possilbe (9 clock are required)
        	_NOP();_NOP();_NOP();_NOP();_NOP();
       		_NOP();_NOP();_NOP();_NOP();_NOP();
       		SD16CTL &= ~SD16REFON; // Switch Reference off
       	}
       	emeter.ui_anti_tamperring_status &= ~IN_ESP_MEASURE_MODE;
	}
}


void SwitchToSD16Measure(void)
{
	ExitESPMeasure();
	EnterSD16Measure();
	emeter.ui_anti_tamperring_status &= ~IN_ONLY_RTC_MODE;
}


void SwitchToESPMeasure(void)
{
	ExitSD16Measure();
	EnterESPMeasure();
	emeter.ui_anti_tamperring_status &= ~IN_ONLY_RTC_MODE;
}


void OnlyRTCMode(void)
{
	ExitSD16Measure();
	ExitESPMeasure();
	TACCTL0 &= ~CCIE;	// Disable TimerA CCR0 Interrupt
	SVSCTL = 0;
	if((emeter.ui_anti_tamperring_status & IN_ONLY_RTC_MODE) == 0)
	{
		emeter.ui_anti_tamperring_status |= IN_ONLY_RTC_MODE;
		ClrDispVary(0);
	}
}
*/

⌨️ 快捷键说明

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