PCF8563驱动源码

news/2024/9/21 18:46:48 标签: 单片机, stm32, 嵌入式硬件
  • 提供年、月、日、星期,时、分、秒计时,使用外置32.768Khz晶振。
  • 低后备电流:0.25uA,VDD=3.0V,温度25℃。
  • IIC接口,速度最高400KHz。
  • 可编程时钟输出,可以供其他设备使用,可输出的时钟频率有32.768kHz、1.024kHz、32Hz和1Hz。
  • 支持闹钟和定时功能。
  • IIC读地址为0XA3,写地址为0XA2,也就是IIC器件地址为:0X51。
  • 有一个开漏输出的中断引脚。

控制状态寄存器1(0X00)

TEST1(bit7):0,正常模式;1,测试模式。
N(bit6,bit4,bit2-0):未使用。
STOP(bit5):0,RTC时钟运行;1,RTC时钟停止。
TESTC(bit3):0,正常模式,关闭POR覆写;1,使能POR覆写

控制状态寄存器2(0X01)

N(bit7-5):未使用。
TI_TP(bit4):为0的时候INT引脚取决于TF位,为1的时候INT引脚输出指定频率的脉冲。
AF(bit3):闹钟标志位,为1的话表示闹钟发生,写0清除,写1无效。
TF(bit2):定时器标志位,为1的话表示定时发生,写0清除,写1无效。
AIE(bit1):闹钟中断使能位0,关闭闹钟中断;1,使能闹钟中断。
TIE(bit0):定时器中断使能位0,关闭定时器中断;1,使能定时器中断

0X02:此寄存器为秒钟寄存器,PCF8563是有低电压检测的,当VDD电压低于最小允许电压的时候VL(bit)位就会置1,表示时钟异常,如果电压正常的话就为0SECONDS(bit6-0):这7位表示具体的秒数,范围0~59,为BCD格式。
0X03:此寄存器为分钟寄存器,MINUTES(bit6-0)7位有效,表示具体的分钟数,范围0-59,为BCD格式。
0X04:此寄存器为小时寄存器,HOURS(bit5-0)6位有效,表示具体的小时数,范围0-23,为BCD格式。
0X05:此寄存器为日期寄存器,DAYS(bit5-0)6位有效,表示具体的小时数,范围1-31,为BCD格式。
0X06:此寄存器为星期寄存器,WEEKDAYS(bit2-0)3位有效,表示具体的星期,范围0-6,为BCD格式。0为星期日, ,1为星期一,以此类推,6就是星期六。
0X07:此寄存器为月份寄存器,其中C(bit7)为世纪标志位,如果为1的话表示20xx年,为 0的话表示19xx年。MONTHS(bit4-0)5位有效,表示具体的月份,范围1-12,分别为1-12月,为BCD格式。
0X08:此寄存器为年寄存器,YEARS(bit7-0)8位有效,表示具体的年份,范围0-99
0X09:此寄存器为闹钟分钟寄存器,AE_M(bit7)为分钟闹钟使能位,为0的话使能分钟闹钟,为1的话关闭。MINUTE_ALARM(bit6-0)7位表示具体的闹钟分钟,范围0-59,为BCD格式。
0X0A:此寄存器为闹钟小时寄存器,含义和0X09寄存器类似。
0X0B:此寄存器为闹钟日期寄存器,含义和0X09寄存器类似。
0X0C:此寄存器为闹钟星期寄存器,含义和0X09寄存器类似

/*
 ============================================================
 MODEL 	  NAME  : PCF8563.c
 MODEL FUNCTION : Define system globe variables and functions
 RELATION MODEL : Others models in project
 ============================================================
 */
 #include "PCF8563.c.h"
 
 /***********************************************************
	Define implements of functions in PCF8563.c model
 ************************** START **************************/
uint16_t t;				// 延时变量
uint8_t date[10] = {'0','1','2','3','4','5','6','7','8','9'};                                                                        /*  或与FCCLK相同               */
 
/****************************************************************************
* 名称:ShortDelay()
* 功能:短延时函数。
* 入口参数:n   延时参数
* 出口参数:无
****************************************************************************/
void ShortDelay(uint8_t n)
{
	while(n--);
}
 
/****************************************************************************
* 名称:LongDelay()
* 功能:长延时函数。
* 入口参数:n   延时参数
* 出口参数:无
****************************************************************************/
void LongDelay(uint16_t n)
{
	while(n--);
}
 
/*******************************************************************
* 函数名称: StartI2C()
* 功能描述: 启动I2C总线,即发送I2C起始条件.
* 入口参数:无
* 出口参数:无 
********************************************************************/
void StartI2C(void)
{
	PCF8563_I2C_SDA_H;	ShortDelay(I2CDLY);
	PCF8563_I2C_SCL_H;	ShortDelay(I2CDLY);
	PCF8563_I2C_SDA_L;	ShortDelay(I2CDLY);
	PCF8563_I2C_SCL_L;	ShortDelay(I2CDLY);
}
 
/*******************************************************************
* 函数名称: StopI2C()
* 功能描述: 结束I2C总线,即发送I2C结束条件.
* 入口参数:无
* 出口参数:无   
********************************************************************/
void StopI2C(void)
{
	PCF8563_I2C_SDA_L;  ShortDelay(I2CDLY);
	PCF8563_I2C_SCL_H;	ShortDelay(I2CDLY);
	PCF8563_I2C_SDA_H;	ShortDelay(I2CDLY);
}
 
/*******************************************************************
* 函数名称: InitI2C()
* 功能描述: 初始化I2C.
* 入口参数:无
* 出口参数:无   
********************************************************************/
void InitI2C(void)
{
	GPIO_InitStructure.GPIO_Pin = PCF8563_I2C_SCL_PIN | PCF8563_I2C_SDA_PIN;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;  	/* 开漏输出 */
	GPIO_Init(PCF8563_I2C_PORT, &GPIO_InitStructure);
	GPIO_SetBits(PCF8563_I2C_PORT,PCF8563_I2C_SCL_PIN);
	PCF8563_I2C_SCL_L;
	StopI2C();
}
 
/*******************************************************************
* 函数名称: SendByte(uint8 dat)
* 功能描述: 将数据dat发送出去,可以是地址,也可以是数据,发完后等待应答,并对
            此状态位进行操作.(不应答或非应答都使ack=0 假)     
            发送数据正常ack=1; ack=0表示被控器无应答或损坏。
* 入口参数:dat  要传送的数据
* 出口参数:ack  应答信号   
********************************************************************/	
uint8_t SendByte(uint8_t dat)
{		
	uint8_t i,ack;
	for(i=0;i<8;i++)			               //要传送的数据长度为8位 
	{
		if((dat<<i)&0x80)		               //判断发送位
			PCF8563_I2C_SDA_H;   
	 	else
	    PCF8563_I2C_SDA_L;                
	  ShortDelay(I2CDLY);
	  PCF8563_I2C_SCL_H;			          //置时钟线为高,通知被控器开始接收数据位
	  ShortDelay(I2CDLY);		            //保证时钟高电平周期大于4μs
	  ShortDelay(I2CDLY);
	  ShortDelay(I2CDLY);
	  PCF8563_I2C_SCL_L;
	}
	ShortDelay(I2CDLY);
	PCF8563_I2C_SDA_H;				           //8位发送完后释放数据线,准备接收应答位
	ShortDelay(I2CDLY);
	
	PCF8563_I2C_SDAModeIn();
	PCF8563_I2C_SCL_H;
	ShortDelay(I2CDLY);
	if(PCF8563_I2C_SDA_READ())        	//判断是否接收到应答信号
		ack=0;
	else
		ack=1;
	PCF8563_I2C_SCL_L;
	PCF8563_I2C_SDAModeOut();
	ShortDelay(I2CDLY);
  return(ack);
}
 
 
/********************************************************************
*应答子函数
*原型:  void Ack_I2c(uint8 a);
*功能:主控器进行应答信号,(可以是应答或非应答信号)
********************************************************************/
void Ack_I2c(uint8_t a)
{
 	//在此发出应答或非应答信号
 	if(a==0)
 		PCF8563_I2C_SDA_L;
 	else
 		PCF8563_I2C_SDA_H;
 	ShortDelay(I2CDLY);
 	PCF8563_I2C_SCL_H;
 	ShortDelay(I2CDLY);		  //时钟低电平周期大于4μs
 	ShortDelay(I2CDLY);
 	ShortDelay(I2CDLY);
 	PCF8563_I2C_SCL_L;			//清时钟线,钳住I2C总线以便继续接收
 	ShortDelay(I2CDLY);    
}
 
 
//向有子地址器件发送1个字节数据函数
uint8_t ISendByte(uint8_t sla,uint8_t suba,uint8_t dat)
{   
   StartI2C(); 
   if(!SendByte(sla))
     return(0);
   if(!SendByte(suba))
     return(0);
   if(!SendByte(dat)) 
     return(0);
   StopI2C();
   return(1);
}
 
/*******************************************************************
*向有子地址器件发送多字节数据函数               
*函数原型: uint8  ISendStr(uint8 sla,uint8 suba,ucahr *s,uint8 no);  
*功能:     从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
          地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
           如果返回1表示操作成功,否则操作有误。
*注意:    使用前必须已结束总线。
********************************************************************/
uint8_t ISendStr(uint8_t sla,uint8_t suba,uint8_t *s,uint8_t no)
{
   uint8_t i;
   StartI2C();  		        //启动总线
   if(!SendByte(sla)) 	    //发送器件地址
     return(0);
   if(!SendByte(suba))	    //发送器件子地址
     return(0);
 
   for(i=0;i<no;i++)
    {   
     if(!SendByte(*s++))	  //发送数据
       return(0);
    } 
   StopI2C();			          //结束总线
   return(1);
}
 
/*******************************************************************
*字节数据接收函数               
*函数原型: uint8  RcvByte();
*功能:  用来接收从器件传来的数据,并判断总线错误(不发应答信号),
     发完后请用应答函数。  
********************************************************************/	
uint8_t  RcvByte()
{
	uint8_t retc,i;
	retc=0;
	PCF8563_I2C_SDA_H;                  //置数据线为输入方式+I/O方向
	PCF8563_I2C_SDAModeIn();
	for(i=0;i<8;i++)
  {
    	ShortDelay(I2CDLY);           
      PCF8563_I2C_SCL_L;             //置时钟线为低,准备接收数据位
      ShortDelay(I2CDLY);            //时钟低电平周期大于4.7μs
      ShortDelay(I2CDLY);
      ShortDelay(I2CDLY);
      PCF8563_I2C_SCL_H;             //置时钟线为高使数据线上数据有效
      ShortDelay(I2CDLY);
      retc=retc<<1;
      if(PCF8563_I2C_SDA_READ())
      	retc=retc+1;	               //读数据位,接收的数据位放入retc中
      ShortDelay(I2CDLY); 
  }
  PCF8563_I2C_SDAModeOut();
  PCF8563_I2C_SCL_L;
  ShortDelay(I2CDLY);
  return(retc);
}
 
 
/*******************************************************************
*向有子地址器件读取1个字节数据函数               
*函数原型: uint8  ISendByte(uint8 sla,uint8 suba,uint8 rdat);  
*功能:     从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
          地址sla,子地址suba,读出的内容。
           如果返回1表示操作成功,否则操作有误。
*注意:    使用前必须已结束总线。
********************************************************************/
uint8_t IRcvByte(uint8_t sla,uint8_t suba,uint8_t rdat)
{   
    StartI2C();			        //启动总线
    if(!SendByte(sla))      //发送器件地址
    { return(0); }
    ShortDelay(I2CDLY);
    if(!SendByte(suba))     //发送器件子地址
    { 	return(0); }
 
    StartI2C();
    if(!SendByte(sla+1))
    	return(0);
    rdat = RcvByte();
		rdat = rdat;
    Ack_I2c(1);			       //发送非应答位
    StopI2C(); 			       //结束总线
    return(1);
}
 
 
/*******************************************************************
*向有子地址器件读取多字节数据函数               
*函数原型: uint8  ISendStr(uint8 sla,uint8 suba,ucahr *s,uint8 no);  
*功能:     从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
          地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。
           如果返回1表示操作成功,否则操作有误。
*注意:    使用前必须已结束总线。
********************************************************************/
uint8_t IRcvStr(uint8_t sla,uint8_t suba,uint8_t *s,uint8_t no)
{
	  uint8_t i;
    StartI2C();			        //启动总线
    if(!SendByte(sla))      //发送器件地址
    { return(0); }
    ShortDelay(I2CDLY);
    if(!SendByte(suba))     //发送器件子地址
    { 	return(0); }
 
    StartI2C();
    if(!SendByte(sla+1))
    	return(0);
    for(i=0;i<no-1;i++)
    {   
     	*s++ = RcvByte();	   //接收数据
     	Ack_I2c(0);			     //发送就答位
    }
    *s = RcvByte();
    Ack_I2c(1);			       //发送非应答位
    StopI2C(); 			       //结束总线
    return(1);
}
 
/****************************************************************************
* 函数名称:PCF8563Read()
* 功能描述:读时钟芯片
* 入口参数:无
* 出口参数:无
****************************************************************************/
uint8_t PCF8563Read(uint8_t addr)
{
	uint8_t rdat;
	IRcvByte(PCF8536SLA,addr,rdat);
	return(rdat);
}
 
/****************************************************************************
* 函数名称:PCF8563Write()
* 功能描述:写时钟芯片
* 入口参数:无
* 出口参数:无
****************************************************************************/
void PCF8563Write(uint8_t addr,uint8_t sdat)
{  
	 ISendByte(PCF8536SLA,addr,sdat);
}
/*******************************************************
*名称:void Init_PCF8563(void)
*说明:给PCF8563写入一个初始的值
*功能:写入日期,和时钟的值
*调用:PCF8563Write()
*输入:无
*输出:无
*********************************************************/
//*********调试时钟程序,芯片第一次上电用
void Init1_PCF8563(void)          
{
	
  InitI2C();
	
	PCF8563Write(RegCtlSta1,0x00);	//启动PCF8563
	PCF8563Write(RegCtlSta2,0x00);
							                    
  //初始化时间寄存器2019.05.01 08:00:00 星期三
  PCF8563Write(TimeSecond,0x00);
  PCF8563Write(TimeMinute,0x00);
  PCF8563Write(TimeHour,0x08);
  PCF8563Write(TimeDay,0x01);
  PCF8563Write(TimeMonth,0x05);
  PCF8563Write(TimeYear,0x19);
  PCF8563Write(TimeWeek,0x03);
}
 
//*************/
/****************************************************************************
* 函数名称:InitPCF8563()
* 功能描述:时钟芯片初始化函数
* 入口参数:无
* 出口参数:无
****************************************************************************/
void Init_PCF8563(void)            //芯片上电后以后用的初始化程序
{
	InitI2C();
}
 
 
/**** 读取完整时间 ****/
/****************************************************************************
* 函数名称:read_complete_Time()
* 功能描述:读取实时时间函数
* 入口参数:无
* 出口参数:无
****************************************************************************/
void read_complete_Time(void)
{
	uint8_t TimeBuf[8];
	IRcvStr(PCF8536SLA,TimeSecond,TimeBuf,7);    //从时钟芯片8536读取当前日期与时间
	TimeBuf[0] &= 0x7f;
	TimeBuf[1] &= 0x7f;
	TimeBuf[2] &= 0x3f;	
	TimeBuf[3] &= 0x3f;
	TimeBuf[5] &= 0x1f;
	TimeBuf[0] = ((TimeBuf[0]>>4)*10)+(TimeBuf[0]&0x0f);
	TimeBuf[1] = ((TimeBuf[1]>>4)*10)+(TimeBuf[1]&0x0f);
	TimeBuf[2] = ((TimeBuf[2]>>4)*10)+(TimeBuf[2]&0x0f);
	TimeBuf[3] = ((TimeBuf[3]>>4)*10)+(TimeBuf[3]&0x0f);
	TimeBuf[5] = ((TimeBuf[5]>>4)*10)+(TimeBuf[5]&0x0f);
	TimeBuf[6] = ((TimeBuf[6]>>4)*10)+(TimeBuf[6]&0x0f);
	
	PortableProject.time_year=TimeBuf[6];
	PortableProject.time_month=TimeBuf[5];
	PortableProject.time_day=TimeBuf[3];
	PortableProject.time_hour=TimeBuf[2];
	PortableProject.time_minute=TimeBuf[1];
	PortableProject.time_second=TimeBuf[0];
 
}
 
/**** 设置完整时间 ****/
/****************************************************************************
* 函数名称:ModifyTime()
* 功能描述:修改实时时间函数
* 入口参数:无
* 出口参数:无
****************************************************************************/
void write_complete_Time(void)
{
	uint8_t TimeBuf[10];
	TimeBuf[8] = ((PortableProject.time_year/10)<<4)+(PortableProject.time_year%10);
	TimeBuf[7] = ((PortableProject.time_month/10)<<4)+(PortableProject.time_month%10);
	TimeBuf[5] = ((PortableProject.time_day/10)<<4)+(PortableProject.time_day%10);
	TimeBuf[4] = ((PortableProject.time_hour/10)<<4)+(PortableProject.time_hour%10);
	TimeBuf[3] = ((PortableProject.time_minute/10)<<4)+(PortableProject.time_minute%10);
	TimeBuf[2] = ((PPU.PortableProject.time_second/10)<<4)+(PortableProject.time_second%10);
 
	TimeBuf[1] = 0;
	TimeBuf[0] = 0;
 
	ISendStr(PCF8536SLA,0x00,TimeBuf,9);  //将要修改的日期与时间送入时钟芯片
}
 
 
//判断是否是闰年函数 //月份   1  2  3  4  5  6  7  8  9  10 11 12 //闰年   31 29 31 30 31 30 31 31 30 31 30 31 //非闰年 31 28 31 30 31 30 31 31 30 31 30 31 //输入:年份 //输出:该年份是不是闰年.1,是.0,不是 
unsigned char Is_Leap_Year(unsigned int year)
{      
  year+=2000;//年变量从xx转换为20xx								
  if(year%4==0) //必须能被4整除        
  {              
    if(year%100==0)              
    {                     
      if(year%400==0)return 1;//如果以00结尾,还要能被400整除                                
      else return 0;                
    }
    else return 1;          
  }
  else return 0; 
}                      
 
//设置时钟 //把输入的时钟转换为秒钟 //以1970年1月1日为基准 //1970~2099年为合法年份  
 
//const unsigned char table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5}; //月修正数据表   //平年的月份日期表 
const unsigned char mon_table[12]={31,28,31,30,31,30,31,31,30,31,30,31}; 
 
unsigned int RTC_Set(unsigned short int syear,unsigned char smon,unsigned char sday,unsigned char hour,unsigned char min,unsigned char sec) 
{       
  unsigned int t;        
  unsigned int seccount=0;    
	syear+=2000;//年变量从xx转换为20xx		  
  //if(syear<00||syear>99)return 1;//syear范围1970-2099,此处设置范围为2000-2099               
  for(t=1980;t<syear;t++) //把所有年份的秒钟相加      
  {               
    if(Is_Leap_Year(t))seccount+=31622400;//闰年的秒钟数               
    else seccount+=31536000;                    //平年的秒钟数        
  }      
  smon-=1;       
  for(t=0;t<smon;t++)         //把前面月份的秒钟数相加        
  {              
    seccount+=(unsigned int)mon_table[t]*86400;//月份秒钟数相加              
    if(Is_Leap_Year(syear)&&t==1)seccount+=86400;//闰年2月份增加一天的秒钟数              
  }      
  seccount+=(unsigned int)(sday-1)*86400;//把前面日期的秒钟数相加        
  seccount+=(unsigned int)hour*3600;//小时秒钟数    
  seccount+=(unsigned int)min*60;      //分钟秒钟数        
  seccount+=sec;//最后的秒钟加上去
  return seccount;
}
 
 
//-------------------the  end-----------------------//
 
 
 
 
 ============================================================
 MODEL 	  NAME  : PCF8563.h
 MODEL FUNCTION : Declare
 RELATION MODEL : Others models in project
 ============================================================
 */
 #ifndef __PCF8563_H
 #define __PCF8563_H
 
 
/* 定义I2C总线连接的GPIO端口, 用户只需要修改下面4行代码即可任意改变SCL和SDA的引脚 */
#define PCF8563_I2C_CLK 	    RCC_APB2Periph_GPIOB		/* GPIO端口时钟 */
#define PCF8563_I2C_PORT	    GPIOB			              /* GPIO端口 */
#define PCF8563_I2C_SCL_PIN	  GPIO_Pin_8			        /* PB.08 */ /* 连接到SCL时钟线的GPIO */
#define PCF8563_I2C_SDA_PIN		GPIO_Pin_9			        /* PB.09 */ /* 连接到SDA数据线的GPIO */
 
 
 
 
 
 
#define I2CDLY	100
 
//定义PCF8563的各寄存器地址
#define PCF8536SLA		0xA2	//PCF8563从器件地址
 
#define RegCtlSta1		0x00	//控制/状态寄存器1
#define RegCtlSta2		0x01	//控制/状态寄存器2
 
#define TimeSecond		0x02
#define TimeMinute		0x03
#define TimeHour		  0x04
#define TimeDay			  0x05
#define TimeWeek		  0x06
#define TimeMonth		  0x07
#define TimeYear		  0x08
 
#define AlarmMinute		0x09
#define AlarmHour		  0x0a
#define AlarmDay		  0x0b
#define AlarmWeek		  0x0c
 
#define ClkFre			  0x0d	//CLOCKOUT频率寄存器
#define TimerCtl		  0x0e	//定时控制寄存器
#define TimerVal	  	0x0f	//定时器倒计时数值寄存器 
 
 
 
#define  PCF8563_I2C_SCL_H          GPIO_SetBits(PCF8563_I2C_PORT, PCF8563_I2C_SCL_PIN)             //PB.08  //SCL = 1
#define  PCF8563_I2C_SCL_L          GPIO_ResetBits(PCF8563_I2C_PORT, PCF8563_I2C_SCL_PIN)           //PB.08  //SCL = 0
#define  PCF8563_I2C_SDA_H          GPIO_SetBits(PCF8563_I2C_PORT, PCF8563_I2C_SDA_PIN)             //PB.09  //SDA = 1
#define  PCF8563_I2C_SDA_L          GPIO_ResetBits(PCF8563_I2C_PORT, PCF8563_I2C_SDA_PIN)           //PB.09  //SDA = 0
 
//IO方向设置
#define  PCF8563_I2C_SDAModeIn()   {GPIOB->CRH&=0XFFFFFF0F;GPIOB->CRH|=(uint32_t)8<<4;}             //PB.09  //SDA 输入数据   
#define  PCF8563_I2C_SDAModeOut()  {GPIOB->CRH&=0XFFFFFF0F;GPIOB->CRH|=(uint32_t)3<<4;}             //PB.09  //SDA 输出数据   
 
#define  PCF8563_I2C_SDA_READ()     GPIO_ReadInputDataBit(PCF8563_I2C_PORT, PCF8563_I2C_SDA_PIN)	   /* 读SDA口线状态 */
 
void ShortDelay(uint8_t n);
void LongDelay(uint16_t n);
void InitI2C(void);
unsigned char PCF8563Read(unsigned char add);
void PCF8563Write(unsigned char add, unsigned char wdata);
void Init1_PCF8563(void);
void Init_PCF8563(void);
void read_complete_Time(void);//读取完整时间
void write_complete_Time(void);//设置完整时间
 
//判断是否是闰年函数 //月份   1  2  3  4  5  6  7  8  9  10 11 12 //闰年   31 29 31 30 31 30 31 31 30 31 30 31 //非闰年 31 28 31 30 31 30 31 31 30 31 30 31 //输入:年份 //输出:该年份是不是闰年.1,是.0,不是 
unsigned char Is_Leap_Year(unsigned int year);
 
//设置时钟 //把输入的时钟转换为秒钟 //以1980年1月1日为基准 //1970~2099年为合法年份  
unsigned int RTC_Set(unsigned short int syear,unsigned char smon,unsigned char sday,unsigned char hour,unsigned char min,unsigned char sec) ;
 
#endif
 

PCF8563的IIC接口连接到了STM32MP157的I2C4上

引脚为PZ4和PZ5
中断引脚PI3

在设备树中添加这3个引脚对应的配置信息

stm32mp15pincrtldtsi_580">打开stm32mp15-pincrtl.dtsi文件

示例代码44.3.1.1 i2c4引脚节点

1  i2c4_pins_a: i2c4-0 { 
2      pins { 
3          pinmux = <STM32_PINMUX('Z', 4, AF6)>, /* I2C4_SCL */ 
4                  <STM32_PINMUX('Z', 5, AF6)>; /* I2C4_SDA */ 
5          bias-disable; 
6          drive-open-drain; 
7          slew-rate = <0>; 
8      }; 
9  }; 
10 
11 i2c4_pins_sleep_a: i2c4-1 { 
12     pins { 
13         pinmux = <STM32_PINMUX('Z', 4, ANALOG)>, /* I2C4_SCL */ 
14                 <STM32_PINMUX('Z', 5, ANALOG)>; /* I2C4_SDA */ 
15     }; 
16 };

示例代码 44. 3.1.3 追加 pcf 8563 节点
1  &i2c4 { 
2      pinctrl-names = "default", "sleep"; 
3      pinctrl-0 = <&i2c4_pins_a>; 
4      pinctrl-1 = <&i2c4_pins_sleep_a>; 
5      status = "okay"; 
6 
7      pcf8563@51{ 
8          compatible = "nxp,pcf8563"; 
9          irq_gpio = <&gpioi 3 IRQ_TYPE_EDGE_FALLING>; 
10          reg = <0x51>; 
11     }; 
12 };


http://www.niftyadmin.cn/n/5669276.html

相关文章

Java 19 新特性-结构化并发(Structured Concurrency)[Preview]

Java 19 新特性&#xff1a;结构化并发&#xff08;Structured Concurrency&#xff09;[预览] Java 19 在并发编程领域引入了一个全新的概念——结构化并发&#xff08;Structured Concurrency&#xff09;&#xff0c;作为预览功能发布。这一特性旨在简化并发任务的管理&…

[Python数据可视化]探讨数据可视化的实际应用:三个案例分析

数据可视化是理解复杂数据集的重要工具&#xff0c;通过图形化的方法&#xff0c;可以直观地展示信息、趋势和模式。本文将深入探讨三个实际案例&#xff0c;包括健康数据分析、销售趋势分析、城市交通流量分析。每个案例将提供假设数据、详细注释的代码及分析结果。 案例 1: …

mdadm 命令:软RAID管理

一、命令简介 ​mdadm​ 是 Linux 下用于管理软件 RAID 设备的工具&#xff0c;可以创建、管理和监控软件 RAID 阵列。 ‍ 创建 RAID 需要多个环节&#xff0c;多个命令搭配使用&#xff1a; ​gdisk​ ​命令创建格式为 Linux RAID​ ​的磁盘分区​mdadm​ ​命令将多个 …

web 动画库

web动画库 动画领域有一个比较知名的CSS库&#xff1a;Animate.css&#xff0c;它提供了60多种动画&#xff0c;满足一般网页的需求&#xff0c;比如淡入淡出、闪现等等一系列日常动画&#xff0c;不过虽然它能满足日常需求&#xff0c;但是一些复杂的场景就需要靠JS手动去操作…

oracle 11g写一个判断是否是身份证的函数,函数名称为:FUN_IS_IDENNO

下面是一个用于判断是否是身份证号码的Oracle 11g函数&#xff08;FUN_IS_IDENNO&#xff09;。身份证号码通常为18位&#xff08;或者旧的15位&#xff09;&#xff0c;前17位为数字&#xff0c;第18位为数字或字母X&#xff0c;并且需要符合一定的规则&#xff0c;例如出生日…

开源网安多城联动、多形式开展网安周公益活动,传播网络安全知识

9月9日至15日&#xff0c;以“网络安全为人民&#xff0c;网络安全靠人民”为主题的2024年国家网络安全宣传周将在全国范围内统一开展&#xff0c;通过多样的形式、丰富的内容&#xff0c;助力全社会网络安全意识和防护技能提升。开源网安今年继续为各地企业、群众带来了丰富的…

在HTML中添加视频

在HTML中添加视频&#xff0c;你可以使用<video>标签。这个标签允许你在网页上嵌入视频内容&#xff0c;并支持多种视频格式&#xff0c;如MP4、WebM和Ogg等。不过&#xff0c;由于浏览器对视频格式的支持程度不同&#xff0c;因此通常建议提供多种格式的视频文件&#x…

传知代码-多示例AI模型实现病理图像分类

代码以及视频讲解 本文所涉及所有资源均在传知代码平台可获取 概述 本文将基于多示例深度学习EPLA模型实现对乳腺癌数据集BreaKHis_v1的分类。EPLA模型是处理组织病理学图像的经典之作。EPLA模型是基于多示例学习来进行了&#xff0c;那么多示例学习模型对处理病理学图像具有…