赛元芯片使用

一、环境部署

查看赛元开发量产工具手册的2 SC LINK仿真使用说明章节
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

点击LOAD,仿真器下载程序成功如下图所示。
在这里插入图片描述
二、关于赛元单片机的一些使用总结

  1. 数码管动态扫描控制思路:利用定时器(3ms)+switch扫描,如果想前几位不显示,可以利用(Counter%x),如果(Counter%x)小于零,就不配置位控制直接跳过。Number(Counter%x);实现段控制。Number()函数的实现也是通过switch选择想要段控制显示的数字,每个数字由8个段控制实现。Counter是定时器计数值。
void LedSeg_Display(BOOL flag)
{    
static u8 segIndex = 0;
	if(flag)	
	{	    
	DisplayTimerFlag = 0;	//定时器定时结束标志清零		
	//控制当前的COM使能		
	segIndex = (++segIndex%8);	//8位数码管循环显示		
	switch(segIndex)		
	{            
	case 5://			
	COM1(0);			
	COM2(0);			
	COM3(0);			
	COM4(0);			
	COM5(0);			
	COM6(0);		//先关闭位控制,最后再开启位控制显示对应位,减少显示余影
	COM7(0);
	COM8(0);			
	Number(Counter%10);			
	seg_point(1);		//段控制,最后一位有小数点要显示,单独提出来显示	
	COM6(1);			
	break; 		    
	default:			
	break;		
	}	
	}
}

void Number(U8 x)
{
	if(x>=0)
	{
		x=x%10;
		switch(x)
		{
			case 0:Numb0();
			break;
			case 1:Numb1();
			break;
			case 2:Numb2();
			break;
			case 3:Numb3();
			break;
			case 4:Numb4();
			break;
			case 5:Numb5();
			break;
			case 6:Numb6();
			break;
			case 7:Numb7();
			break;
			case 8:Numb8();
			break;
			case 9:Numb9();
			break;
		}
	}
}

//================================================================
//                                         数码管配置
//================================================================
#define COM1(x)     GPIO_WriteBit(GPIO3,GPIO_PIN_7,x);
#define COM2(x)     GPIO_WriteBit(GPIO3,GPIO_PIN_6,x);
#define COM3(x)     GPIO_WriteBit(GPIO3,GPIO_PIN_2,x);
#define COM4(x)     GPIO_WriteBit(GPIO3,GPIO_PIN_3,x);
#define COM5(x)     GPIO_WriteBit(GPIO3,GPIO_PIN_4,x);
#define COM6(x)     GPIO_WriteBit(GPIO3,GPIO_PIN_5,x);


#define SEG_A(x)    GPIO_WriteBit(GPIO2,GPIO_PIN_5,!x);
#define SEG_B(x)    GPIO_WriteBit(GPIO2,GPIO_PIN_4,!x);
#define SEG_C(x)    GPIO_WriteBit(GPIO2,GPIO_PIN_3,!x);
#define SEG_D(x)    GPIO_WriteBit(GPIO2,GPIO_PIN_2,!x);
#define SEG_E(x)    GPIO_WriteBit(GPIO2,GPIO_PIN_1,!x);
#define SEG_F(x)    GPIO_WriteBit(GPIO2,GPIO_PIN_0,!x);
#define SEG_G(x)    GPIO_WriteBit(GPIO1,GPIO_PIN_7,!x);
#define SEG_X(x)    GPIO_WriteBit(GPIO1,GPIO_PIN_6,!x);

#define  Numb0()  {SEG_A(1) SEG_B(1) SEG_C(1) SEG_D(1) SEG_E(1) SEG_F(1) SEG_G(0) SEG_X(0) }
#define  Numb1()  {SEG_A(0) SEG_B(1) SEG_C(1) SEG_D(0) SEG_E(0) SEG_F(0) SEG_G(0) SEG_X(0) }
#define  Numb2()  {SEG_A(1) SEG_B(1) SEG_C(0) SEG_D(1) SEG_E(1) SEG_F(0) SEG_G(1) SEG_X(0) }
#define  Numb3()  {SEG_A(1) SEG_B(1) SEG_C(1) SEG_D(1) SEG_E(0) SEG_F(0) SEG_G(1) SEG_X(0) }
#define  Numb4()  {SEG_A(0) SEG_B(1) SEG_C(1) SEG_D(0) SEG_E(0) SEG_F(1) SEG_G(1) SEG_X(0) }
#define  Numb5()  {SEG_A(1) SEG_B(0) SEG_C(1) SEG_D(1) SEG_E(0) SEG_F(1) SEG_G(1) SEG_X(0) }
#define  Numb6()  {SEG_A(1) SEG_B(0) SEG_C(1) SEG_D(1) SEG_E(1) SEG_F(1) SEG_G(1) SEG_X(0) }
#define  Numb7()  {SEG_A(1) SEG_B(1) SEG_C(1) SEG_D(0) SEG_E(0) SEG_F(0) SEG_G(0) SEG_X(0) }
#define  Numb8()  {SEG_A(1) SEG_B(1) SEG_C(1) SEG_D(1) SEG_E(1) SEG_F(1) SEG_G(1) SEG_X(0) }
#define  Numb9()  {SEG_A(1) SEG_B(1) SEG_C(1) SEG_D(1) SEG_E(0) SEG_F(1) SEG_G(1) SEG_X(0) }

#define  Numbx()  {SEG_A(0) SEG_B(0) SEG_C(0) SEG_D(0) SEG_E(0) SEG_F(0) SEG_G(0) SEG_X(1) }

2.硬件实现数码管显示,注意要与芯片上的引脚对应,Cx为位选控制引脚,通过0-7数值控制位选,Sx为段控制引脚,查表获取其对应的操作地址。

//led_display.c
#include "LED_DISPLAY.H"
//-----------------------共阴数码管编码表---------------------------
//uint8_t code LedCodeTab[]={0xD7,0x14,0xCD,0x5D,0x1E,0x5B,0xDB,0x15,0xDf,0x5F,0x9F,0xDA,0xC3,0xDC,0xCB,0x8B,0x00,0xff,0x08};
//-----------------------共阳数码管编码表---------------------------
uint8_t code LedCodeTab[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
//-----------------------LED显示RAM数据缓存数组----------------
uint8_t data LedTemp[8] = {0,0,0,0,0,0,0,0};
//-----------------------LED显示RAM配置-----------------------
uint8_t xdata LedDisplay[28] _at_ 0X700;
void LedSeg_initail(void)
{
//  软件实现
#if 0
	COM1(0);
	COM2(0);
	COM3(0);
	COM4(0);
	COM5(0);
	COM6(0);
	
       //seg0-7 output
	GPIO_Init(GPIO1, _BIT6|_BIT7, GPIO_MODE_OUT_PP);
	GPIO_Init(GPIO2, _BIT5|_BIT4|_BIT3|_BIT2|_BIT1|_BIT0, GPIO_MODE_OUT_PP);


	//comm1-6 output
	//GPIO_Init(GPIO3, _BIT5|_BIT4|_BIT3|_BIT2|_BIT1|_BIT0, GPIO_MODE_OUT_PP);
	GPIO_Init(GPIO3, _BIT5|_BIT4|_BIT3|_BIT2|_BIT6|_BIT7, GPIO_MODE_OUT_PP);

	GPIO_WriteBit(GPIO1, _BIT6|_BIT7,0);
	GPIO_WriteBit(GPIO2, _BIT5|_BIT4|_BIT3|_BIT2|_BIT1|_BIT0,0);
	GPIO_WriteBit(GPIO3, _BIT5|_BIT4|_BIT3|_BIT2|_BIT6|_BIT7,0);
#endif

//  硬件实现
	DDIC_Init(DDIC_DUTYCYCLE_D6, 0X00, 0XC0, 0X3F, 0XFC);  //占空比1/6,P16~P17,P20~P25,P32~P37为DDIC输出脚
	DDIC_LEDConfig();		   //DDIC配置为LED模式
	DDIC_Cmd(ENABLE);	//数码管初始化
}

/**************************************************
*函数名称:void LedSegData(UINT8 LedData,LedSelCOM COMx)
*函数功能:LED显示数据转换
*入口参数:LedData               LED显示数据
		   COMx		             COM口选择(取值范围:LEDCOM0~7)
*出口参数:void
*功能说明:
**************************************************/
void LedSegData(uint8_t LedData,LedSelCOM COMx)
{
	LedTemp[0]  |=  ((LedData>>0)&0x01)<<COMx;
	LedTemp[1]  |=  ((LedData>>1)&0x01)<<COMx;
 	LedTemp[2]  |=  ((LedData>>2)&0x01)<<COMx;
 	LedTemp[3]  |=  ((LedData>>3)&0x01)<<COMx;
	LedTemp[4]  |=  ((LedData>>4)&0x01)<<COMx;
 	LedTemp[5]  |=  ((LedData>>5)&0x01)<<COMx;
 	LedTemp[6]  |=  ((LedData>>6)&0x01)<<COMx;
   	LedTemp[7]  |=  ((LedData>>7)&0x01)<<COMx; 
}

/**************************************************
*函数名称:void Led_Display(void)
*函数功能:led
*入口参数:无
*出口参数:void
*功能说明:COM口必须跟使用的COM相对应
**************************************************/
void Led_Display(void)
{
       UINT8 i;
	   g_bLEDDispTimerFlag = 0;	//数码管调用标志位

		for(i=0;i<8;i++)
		{
			LedTemp[i]=0;  //段显示清零,此处不能删除 !!!!!
		}
	
		LedSegData(LedCodeTab[(g_bTimeHourHight16%1000/100)], LEDCOM7);		//  第一位数码管
		LedSegData(LedCodeTab[(g_bTimeHourHight16%100/10)], LEDCOM6);		//  第二位数码管
		LedSegData(LedCodeTab[(g_bTimeHourHight16%10)], LEDCOM2);		//  第三位数码管
		LedSegData(LedCodeTab[(g_bTimeHourLow16%1000/100)], LEDCOM3);		//  第四位数码管
		LedSegData(LedCodeTab[(g_bTimeHourLow16%100/10)], LEDCOM4);		//  第五位数码管
		LedSegData(LedCodeTab[(g_bTimeHourLow16%10)]&0x7F, LEDCOM5);		//  第六位数码管,带小数点显示
	
		LedDisplay[17] = LedTemp[0];
		LedDisplay[16] = LedTemp[1];
		LedDisplay[15] = LedTemp[2];
		LedDisplay[14] = LedTemp[3];
		LedDisplay[13] = LedTemp[4];
		LedDisplay[12] = LedTemp[5];
		LedDisplay[11] = LedTemp[6];
		LedDisplay[10] = LedTemp[7];
}

//led_display.h
#ifndef _LED_DISPLAY_H_
#define _LED_DISPLAY_H_
#include "sc92f754x.h"

typedef enum {
	LEDCOM0 = (uint8_t)0x00,
	LEDCOM1 = (uint8_t)0x01,
	LEDCOM2 = (uint8_t)0x02,
	LEDCOM3 = (uint8_t)0x03,
	LEDCOM4 = (uint8_t)0x04,
	LEDCOM5 = (uint8_t)0x05,
	LEDCOM6 = (uint8_t)0x06,
	LEDCOM7 = (uint8_t)0x07
} LedSelCOM;

void LedSegData(uint8_t LedData,LedSelCOM COMx);
void Led_Display(void);
#endif



3.控制蜂鸣器响的频率思路:通过定时器定时反转蜂鸣器IO口电平实现

void Timer0Init(void)
{	
	TIM0_TimeBaseInit(TIM0_PRESSEL_FSYS_D1,TIM0_MODE_TIMER);	 //定时产生方波驱动蜂鸣器	
	TIM0_WorkMode0Config(8192-1600);	
	TIM0_Cmd(ENABLE);
	TIM0_ITConfig(ENABLE,LOW);
	//使能Timer0计数
} 
void Timer0Interrupt()		interrupt 1
{	TIM0_Mode0SetReloadCounter(8192-1600);	//定时0.1ms,  频率10Khz
	T0FlagpwmCount++;	
	if(T0FlagpwmCount>=5)	//	2khz	
	{             T0FlagpwmCount = 0;	      	 
			BuzzerPWM();	
	}
} 
void BuzzerPWM(void)
{       static BOOL Flag = 0;
       Flag = !Flag;
        if(Flag)		
        {		      
        GPIO_WriteHigh(GPIO1,GPIO_PIN_0);
        }		
        else{		      
        GPIO_WriteLow(GPIO1,GPIO_PIN_0);		
       }
}

4.关于74HC595的使用

#define	DCLK(x)  
if(x){GPIO_WriteHigh(hw_CLK_Pin_36());}
else{GPIO_WriteLow(hw_CLK_Pin_36());}
#define	DATA(x)   
if(x){GPIO_WriteHigh(hw_DATA_Pin_32());}
else{GPIO_WriteLow(hw_DATA_Pin_32());}
#define	RCLK_L(x)  
if(x){GPIO_WriteHigh(hw_CS_Pin_35());}
else{GPIO_WriteLow(hw_CS_Pin_35());} 
//全输出
hc595_send_data(0X00);
//不输出
hc595_send_data(0XFF);
void hc595_send_data( u8 input_data ) 
{	
	u8 i;	
	DCLK(1);//SHCP	
	RCLK_L(1);//STCP	
	for( i = 0 ; i < 8; i++ )	
	{		
	DATA((input_data >> 7)&0x01); //DS		
	input_data <<= 1;  		
	DCLK(0);//SHCP		
	_nop_();		_nop_();		_nop_();		_nop_();		DCLK(1);//SHCP	
	}	
	RCLK_L(0);//STCP	
	_nop_();	_nop_();	_nop_();	_nop_();	
	RCLK_L(1);//STCP
}

在这里插入图片描述
5.ADC使用,返回值为0.0到1.0

#include "sc92f754x_adc.h"
void ADCInit(void)
{	
ADC_Init(ADC_PRESSEL_FOSC_D6, ADC_Cycle_6Cycle);	ADC_ChannelConfig(ADC_CHANNEL_11, ENABLE);	
ADC_Cmd(ENABLE);	
ADC_VrefConfig(ADC_VREF_VDD);	
}

float GetADCValue(void)
{
	#define MAX_RES    180
	#define MIN_RES    8
	#define UP_RES      100		//分压电阻值
	#define MIN_ADC    (256*MIN_RES/(MIN_RES+UP_RES))
	#define MAX_ADC    ((uint16_t)256*MAX_RES/(uint16_t)(MAX_RES+UP_RES)) 
	static uint8_t AdcBuf[10] = {0};	
	static uint8_t index = 0;	
	float adcValue=0.0; 	
	ADC_ChannelConfig(ADC_CHANNEL_11, ENABLE);	
	ADC_StartConversion();			  //开始一次ADC转换	
	while(!ADC_GetFlagStatus());	  //转换完成,等待标志位置1
	ADC_ClearFlag();	
	AdcBuf[index]= ADC_GetConversionValue(); //得到ADC转换值	
	if(AdcBuf[index] >= 0XF0)	{            adcValue = 0.0;	}	
	else	{	       
	index = (++index)%10;ADC_Value= (AdcBuf[0]+AdcBuf[1]+AdcBuf[2]+AdcBuf[3]+AdcBuf[4]+AdcBuf[5]+AdcBuf[6]+AdcBuf[7]+AdcBuf[8]+AdcBuf[9])/10; 	
	if(ADC_Value<MIN_ADC)		
	{	                ADC_Value =  MIN_ADC;		}
	if(ADC_Value>MAX_ADC)	{	ADC_Value =  MAX_ADC;		}
	adcValue= (float)(ADC_Value-MIN_ADC)/(MAX_ADC-MIN_ADC);	}		
	return adcValue;
} 

uint16_t ADC_GetConversionValue(void)
{	
	uint16_t temp;		
	//temp = (uint16_t)(ADCVH<<4) + (ADCVL>>4);	//取高8位和低4位合成12位	
	temp = (uint16_t)(ADCVH);			//只取高8位	
	return temp;
}

6.ADC取表值,ADC读取值转化为范围为0~100的值。返回值为0.0到1.0(反向)

#include "sc92f754x_adc.h"
//表值,获取ADC读取值在表中的下标值,0~25,再乘以4,即可通过ADC读取值转化为范围为0~100的值。
uint16_t code AdcWaterValue[26] =			
{
30 	,	102 	,	107 	,	112 	,	117 	,	126 	,	133 	,	139 	,	145 	,	150 ,
155 	,	160 	,	163 	,	165 	,	167 	,	169 	,	171 	,	173 	,	175 	,	177 ,
179 	,	181 	,	183 	,	185 	,	187 	,	189													
};

/**************************************************
*函数名称:void AdcWaterInit(void)
*函数功能:ADC初始化
*入口参数:void
*出口参数:void
*功能说明:使能ADC通道14,参考电压为VDD
**************************************************/
void AdcWaterInit(void)
{
	ADC_Init(ADC_PRESSEL_FOSC_D6, ADC_Cycle_6Cycle);
	ADC_ChannelConfig(ADC_CHANNEL_0, ENABLE);	//	20201224
	ADC_Cmd(ENABLE);
	ADC_VrefConfig(ADC_VREF_VDD);	
}

/**************************************************
*函数名称:void GetADCValue(void)
*函数功能:得到温度值在数组ADCValueToTemp[]的下标值
*入口参数:void
*出口参数:void
*功能说明:每个下标值测十次,去掉最高最低值求平均值
**************************************************/
float GetAdcWaterValue(void)
{
	//	水温传感器温度与电阻关系: 75度195+-10Ω		110度	72+-5Ω
	//	直接将最大最小值替换就行了,由于没有水温变化曲线,目前是线性处理
//#define MAX_RES    195	//20201109
//#define MIN_RES    72		//20201109
#define MAX_RES    250	//20201225
#define MIN_RES    25		//20201225

	#define UP_RES      100	//上拉电阻分压
	#define MIN_ADC    (256*MIN_RES/(MIN_RES+UP_RES))
	#define MAX_ADC    ((uint16_t)256*MAX_RES/(uint16_t)(MAX_RES+UP_RES))
	//	256*72/172=107	256*195/295=169

	uint8_t j,TEMP;
       static uint8_t AdcBuf[20] = {0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa};
	static uint8_t index = 0;

	static u16 PreValue = 0;
	static u16 CurValue = 0;
	uint16_t AdcWater_Value;	
	float adcValue=0.0;

	ADC_ChannelConfig(ADC_CHANNEL_0, ENABLE);	//	20201224
	ADC_StartConversion();			  //开始一次ADC转换
	while(!ADC_GetFlagStatus());	  //转换完成,等待标志位置1
	ADC_ClearFlag();
	AdcBuf[index]= ADC_GetConversionValue(); //得到ADC转换值

	//20201107	当ADC  采集到滑阻数值到达这个程度时,电机不转了,加了这段解决
	if(AdcBuf[index] >= 0XF0)
	{
             adcValue = 1.0;	//  检测有没有接传感器
	}
	else
	{
	
	       index = (++index)%20;
              CurValue = (AdcBuf[0]+AdcBuf[1]+AdcBuf[2]+AdcBuf[3]+AdcBuf[4]+AdcBuf[5]+AdcBuf[6]+AdcBuf[7]+AdcBuf[8]+AdcBuf[9]+AdcBuf[10]+AdcBuf[11]+AdcBuf[12]+AdcBuf[13]+AdcBuf[14]+AdcBuf[15]+AdcBuf[16]+AdcBuf[17]+AdcBuf[18]+AdcBuf[19])/20;

		//防止在临界值摆动,如果这次的ADC  值与上次ADC  值相差不大,则取上次值。
		if(Abs(PreValue,CurValue)<2)
		{
			AdcWater_Value=PreValue;
		}
		else
		{
			AdcWater_Value=CurValue;
		}
		PreValue=AdcWater_Value;

		for(j=0;j<26;j++)
		{
			if(AdcWater_Value<AdcWaterValue[0])
			{
				TEMP = 0;		   //取得最小值
				break;				
			}
			if((j+1)>25)
			{
				TEMP = 25;		   //数组最大下标不越界
				break;
			}
			if((AdcWater_Value >= AdcWaterValue[j]) && (AdcWater_Value < AdcWaterValue[j+1]))
			{															
				TEMP = j;		   //得转换值对应数组下标
				break;
			}							 
		}

		adcValue=(float)(TEMP*4)/100;
		if(adcValue>1){adcValue=1;}  //防错处理
		if(adcValue<0){adcValue=0;}

	}

	return (1-adcValue);	//	输出反向
}

//返回两个数的绝对差值
u16 Abs(u16 Val1,u16 Val2)
{
   if(Val1 >= Val2)
   {
        return (Val1-Val2);
   }
   else
   {
        return (Val2-Val1);
   }
}

7.EEPROM使用

#define _VE2PROM_C_
#include "FUNCTION.H"
#include "sc92f754x.h"

#ifdef _MAIN_C_
#define _EXTERN_
#else
#define _EXTERN_ extern 
#endif

_EXTERN_ WORKDATA  g_WorkData;

#define address0  5 
#define address1  6 
#define address2  7 
#define address3  8 
#define address4  9 
#define address5  10 
#define address6  11 
#define address7  12 

typedef struct t_WorkData
{
	u8 _0XAA;
	u8 ReserveBuf[4];
	u8 _0X55;
	u8 XorSum;
}WORKDATA;

BOOL VerifySetting(WORKDATA WorkData,u8 numb)
{
	u8  i;
	u8   tmpCheckSum = 0x00;
	u8* pDat=(u8 *)&WorkData;
	
	if((WorkData._0X55== 0x55) && (WorkData._0XAA== 0xaa))
	{
		for(i = 0; i < (numb-1); i++)
		{
			tmpCheckSum ^= pDat[i];
		}
		if(WorkData.XorSum == tmpCheckSum)
		{
			return(1);
		}
		else
		{
			return(0);
		}
	}
	else
	{
		return(0);
	}
}	

void E2promXorSum(WORKDATA *pE2p,u8 length)
{
	u8 i;
	u8 tmpCheckSum = 0x00;
	u8* pDat=(u8*)pE2p;

       pE2p->_0X55 = 0x55;
	pE2p->_0XAA = 0xaa;

	for(i = 0; i < (length-1); i++)
	{
		tmpCheckSum ^= pDat[i];
	}
	//printf(" VerifySetting tmpCheckSum=:%d\n",tmpCheckSum);
	pE2p->XorSum = tmpCheckSum;
}

void ReadWorkData(void)
{
	u8 high=0;
	u8 low=0;	
	u8 B8bit=0,B16bit=0,B24bit=0,B32bit=0;

	IAP_SetHoldTime(IAP_HOLDTIME_1500US);			   //HoldTime时间为1MS
	IAP_SetOperateRange(IAP_OPERATERANGE_ONLY_EEPROM); //只允许EEPROM进行IAP操?
	
	g_WorkData._0XAA=IAP_ReadByte(address0,IAP_MEMTYPE_EEPROM);
	g_WorkData.ReserveBuf[0]=IAP_ReadByte(address1,IAP_MEMTYPE_EEPROM);
	g_WorkData.ReserveBuf[1]=IAP_ReadByte(address2,IAP_MEMTYPE_EEPROM);	
	g_WorkData.ReserveBuf[2]=IAP_ReadByte(address3,IAP_MEMTYPE_EEPROM);
	g_WorkData.ReserveBuf[3]=IAP_ReadByte(address4,IAP_MEMTYPE_EEPROM);	
	g_WorkData._0X55=IAP_ReadByte(address5,IAP_MEMTYPE_EEPROM);
	g_WorkData.XorSum=IAP_ReadByte(address6,IAP_MEMTYPE_EEPROM);

	if(VerifySetting(g_WorkData,sizeof(WORKDATA)))
	{		
		IAP_SetHoldTime(IAP_HOLDTIME_1500US);			   //HoldTime时间为1MS
		IAP_SetOperateRange(IAP_OPERATERANGE_ONLY_EEPROM); //只允许EEPROM进行IAP操?

		g_WorkData.ReserveBuf[0]=IAP_ReadByte(address1,IAP_MEMTYPE_EEPROM);
		g_WorkData.ReserveBuf[1]=IAP_ReadByte(address2,IAP_MEMTYPE_EEPROM);		
		g_WorkData.ReserveBuf[2]=IAP_ReadByte(address3,IAP_MEMTYPE_EEPROM);
		g_WorkData.ReserveBuf[3]=IAP_ReadByte(address4,IAP_MEMTYPE_EEPROM);		
	}
	else
	{		
		g_WorkData._0X55 =0X55;
		g_WorkData._0XAA = 0Xaa;

		g_WorkData.ReserveBuf[0]=0;
		g_WorkData.ReserveBuf[1]=0;
		g_WorkData.ReserveBuf[2]=0;
		g_WorkData.ReserveBuf[3]=0;
		E2promXorSum(&g_WorkData,sizeof(WORKDATA));
	}
	//由于测试时32位的变量值结果只有65535,只好使用2个16位变量代替
	B8bit=g_WorkData.ReserveBuf[0];
	B16bit=g_WorkData.ReserveBuf[1];
	B24bit=g_WorkData.ReserveBuf[2];
	B32bit=g_WorkData.ReserveBuf[3];
	g_bTimeHourLow16=(B16bit << 8) | B8bit;
	g_bTimeHourHight16=(B32bit << 8) | B24bit;
}

void SaveWorkData(void)
{
             uint8_t i=0;
		uint8_t *pData;		
		
             g_WorkData._0XAA = 0XAA;
		g_WorkData._0X55 = 0X55;
		g_WorkData.ReserveBuf[0]=g_bTimeHourLow16 & 0xff; //	8位
		g_WorkData.ReserveBuf[1]=(g_bTimeHourLow16 >> 8) & 0xff; //	16位	
		g_WorkData.ReserveBuf[2]=g_bTimeHourHight16  & 0xff; //	24位
		g_WorkData.ReserveBuf[3]=(g_bTimeHourHight16 >> 8) & 0xff; //	32位	
		E2promXorSum(&g_WorkData,sizeof(WORKDATA));
		
             pData = (uint8_t *)&g_WorkData;
			 
		IAP_SetHoldTime(IAP_HOLDTIME_1500US);			   //HoldTime时间为1.5MS
		IAP_SetOperateRange(IAP_OPERATERANGE_ONLY_EEPROM); //只允许EEPROM进行IAP操?

             for(i=5;i<12;i++)
            	{
                   IAP_ProgramByte(i, pData[i-5], IAP_MEMTYPE_EEPROM, 0xf0);
		}
}


  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值