实例介绍
【源码目录】
HT5017
└── HT5017_141114范例
├── HT5017防窃电应用方案.pdf
├── Libraries
│ ├── CMSIS
│ │ └── CM0
│ │ ├── CoreSupport
│ │ │ ├── core_cm0.c
│ │ │ ├── core_cm0.h
│ │ │ ├── core_cmFunc.h
│ │ │ └── core_cmInstr.h
│ │ └── DeviceSupport
│ │ ├── ht6xxx.h
│ │ ├── system_ht6xxx.c
│ │ └── system_ht6xxx.h
│ ├── HT60xx_StdPeriph_Driver
│ │ ├── inc
│ │ └── src
│ └── Startup
│ └── startup_ht501x.s
├── Project
│ ├── 1301_uart0.bin
│ ├── ExtDll.iex
│ ├── GPIO.axf
│ ├── GPIO.hex
│ ├── GPIO.htm
│ ├── GPIO.lnp
│ ├── GPIO.map
│ ├── GPIO.plg
│ ├── GPIO.sct
│ ├── GPIO.tra
│ ├── GPIO.uvgui.Administrator
│ ├── GPIO.uvgui.qdli
│ ├── GPIO.uvgui.user
│ ├── GPIO.uvgui.yqguo
│ ├── GPIO.uvgui_Administrator.bak
│ ├── GPIO.uvgui_qdli.bak
│ ├── GPIO.uvgui_user.bak
│ ├── GPIO.uvgui_yqguo.bak
│ ├── GPIO.uvopt
│ ├── GPIO.uvproj
│ ├── GPIO_Target 1.dep
│ ├── GPIO_uvopt.bak
│ ├── GPIO_uvproj.bak
│ ├── JLinkLog.txt
│ ├── JLinkSettings.ini
│ ├── cmu.crf
│ ├── cmu.d
│ ├── cmu.o
│ ├── core_cm0.crf
│ ├── core_cm0.d
│ ├── core_cm0.o
│ ├── dlt645.crf
│ ├── dlt645.d
│ ├── dlt645.o
│ ├── emu.crf
│ ├── emu.d
│ ├── emu.o
│ ├── gpio.crf
│ ├── gpio.d
│ ├── gpio.o
│ ├── i2c.crf
│ ├── i2c.d
│ ├── i2c.o
│ ├── key.crf
│ ├── key.d
│ ├── key.o
│ ├── lcd.crf
│ ├── lcd.d
│ ├── lcd.o
│ ├── main.crf
│ ├── main.d
│ ├── main.o
│ ├── pmu.crf
│ ├── pmu.d
│ ├── pmu.o
│ ├── rtc.crf
│ ├── rtc.d
│ ├── rtc.o
│ ├── startup_ht501x.d
│ ├── startup_ht501x.lst
│ ├── startup_ht501x.o
│ ├── startup_ht60xx.d
│ ├── startup_ht60xx.lst
│ ├── startup_ht60xx.o
│ ├── system_ht60xx.crf
│ ├── system_ht60xx.d
│ ├── system_ht6xxx.crf
│ ├── system_ht6xxx.d
│ ├── system_ht6xxx.o
│ ├── uart.crf
│ ├── uart.d
│ └── uart.o
├── Users
│ ├── cmu.c
│ ├── cmu.h
│ ├── dlt645.c
│ ├── dlt645.h
│ ├── eeprom.h
│ ├── emu.c
│ ├── emu.h
│ ├── i2c.c
│ ├── i2c.h
│ ├── include.h
│ ├── key.c
│ ├── key.h
│ ├── lcd.c
│ ├── lcd.h
│ ├── main.c
│ ├── pmu.c
│ ├── pmu.h
│ ├── rtc.c
│ ├── rtc.h
│ ├── uart.c
│ └── uart.h
├── si
│ ├── HT5017_141114.IAB
│ ├── HT5017_141114.IAD
│ ├── HT5017_141114.IMB
│ ├── HT5017_141114.IMD
│ ├── HT5017_141114.PFI
│ ├── HT5017_141114.PO
│ ├── HT5017_141114.PR
│ ├── HT5017_141114.PRI
│ ├── HT5017_141114.PS
│ └── HT5017_141114.WK3
└── 校表说明.txt
13 directories, 113 files
【核心代码】
#include "include.h"
#define DCWORD_READ_DATA 0x11 //¶ÁÊý¾Ý
#define DCWORD_READ_MORE 0x12 //¶ÁºóÐøÊý¾Ý
#define DCWORD_READ_ADDR 0x13 //¶ÁͨѶµØÖ·
#define DCWORD_WRITE_DATA 0x14 //дÊý¾Ý
#define DCWORD_WRITE_ADDR 0x15 //дͨѶµØÖ·
#define USER_DI3 0xF9 //Óû§ÃüÁî ÓÃÓÚУ±í ³õʼ»¯ ÇåÁã
#define USER_RESET_DIX 0xF9010101 //ϵͳ³õʼ»¯ÃüÁîÊý¾Ý±êʶ
#define USER_INITIAL 0xABCD
#define VBAT_CHECK_SUM 0x12345699
#define BROAD_CAST_99 0x99
#define BROAD_CAST_AA 0xAA
#define DLT645_NO_ERR 0x00
#define DLT645_OTHER_ERR 0x01
#define DLT645_NO_DATA_ERR 0x02
#define DLT645_PASSWORD_ERR 0x04
#define DLT645_BAUDRATE_ERR 0x08
#define DLT645_NianShiQu_ERR 0x10
#define DLT645_RiShiDuan_ERR 0x20
#define DLT645_POWER_RATE_ERR 0x40
#define DLT645_NO_SEND_ERR 0xFF
typedef union
{
struct
{
uint8_t other_err:1; //0±íʾÎÞERR 1ÓÐÏàÓ¦ERR·¢Éú
uint8_t no_data_err:1;
uint8_t password_err:1;
uint8_t baudrate_err:1;
uint8_t nian_shiqu_err:1;
uint8_t ri_shiduan_err:1;
uint8_t power_rate_err:1;
uint8_t reserved:1;
}Bits;
uint8_t err;
}DLT645_ERR_DEF;
enum{Ar_Lc=0,Ar_AA,Ar_99,Ar_AL};
typedef union
{
struct
{
uint8_t pass_word:2; // //1:PA=2 2:PA=4 3:PA=89 ÓÃÓÚУ±í³õʼ»¯µÈ 7£ºÃÜÂë´íÎó
uint8_t address:2; //0 ±¾µØµØÖ· 1£ºÍòÄܵØÖ·AA 2£º¹ã²¥µØÖ·99 3: ȱʡµØÖ·-Ö»ÄÜÓÃÀ´¶Á
uint8_t seq:2; //ÓÃÓÚ±£´æÉÏһ֡ͨѶʱseq ÔÝʱÁ½¸öbit ¿ÉÈ·¶¨Èý¸öseq 1 2 3
uint8_t reserved:2; //ÓкóÐøÊý¾Ý¸üÐÂseq£¬ÎÞÔòÇåÁã
}Bits;
uint8_t parse_state;
}DLT645_PARSE_STATE_DEF;
typedef struct
{
uint8_t DI0;
uint8_t DI1;
uint8_t DI2;
uint8_t DI3;
uint32_t DIx;
}DLT645_DATAICON_Format; //Êý¾Ý±êʶ
DLT_BUF uart4_buf;
static DLT645_ERR_DEF dlt645_err;
static DLT645_PARSE_STATE_DEF dlt645_parse;
static DLT645_DATAICON_Format dlt645_di;
static uint8_t check_645_format(DLT_BUF *ptr_uart_buf);
static uint8_t check_address(DLT_BUF *ptr_uart_buf);
static uint8_t check_sum(uint8_t *ptr, uint8_t len);
static void DLT_645_Parse(DLT_BUF *ptr_uart_buf);
static void read_data(DLT_BUF *ptr_uart_buf);
static void user_read_def(DLT_BUF *ptr_uart_buf);
static void write_can_var(DLT_BUF *ptr_uart_buf);
static void user_write_def(DLT_BUF *ptr_uart_buf);
static void DLT_645_Err_Send(DLT_BUF *ptr_uart_buf);
static void DLT_645_Nor_Send(DLT_BUF *ptr_uart_buf);
void DLT_645_Proc(DLT_BUF *ptr_uart_buf)
{
dlt645_err.err=check_645_format(ptr_uart_buf);//¼ì²éÊý¾Ý¸ñʽÊÇ·ñÓдí
if(dlt645_err.err==DLT645_NO_ERR)
{
DLT_645_Parse(ptr_uart_buf); //Êý¾Ý½âÎö
}
if(dlt645_err.err!=DLT645_NO_ERR)
{
DLT_645_Err_Send(ptr_uart_buf);
}
else
{
DLT_645_Nor_Send(ptr_uart_buf);
}
}
uint8_t check_645_format(DLT_BUF *ptr_uart_buf)
{
uint8_t tmp,length;
/***************Åжϻù±¾¸ñʽ***************/
length=ptr_uart_buf->DLT645_ComFormat.data_length;
if(ptr_uart_buf->DLT645_ComFormat.start_code!=0x68) return DLT645_NO_SEND_ERR;
if(ptr_uart_buf->DLT645_ComFormat.mid_start_code!=0x68) return DLT645_NO_SEND_ERR;
if(ptr_uart_buf->DLT645_ComFormat.com_data[length 1]!=0x16) return DLT645_NO_SEND_ERR;
/***************ÅжϵØÖ·***************/
tmp=check_address(ptr_uart_buf);
if(tmp!=DLT645_NO_ERR) return tmp;
/***************ÅжÏchecksum***************/
tmp=check_sum((uint8_t*)ptr_uart_buf, length 10);
if(tmp!=DLT645_NO_ERR) return tmp;
return DLT645_NO_ERR;
}
uint8_t check_address(DLT_BUF *ptr_uart_buf)
{
uint8_t i,a9,aa,a0;
a9=0;
aa=0;
a0=0;
for(i=0;i<6;i )
{
if(ptr_uart_buf->DLT645_ComFormat.meter_address[i]==BROAD_CAST_99)
{
a9 ;
}
if(ptr_uart_buf->DLT645_ComFormat.meter_address[i]==BROAD_CAST_AA)
{
aa ;
}
// if(ptr_uart_buf->DLT645_ComFormat.meter_address[i]==can_var.address[i]) //±¾µØµØÖ·
// {
// a0 ;
// }
}
if(a9==6) //2£º¹ã²¥µØÖ·99
{
dlt645_parse.Bits.address=Ar_99;
return DLT645_NO_ERR;
}
else if(aa==6) //1£ºÍòÄܵØÖ·AA
{
dlt645_parse.Bits.address=Ar_AA;
return DLT645_NO_ERR;
}
else if(a0==6) //0: ±¾µØµØÖ·
{
dlt645_parse.Bits.address=Ar_Lc;
return DLT645_NO_ERR;
}
else
{
return DLT645_NO_SEND_ERR;
}
}
//УÑéºÍ
uint8_t check_sum(uint8_t *ptr, uint8_t len)
{
uint8_t i,sum;
for(sum=0,i=0;i<len;i )
{
sum = *(ptr i);
}
if(sum==*(ptr i))
{
for(i=10;i<len;i ) //-0x33
{
*(ptr i) -= 0x33;
}
return DLT645_NO_ERR;
}
return DLT645_NO_SEND_ERR;
}
void DLT_645_Parse(DLT_BUF *ptr_uart_buf)
{
dlt645_di.DI0=ptr_uart_buf->DLT645_ComFormat.com_data[0];
dlt645_di.DI1=ptr_uart_buf->DLT645_ComFormat.com_data[1];
dlt645_di.DI2=ptr_uart_buf->DLT645_ComFormat.com_data[2];
dlt645_di.DI3=ptr_uart_buf->DLT645_ComFormat.com_data[3];
dlt645_di.DIx=(((uint32_t)dlt645_di.DI3)<<24)|(((uint32_t)dlt645_di.DI2)<<16)|(((uint32_t)dlt645_di.DI1)<<8)|(((uint32_t)dlt645_di.DI0));
switch(ptr_uart_buf->DLT645_ComFormat.control_code)
{
case DCWORD_READ_DATA: //11 ¶ÁÊý¾Ý
read_data(ptr_uart_buf);
break;
case DCWORD_WRITE_DATA: //14 дÊý¾Ý
write_can_var(ptr_uart_buf);
break;
default:
dlt645_err.err=DLT645_NO_DATA_ERR;
break;
}
}
void read_data(DLT_BUF *ptr_uart_buf)
{
if(dlt645_di.DI3!=USER_DI3)
{
if((dlt645_parse.Bits.address==Ar_99)||(dlt645_parse.Bits.address==Ar_AA))
{
dlt645_err.err=DLT645_NO_SEND_ERR;
return;
}
}
if(ptr_uart_buf->DLT645_ComFormat.data_length!=4)
{
dlt645_err.err=DLT645_OTHER_ERR;
return;
}
switch(dlt645_di.DI3)
{
case USER_DI3:
user_read_def(ptr_uart_buf); //Óû§×Ô¶¨Òå³ÌÐò ÓÃÓÚУ±í,³õʼ»¯µÈ
break;
default:
dlt645_err.err=DLT645_NO_DATA_ERR;
break;
}
}
void user_read_def(DLT_BUF *ptr_uart_buf) //¶ÁУ±í²ÎÊýµÈ
{
uint8_t *ptr, len;
uint16_t DI_10;
uint32_t read_var;
len=ptr_uart_buf->DLT645_ComFormat.data_length;
ptr=(uint8_t*)&ptr_uart_buf->DLT645_ComFormat.com_data[len];
DI_10=(((uint16_t)dlt645_di.DI1)<<8)|((uint16_t)dlt645_di.DI0);
if(dlt645_di.DI2==0)
{
if((dlt645_di.DI0%4==0)&&(dlt645_di.DI1!=0x30)) //У±í²ÎÊý
{
read_var=Read_ECADR(DI_10-0x3800);
}
else if((dlt645_di.DI0%4==0)&&(dlt645_di.DI1==0x30)) //¼ÆÁ¿²ÎÊý
{
read_var=Read_EPADR(DI_10-0x3000);
}
else
{
if((dlt645_di.DI0==0xC1)&&(dlt645_di.DI1==0x30))
{
emu_cal_mode=1;
}
else if((dlt645_di.DI0==0xC2)&&(dlt645_di.DI1==0x30))
{
emu_cal_mode=2;
}
else if((dlt645_di.DI0==0xC3)&&(dlt645_di.DI1==0x30))
{
emu_cal_mode=3;
}
else if((dlt645_di.DI0==0xC5)&&(dlt645_di.DI1==0x30))
{
emu_cal_mode=0;
}
else if((dlt645_di.DI0==0xC6)&&(dlt645_di.DI1==0x30))
{
emu_cal_mode=4;
}
dlt645_err.err=DLT645_NO_DATA_ERR;
return;
}
ptr[0]=(((read_var>>24)&0xFF)-0x33); //¸ßλ
ptr[1]=(((read_var>>16)&0xFF)-0x33);
ptr[2]=(((read_var>>8)&0xFF)-0x33);
ptr[3]=((read_var&0xFF)-0x33);
ptr_uart_buf->DLT645_ComFormat.data_length=8;
}
else //user def
{
dlt645_err.err=DLT645_NO_DATA_ERR;
return;
}
}
void write_can_var(DLT_BUF *ptr_uart_buf)
{
if(USER_DI3==dlt645_di.DI3)
{
user_write_def(ptr_uart_buf);
}
else
{
dlt645_err.err=DLT645_NO_DATA_ERR;
return;
}
}
void user_write_def(DLT_BUF *ptr_uart_buf)
{
uint8_t tx;
uint8_t len, *ptr;
uint16_t DI_10, emu_var;
uint32_t vbat_ckecksum;
len=ptr_uart_buf->DLT645_ComFormat.data_length;
ptr=(uint8_t*)&ptr_uart_buf->DLT645_ComFormat.com_data[12];
if(len!=14)
{
dlt645_err.err=DLT645_OTHER_ERR;
return;
}
DI_10=(((uint16_t)dlt645_di.DI1)<<8)|((uint16_t)dlt645_di.DI0);
emu_var=((uint16_t)ptr[1]<<8)|((uint16_t)ptr[0]);
tx=1;
if(dlt645_di.DI2==0)
{
switch(dlt645_di.DI0)
{
case 0xA1: //µçѹϵÊý
emu_ecr_reg.ECR.Emu_Krms=(float)(((float)emu_var*1000)/((float)Read_EPADR(EPR_FastRMSU))); //3λСÊý
break;
case 0xA2: //µçÁ÷ͨµÀϵÊý
if(emu_cal_mode!=4)
{
emu_ecr_reg.ECR.Emu_Kims=(float)(((float)emu_var*1000)/((float)Read_EPADR(EPR_FastRMSI1))); //3λСÊý
}
else
{
kims_fast_rmsi1=(float)(((float)emu_var*1000)/((float)fast_get_rmsi1())); //3λСÊý
}
break;
case 0xA3: //Óй¦¹¦ÂÊϵÊý
emu_ecr_reg.ECR.Emu_Kp=(float)(((float)emu_var)/((float)Read_EPADR(EPR_FastPowerP1))); //3λСÊý kw
break;
default:
// tx=0;
// dlt645_err.err=DLT645_NO_DATA_ERR;
break;
}
if(((dlt645_di.DI0%4==0)&&(dlt645_di.DI1!=0x30))||(dlt645_di.DI0==0xA1)||(dlt645_di.DI0==0xA2)||(dlt645_di.DI0==0xA3))
{
if(dlt645_di.DI0%4==0) //У±í²ÎÊý
{
if(dlt645_di.DI0==0x0C)
{
Write_ECADR(VAR_GP1, emu_var);
Write_ECADR(VAR_GQ1, emu_var);
Write_ECADR(VAR_GS1, emu_var);
emu_ecr_reg.ECR.GP1 = emu_var;
emu_ecr_reg.ECR.GQ1 = emu_var;
emu_ecr_reg.ECR.GS1 = emu_var;
}
else
{
Write_ECADR(DI_10-0x3800, emu_var);
emu_ecr_reg.ec_array[(DI_10-0x3800)/2] = emu_var&0x00ff;
emu_ecr_reg.ec_array[(DI_10-0x3800)/2 1] = emu_var>>8;
}
}
}
else
{
tx=0;
dlt645_err.err=DLT645_NO_DATA_ERR;
}
if(tx)
{
get_checksum((uint8_t*)&emu_ecr_reg,150);
if(emu_cal_mode==0)
{
write_eeprom((uint8_t*)&emu_ecr_reg,EE_EMU_VAR,150);
write_eeprom((uint8_t*)&emu_ecr_reg,EE_RESAVE_EMU_VAR,150);
emu_var_checksum = Read_EPADR(EPR_Checksum);
}
else if(emu_cal_mode==1)
{
write_eeprom((uint8_t*)&emu_ecr_reg,EE_EMU_VAR_225K,150);
emu_var_checksum = Read_EPADR(EPR_Checksum);
}
else if(emu_cal_mode==2)
{
write_eeprom((uint8_t*)&emu_ecr_reg,EE_EMU_VAR_32K,150);
emu_var_checksum = Read_EPADR(EPR_Checksum);
}
else if(emu_cal_mode==3)
{
write_eeprom((uint8_t*)&emu_ecr_reg,EE_EMU_VAR_CONST,150);
emu_var_checksum = Read_EPADR(EPR_Checksum);
}
else if(emu_cal_mode==4)
{
write_eeprom((uint8_t*)&kims_fast_rmsi1,EE_EMU_KIMS_FAST,4);
}
ptr_uart_buf->DLT645_ComFormat.data_length=0;
}
}
else if(USER_RESET_DIX==dlt645_di.DIx)
{
if(emu_var==USER_INITIAL) //ËùÓгõʼ»¯
{
vbat_ckecksum=VBAT_CHECK_SUM;
write_eeprom((uint8_t*)&vbat_ckecksum,EE_INITIAL_DWORD_ADDRESS,4);
FreeDog();
}
else
{
dlt645_err.err=DLT645_NO_DATA_ERR;
return;
}
}
else //Óû§×Ô¶¨ÒåÏà¹ØÃüÁî ÓÃÓÚÇåÁãµÈ
{
dlt645_err.err=DLT645_NO_DATA_ERR;
return;
}
}
void DLT_645_Err_Send(DLT_BUF *ptr_uart_buf)
{
uint8_t checksum,i;
uint8_t *ptr;
if(dlt645_err.err==DLT645_NO_SEND_ERR)
{
//²»·¢ËÍ Ö÷ҪΪµØÖ·²»Æ¥Åä Ö±½ÓÖØÐ½øÈë½ÓÊÕ̬
uart_var_init();
}
else //·¢Ë͹ÊÕÏÖ¡
{
ptr_uart_buf->DLT645_ComFormat.control_code|=0xC0;
ptr_uart_buf->DLT645_ComFormat.data_length=0x01;
ptr_uart_buf->DLT645_ComFormat.com_data[0]=dlt645_err.err;
ptr_uart_buf->DLT645_ComFormat.com_data[0] =0x33;
checksum=0;
ptr=(uint8_t*)ptr_uart_buf;
for(i=0;i<11;i )
{
checksum =ptr[i];
}
ptr_uart_buf->DLT645_ComFormat.com_data[1]=checksum;
ptr_uart_buf->DLT645_ComFormat.com_data[2]=0x16;
prepare_uart4_send();
}
}
void DLT_645_Nor_Send(DLT_BUF *ptr_uart_buf)
{
uint8_t checksum,i,j;
uint8_t *ptr;
ptr_uart_buf->DLT645_ComFormat.control_code|=0x80;
for(i=0;i<ptr_uart_buf->DLT645_ComFormat.data_length;i )
{
ptr_uart_buf->DLT645_ComFormat.com_data[i] =0x33;
}
j=ptr_uart_buf->DLT645_ComFormat.data_length 10;
checksum=0;
ptr=(uint8_t*)ptr_uart_buf;
for(i=0;i<j;i )
{
checksum =ptr[i];
}
ptr_uart_buf->DLT645_ComFormat.com_data[ptr_uart_buf->DLT645_ComFormat.data_length]=checksum;
ptr_uart_buf->DLT645_ComFormat.com_data[ptr_uart_buf->DLT645_ComFormat.data_length 1]=0x16;
prepare_uart4_send();
}
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论