📄 tool.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 + -