STM32F407读写IIC串行接口高精度实时时钟SD2405ALPI以及倒计时设置

一、倒计时相关寄存器

STM32F407读写IIC串行接口高精度实时时钟SD2405ALPI以及倒计时设置_第1张图片

1、0FH负责写允许

2、10H负责写允许和选择倒计时功能(允许倒计时和选择倒计时中断输出)

3、13H负责设置倒计时时间

4、允许倒计时,需要将10H的INTDE置位

STM32F407读写IIC串行接口高精度实时时钟SD2405ALPI以及倒计时设置_第2张图片

5、允许倒计时,需要将10H的INTS1置位,INTS0置位

STM32F407读写IIC串行接口高精度实时时钟SD2405ALPI以及倒计时设置_第3张图片

6、倒计时选择秒到计时

      11H寄存器的TDS1=1,TDS0=0,表示使用倒计时的秒倒计数功能(因为定时器频率源为1HZ),程序中往13H寄存器中送的数值的单位为秒(最大支持255秒)。

 

STM32F407读写IIC串行接口高精度实时时钟SD2405ALPI以及倒计时设置_第4张图片

 

7、倒计时选择分钟到计时

      11H寄存器的TDS1=1,TDS0=1,表示使用倒计时的分钟倒计数功能(因为定时器频率源为1/60HZ),程序中往13H寄存器中送的数值的单位为分钟(最大支持255分钟)。

8、程序


// 
//写SD2405允许程序
// 
void WriteTimeOn(void)
{		
	I2CStart();
	I2CSendByte(0x64);      
	I2CWaitAck();   
	I2CSendByte(0x10);		//设置写地址10H      
	I2CWaitAck();	
	I2CSendByte(0x80);		//置WRTC1=1      
	I2CWaitAck();
	I2CStop(); 

	I2CStart();
	I2CSendByte(0x64);      
	I2CWaitAck();   
	I2CSendByte(0x0F);		//设置写地址0FH
	I2CWaitAck();	
	I2CSendByte(0x84);		//置WRTC2,WRTC3=1
	I2CWaitAck();
	I2CStop(); 
}



// 
//写SD2405禁止程序
// 
void WriteTimeOff(void)
{		
	I2CStart();
	I2CSendByte(0x64);      
	I2CWaitAck();   
	I2CSendByte(0x0F);		//设置写地址0FH      
	I2CWaitAck();	
	I2CSendByte(0x0) ;		//置WRTC2,WRTC3=0      
	I2CWaitAck();
	I2CSendByte(0x0) ;		//置WRTC1=0(10H地址)      
	I2CWaitAck();
	I2CStop(); 
}



///
//BCD转换成16进制数
// 
uint8_t BCDtoHEX(uint8_t BCD)
{	
	uint8_t tempData;
	
	tempData = (BCD >> 4) * 10 + (BCD & 0x0F);
	return (tempData);
}



///
//16进制数转换成BCD码
// 
uint8_t HEXtoBCD(uint8_t HEX)
{
	uint8_t tempData;
	
	tempData = ((HEX / 10) << 0x04) + (HEX % 10);
	return (tempData);
}


///
//设置倒计时中断(单位:分钟)
// 
void SetDjs(uint8_t djs_Minute) 
{
	WriteTimeOn();
	I2CStart();
	I2CSendByte(0x64);      	//发送SD2400写寄存器命令
	I2CWaitAck();   
	I2CSendByte(0x10);      	//发送起始地址(0x10=CTR2控制寄存器)
	I2CWaitAck();   
	I2CSendByte(0xF0);      	//清倒计时中断总允许位(INTDE)
	I2CWaitAck();			
	I2CStop();				

	I2CStart();
	I2CSendByte(0x64);      	//发送SD2400写寄存器命令
	I2CWaitAck();   
	I2CSendByte(0x10);      	//发送起始地址(0x10=CTR2控制寄存器)
	I2CWaitAck();   
	I2CSendByte(0xF4);      	//INT中断选通(INTS1=1,INTS0=1选择倒计时中断),配置倒计时中断总允许位(INTDE=1)
	I2CWaitAck();
	
	I2CStart();
	I2CSendByte(0x64);      	//发送SD2400写寄存器命令
	I2CWaitAck();  
	I2CSendByte(0x11);      	//发送起始地址(0x11=CTR3控制寄存器)
	I2CWaitAck(); 
	I2CSendByte(0x30);		//选择定时器频率源(TDS1=1、TDS0=1)为1/60Hz
	I2CWaitAck();
	
	I2CStart();
	I2CSendByte(0x64);      	//发送SD2400写寄存器命令
	I2CWaitAck(); 
	I2CSendByte(0x12);      	//发送起始地址(0x12=时间调整寄存器)
	I2CWaitAck(); 	
	I2CSendByte(0x00);		//数字调整寄存器(12H)清0
	I2CWaitAck();
	
	I2CStart();
	I2CSendByte(0x64);      	//发送SD2400写寄存器命令
	I2CWaitAck(); 
	I2CSendByte(0x13);      	//发送起始地址(0x13=倒计时寄存器)
	I2CWaitAck();	
	I2CSendByte(HEXtoBCD(djs_Minute));		//设置计数初值(单位:分钟)
	I2CWaitAck();
	I2CStop();
	WriteTimeOff();
}



///
//关闭倒计时中断
// 
void ClrDjs(void) 
{
	WriteTimeOn();	
	I2CStart();
	I2CSendByte(0x64);      	//发送SD2400写寄存器命令
	I2CWaitAck();   
	I2CSendByte(0x10);      	//发送起始地址(0x10=CTR2控制寄存器)
	I2CWaitAck();   
	I2CSendByte(0xF0);      	//清倒计时中断总允许位(INTDE)
	I2CWaitAck();		  	
	I2CStop();				
	WriteTimeOff();
}

 

 

你可能感兴趣的:(SD2405ALPI实时时钟,STM32F407)