RA8900CE计时芯片介绍及开发方案

news2024/11/26 16:50:11

计时芯片

就是一个需要连接32.768k晶振的RTC芯片

规格书阅读

首先我们先读懂这个芯片是怎么用的。

引脚表

封装是这样的,一共10个引脚。

基本上一看这个引脚表就知道大概。

T1和T2是工厂测试的,不用管。

SCL和SDA是IIC通讯用的。

FOUT和FOE就是链接晶振的。

INT是中断输出,闹钟、唤醒啥的都靠它。

其他的都是电源和地了。

模块框图

这个也简单,就是个S-35390A的简化版,有需要的朋友可以看我另一篇文章。S-35390A计时芯片介绍及开发方案_s35390-CSDN博客

软件设计

寄存器定义

里面有好几组寄存器,可以按照命令来读取。

基础信息寄存器

// RX-8900 Basic Time and Calendar Register definitions
#define RA8900_BTC_SEC					0x00
#define RA8900_BTC_MIN					0x01
#define RA8900_BTC_HOUR					0x02
#define RA8900_BTC_WEEK					0x03
#define RA8900_BTC_DAY					0x04
#define RA8900_BTC_MONTH				0x05
#define RA8900_BTC_YEAR					0x06
#define RA8900_BTC_RAM					0x07
#define RA8900_BTC_ALARM_MIN			0x08
#define RA8900_BTC_ALARM_HOUR			0x09
#define RA8900_BTC_ALARM_WEEK_OR_DAY	0x0A
#define RA8900_BTC_TIMER_CNT_0			0x0B
#define RA8900_BTC_TIMER_CNT_1			0x0C
#define RA8900_BTC_EXT					0x0D
#define RA8900_BTC_FLAG					0x0E
#define RA8900_BTC_CTRL					0x0F

扩展寄存器1

// RX-8900 Extension Register 1 definitions
#define RA8900_EXT_SEC					0x10
#define RA8900_EXT_MIN					0x11
#define RA8900_EXT_HOUR					0x12
#define RA8900_EXT_WEEK					0x13
#define RA8900_EXT_DAY					0x14
#define RA8900_EXT_MONTH				0x15
#define RA8900_EXT_YEAR					0x16
#define RA8900_EXT_TEMP					0x17
#define RA8900_EXT_BACKUP				0x18

#define RA8900_EXT_TIMER_CNT_0			0x1B
#define RA8900_EXT_TIMER_CNT_1			0x1C
#define RA8900_EXT_EXT					0x1D
#define RA8900_EXT_FLAG					0x1E
#define RA8900_EXT_CTRL					0x1F

#define RA8900_EXT_0X30   			    0x30
#define RA8900_EXT_0X32   			    0x32
#define RA8900_EXT_0X40   			    0x40
#define RA8900_EXT_0X5A					0x5a
#define RA8900_EXT_0X5C					0x5c

扩展寄存器

// Flag RA8900_BTC_EXT Register bit positions
#define RA8900_BTC_EXT_TSEL0		(1 << 0)
#define RA8900_BTC_EXT_TSEL1		(1 << 1)
#define RA8900_BTC_EXT_FSEL0		(1 << 2)
#define RA8900_BTC_EXT_FSEL1		(1 << 3)
#define RA8900_BTC_EXT_TE 			(1 << 4)
#define RA8900_BTC_EXT_USEL			(1 << 5)
#define RA8900_BTC_EXT_WADA			(1 << 6)
#define RA8900_BTC_EXT_TEST			(1 << 7)

标志位寄存器

#define RA8900_BTC_FLAG_VDET 		(1 << 0)
#define RA8900_BTC_FLAG_VLF 		(1 << 1)
#define RA8900_BTC_FLAG_AF 			(1 << 3)
#define RA8900_BTC_FLAG_TF 			(1 << 4)
#define RA8900_BTC_FLAG_UF 			(1 << 5)

控制寄存器

#define RA8900_BTC_CTRL_RESET 		(1 << 0)
#define RA8900_BTC_CTRL_AIE 		(1 << 3)
#define RA8900_BTC_CTRL_TIE 		(1 << 4)
#define RA8900_BTC_CTRL_UIE 		(1 << 5)
#define RA8900_BTC_CTRL_CSEL0 		(1 << 6)
#define RA8900_BTC_CTRL_CSEL1		(1 << 7)

初始化

就是调用两个接口,用配置结构体初始化,接个状态回来。由于我这里用的是软件IIC,用到硬件IIC的朋友请自行初始化,调用下LPI2C_DRV_MasterInit函数。

RA8900_Init(&rtc_Config,&g_RA8900State);

结构体长这样,按照内容配置就行,不会的可以照抄。

rtc_user_config rtc_Config=
{
    ONCE_PER_SECONDS,//按照秒或者分钟计时
    FREQ_32dot768KHZ,//晶振选择
    CLOCK_EVERY_SECOND,//时钟频率
    EXECUTE_PER_2_SEC,//时钟补偿
    false,//是否使能修正周期
    false,//是否使能时钟更新
    false,//是否使能闹钟
    WEEK_ALARM,//闹钟按照天还是周
    /*year,month,day,hour,min,second,week*///默认时钟
	{ 18, 1,  1  ,0  , 0,  0,  1 },
	/*min ,hour ,week, day ,AF ,enabled,wada,pending*///默认闹钟
	{ 0,  0,   1    ,1   ,0,   0,       0,   0  }
};

代码如下

rtc_state g_RA8900State;
rtc_state *g_RA8900StatePtr=&g_RA8900State;
void RA8900_Init(rtc_user_config *userConfigPtr, rtc_state *rtc)
{
	uint8_t ctrl[3]={0x02,0x00,0x61};/*the default data*/
	g_RA8900StatePtr = rtc;

    ctrl[0]=(userConfigPtr->WADA<<6)|(ctrl[0]&(~RA8900_BTC_EXT_WADA));
	ctrl[0]=(userConfigPtr->updateTime <<5)|(ctrl[0]&(~RA8900_BTC_EXT_USEL));
	ctrl[0]=(userConfigPtr->outputFreq<<2)|(ctrl[0]&(~(RA8900_BTC_EXT_FSEL0|RA8900_BTC_EXT_FSEL1)));
	ctrl[0]=(userConfigPtr->timerClock)|(ctrl[0]&(~(RA8900_BTC_EXT_TSEL0|RA8900_BTC_EXT_TSEL1)));
    /*config the ext reg must set TE \TEST to 1,RESET to 1 (when set clock need to stop clock) */
	/*set TE \TEST to 1,RESET to 1,anothers are the config */
    RA8900_WriteRegs(RA8900_BTC_EXT,3,ctrl);
    RA8900_ReadRegs(RA8900_BTC_EXT,3,ctrl);
	RA8900_SetTime(&(userConfigPtr->defaulRtcTime));

	/*check the time fixedCycle function*/
	if(userConfigPtr->isFixedCycleEnable)
	{
        /*if enable ,set the TE bit in EXT Reg*/
		ctrl[0]=(userConfigPtr->isFixedCycleEnable<<4)|(ctrl[0]&(~RA8900_BTC_EXT_TE));
	}/*if not enable,dont't need to change, it is 0 alreadly*/

	/*set the function interrupt*/
	ctrl[2]=(userConfigPtr->isAlarmEnable<<3)|(ctrl[2]&(~RA8900_BTC_CTRL_AIE));
	ctrl[2]=(userConfigPtr->isFixedCycleEnable<<4)|(ctrl[2]&(~RA8900_BTC_CTRL_TIE));
	ctrl[2]=(1<<5)|(ctrl[2]&(~RA8900_BTC_CTRL_UIE));
	/*set the Temperature compensation */
	ctrl[2]=(userConfigPtr->temperCompensation<<6)|(ctrl[2]&(~(RA8900_BTC_CTRL_CSEL0|RA8900_BTC_CTRL_CSEL1)));
   /*reset the device*/
	ctrl[2]=0;
	RA8900_WriteRegs(RA8900_BTC_EXT,3,ctrl);

	g_RA8900StatePtr->extReg=ctrl[0];
	g_RA8900StatePtr->ctrlreg=ctrl[2];
	g_RA8900StatePtr->flagReg=ctrl[1];
}

读取接口

互斥锁的作用就是防止同时读和写。

static bool RA8900_ReadRegs(uint8_t regIdx, uint8_t length,uint8_t *values)
{
	bool ret = false;
    uint8_t Try = 3;

    if( xSemaphore_i2c != NULL )//互斥锁
    {
        if( xSemaphoreTake( xSemaphore_i2c, ( TickType_t ) 50 ) == pdTRUE )
        {
            while((Try--)&&(ret != true))  // allow setting 3 times
			{
              ret=I2C_read_bytes(RA8900_ADDRESS,regIdx,RTC_ADDR_BYTES,length,values);
			}
            xSemaphoreGive( xSemaphore_i2c);
        }
    }
	return	ret;
}

写入接口

因为要把命令先写进去,所以这里开了个buffer把命令和数据拼起来再发出去。地址默认为0x32

bool RA8900_WriteRegs(uint8_t regIdx,uint8_t length, uint8_t *values)
{
	bool ret = false;
	uint8_t Try = 3;

	uint8_t masterbuffer[32]={0};
	masterbuffer[0]=regIdx;
	memcpy(&masterbuffer[1],values,length);

    if( xSemaphore_i2c != NULL )
    {
        if( xSemaphoreTake( xSemaphore_i2c, ( TickType_t ) 50 ) == pdTRUE )
        {
			while((Try--)&&(ret != true))// allow setting 3 times
			{
				ret = I2C_write_bytes(RA8900_ADDRESS,length+ 1,masterbuffer);
			}
			xSemaphoreGive( xSemaphore_i2c);
        }
    }
	return	ret;
}

获取时间

time就是个结构体,里面有的东西下面都能看到了。将时间信息获取到regdate里面之后按照字节来转换BCD码。

uint8_t RA8900_GetTime(rtc_time *time)
{
	uint8_t regdate[16]={0,0,0,0,0,0,0};
	uint8_t err = 0;

	err = RA8900_ReadRegs(RA8900_BTC_SEC,7,regdate);
	time->second  = RA8900_Bcd2Dec(regdate[0] & 0x7f);
	time->minute  = RA8900_Bcd2Dec(regdate[1] & 0x7f);
	time->hour = RA8900_Bcd2Dec(regdate[2] & 0x3f);
	time->week = RA8900_GetWeekDay(regdate[3] & 0x7f);
	time->day = RA8900_Bcd2Dec(regdate[4] & 0x3f);
	time->month  = RA8900_Bcd2Dec(regdate[5] & 0x1f)-1;
	time->year = RA8900_Bcd2Dec(regdate[6])+2000;

	if (err==false)
	{
		return 0;
	}
    return 1;
}

设置当前时间

按照位置去写入就行。

uint8_t  RA8900_SetTime(rtc_time *time)
{
	uint8_t date[7];
	int ret = 0;

	date[0]   = RA8900_Dec2Bcd(time->second);
	date[1]   = RA8900_Dec2Bcd(time->minute);
	date[2]  = RA8900_Dec2Bcd(time->hour);
	date[3]  = 1 << (time->week);
	date[4]   = RA8900_Dec2Bcd(time->day);
	date[5] = RA8900_Dec2Bcd(time->month+1);
	date[6]  = RA8900_Dec2Bcd(time->year % 100);
	ret =  RA8900_WriteRegs(RA8900_BTC_SEC, 7, date);
	return ret;
}

十进制转换BCD码

这种基本都是标准的

uint8_t RA8900_Dec2Bcd(uint8_t binData)
{
    uint8_t ret;
    ret = binData/10;//十位
    binData %= 10; //个位
    ret <<= 4; 
    ret += binData;
    return ret;
}

BCD码转换为十进制

uint8_t RA8900_Bcd2Dec(uint8_t bcdData)
{
  uint8_t ret;
  ret = bcdData&0x0f;//个位。
  bcdData >>= 4;
  bcdData &= 0x0f;
  bcdData *= 10;//十位
  ret += bcdData;//相加
  return ret;
}

获取闹钟时间

uint8_t RA8900_GetAlarm(rtc_alarm *alarmTime)
{
	uint8_t alarmvals[3];//分,时,天
	uint8_t ctrl[3];//标志位
	int err;

	//获取闹钟时间,分
	err = RA8900_ReadRegs(RA8900_BTC_ALARM_MIN, 3, alarmvals);
    if (!err){return err;}

	//获取标志位:extension, flag, control values
	err = RA8900_ReadRegs(RA8900_BTC_EXT, 3, ctrl);
    if (!err){return err;}

	//将获取到的闹钟信息转换为十进制
	alarmTime->minute = RA8900_Bcd2Dec(alarmvals[0] & 0x7f);
	alarmTime->hour = RA8900_Bcd2Dec(alarmvals[1] & 0x3f);

	if (ctrl[0] & RA8900_BTC_EXT_WADA )//闹钟为每天
	{
		alarmTime->week = 0xff;
		alarmTime->day = RA8900_Bcd2Dec(alarmvals[2] & 0x3f);
	}
	else//闹钟为每周
	{ 
		alarmTime->week = RA8900_GetWeekDay( alarmvals[2] & 0x7f );
		alarmTime->day = 0xff;
		alarmTime->WADA=0;
	}

	//检查闹钟中断是否使能
	alarmTime->enabled = !!(ctrl[2] & RA8900_BTC_CTRL_AIE);
	//检查闹钟是否已经触发,就是是否响了
	alarmTime->pending = (ctrl[1] & RA8900_BTC_FLAG_AF) && alarmTime->enabled;

	return err;
}

设置闹钟时间

可以是日闹钟,可以是周闹钟。

int RA8900_SetAlarmClock(rtc_alarm *alarmClockTime)
{
    uint8_t alarmvals[3];//分, 时, 天
	uint8_t ctrl[3];//控制信息
	int err;

	alarmvals[0] = RA8900_Dec2Bcd(alarmClockTime->minute);
	alarmvals[1] = RA8900_Dec2Bcd(alarmClockTime->hour);
    
    //获取控制信息
	RA8900_ReadRegs(RA8900_BTC_EXT, 3, ctrl);
	if(alarmClockTime->WADA)
	{
		alarmvals[2] = RA8900_Dec2Bcd(alarmClockTime->day);
		ctrl[0] |= RA8900_BTC_EXT_WADA;
	}
	else
	{
		/*  bit:  7   6    5    4     3    2     1    0    */
		/* week:  0   Sat  Fri  Thur  Wed  Tue   Mon  Sun  */
		alarmvals[2] = alarmClockTime->week;
		ctrl[0] &= ~(RA8900_BTC_EXT_WADA);
	}
	RA8900_WriteRegs( RA8900_BTC_EXT, 1, &ctrl[0]);
	
	ctrl[2]= RA8900_BTC_CTRL_AIE|ctrl[2];
	ctrl[2] &= ~(RA8900_BTC_CTRL_UIE | RA8900_BTC_CTRL_TIE);
	RA8900_WriteRegs(RA8900_BTC_CTRL, 1, &ctrl[2]);
	RA8900_WriteRegs(RA8900_BTC_ALARM_MIN, 3, alarmvals);

	ctrl[1] &= ~RA8900_BTC_FLAG_AF;
	err = RA8900_WriteRegs(RA8900_BTC_FLAG, 1 ,&ctrl[1]);
    return err;
}

停止闹钟

int RA8900_StopAlarm(void)
{
	uint8_t ctrl[1];//控制位 ext, flag registers
	int err;
	
	RA8900_ReadRegs(RA8900_BTC_CTRL, 1, ctrl);
	ctrl[0] &= ~RA8900_BTC_CTRL_AIE;
	err = RA8900_WriteRegs(RA8900_BTC_CTRL, 1, ctrl);
	return err;
}

清除所有标志位

void  RA8900_ClearFlag(uint8_t flag)
{
	uint8_t currentFlag;

	RA8900_ReadRegs(RA8900_BTC_FLAG,1,&currentFlag);
	currentFlag=currentFlag & (~flag);
	RA8900_WriteRegs(RA8900_BTC_FLAG,1,&currentFlag);
}

转换为周几

长度7位,从低到高哪位为1就是周几。

static uint_8 RA8900_GetWeekDay(uint8_t regWeekDay )
{
	uint_8 index, timeWeekDay;

	for ( index=0; index < 7; index++ )
	{
		if ( regWeekDay & 1 )
		{
			timeWeekDay = index;
			break;
		}
		regWeekDay >>= 1;
	}
	return 	timeWeekDay;
}

获取温度

只是个功能,没啥用,将获取到的数值按公式算就行。

#define RA8900_EXT_TEMP					0x17

uint8_t RA8900_GetTemp(void)
{
	uint8_t tempvalue = 0;
	float   RtcTemp = 0.0;

	RA8900_ReadRegs(RA8900_EXT_TEMP,1,&tempvalue);
	RtcTemp = (tempvalue*2 - 187.19)/3.218;

	tempvalue = (uint8_t)RtcTemp;
	return tempvalue;
}

保持增强功能

他有个增强功能,要在初始化的时候做这几件事,50ms为周期调用下面这个初始化接口。其实就是写入几个命令。

#define RA8900_EXT_0X30   			    0x30
#define RA8900_EXT_0X32   			    0x32
#define RA8900_EXT_0X40   			    0x40
#define RA8900_EXT_0X5A					0x5a
#define RA8900_EXT_0X5C					0x5c

uint8_t RA8900CE_Inhance(void)
{
    bool err = false;
    uint8_t ctrl = 0;
    static uint8_t s_Step = FSM_STEP_01;//默认为第一步

    switch(s_Step)
    {
       case FSM_STEP_01://第一步
       {
        	ctrl = 0xd1;
            err = RA8900_WriteRegs(RA8900_EXT_0X30,1,&ctrl);
            if (!err){return err;}

            ctrl = 0x00;
            err = RA8900_WriteRegs(RA8900_EXT_0X40,1,&ctrl);
            if (!err){return err;}

            ctrl = 0x81;
            err = RA8900_WriteRegs(RA8900_EXT_0X32,1,&ctrl);
            if (!err){return err;}

            s_Step = FSM_STEP_02;//跳到第二步 
        }break;

       case FSM_STEP_02://第二步
       {
           ctrl = 0x80;
           err = RA8900_WriteRegs(RA8900_EXT_0X32,1,&ctrl);
           if (!err){return err;}

           s_Step = FSM_STEP_03;//跳到第三步 
           break;
        }

        case FSM_STEP_03://第三步
        {
            ctrl = 0x04;
            err = RA8900_WriteRegs( RA8900_EXT_0X32, 1, &ctrl);
            if (!err){return err;}

            s_Step = FSM_STEP_04;//跳到第四步 
            break;
        }

        case FSM_STEP_04://第四步
        {
            ctrl = 0x00;
            err = RA8900_ReadRegs(RA8900_EXT_0X5C,1,&ctrl);
            if (!err){return err;}

            ctrl &= ~0x0f;
            ctrl |= 0x0c;
            err = RA8900_WriteRegs(RA8900_EXT_0X5C,1,&ctrl);
            if (!err){return err;}

            err = RA8900_ReadRegs(RA8900_EXT_0X5A,1,&ctrl);
            if (!err){return err;}

            ctrl &= ~0xe0;
            ctrl |= 0xe0;
            err = RA8900_WriteRegs( RA8900_EXT_0X5A, 1, &ctrl);
            if (!err){return err;}

            ctrl = 0x00;
            err = RA8900_WriteRegs(RA8900_EXT_0X30,1, &ctrl);
            if (!err){return err;}

             s_Step = FSM_STEP_END;//结束
             break;
         }

        default:
            s_Step = FSM_STEP_END;
            break;
    }
    return err;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1577599.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

文献速递:深度学习胰腺癌诊断--胰腺肿瘤的全端到端深度学习诊断

Title 题目 Fully end-to-end deep-learning-based diagnosis of pancreatic tumors 胰腺肿瘤的全端到端深度学习诊断 01 文献速递介绍 胰腺癌是最常见的肿瘤之一&#xff0c;预后不良且通常是致命的。没有肿瘤的患者只需要进一步观察&#xff0c;而胰腺肿瘤的诊断需要紧…

C/C++中局部变量static用法实例

1. 普通局部变量存储于进程栈空间&#xff0c;使用完毕会立即释放&#xff0c;静态局部变量使用static修饰符定义&#xff0c;即使在声明时未赋初值&#xff0c;编译器也会把它初始化为0&#xff0c;并且静态局部变量存储于进程的全局数据区&#xff0c;即使函数返回&#xff0…

用three.js做一个3D汉诺塔游戏(下)

本文由孟智强同学原创。 接上期&#xff1a;《用three.js做一个3D汉诺塔游戏&#xff08;上&#xff09;》 在上一期&#xff0c;我们成功地搭建了基础的 3D 场景。在本期中&#xff0c;我们将对场景进行优化&#xff0c;使其在视觉上更加真实&#xff0c;并为场景中的物体添加…

golang es查询的一些操作,has_child,inner_hit,对索引内父子文档的更新

1.因为业务需要查询父文档以及其下子文档&#xff0c;搞了很久才理清楚。 首先还是Inner_hits,inner_hits只能用在nested,has_child,has_parents查询里面 {"query": {"nested": {"path": "comments","query": {"match…

vulhub之fastjson篇-1.2.27-rce

一、启动环境 虚拟机:kali靶机:192.168.125.130/172.19.0.1(docker地址:172.19.0.2) 虚拟机:kali攻击机:192.168.125.130/172.19.0.1 本地MAC:172.XX.XX.XX 启动 fastjson 反序列化导致任意命令执行漏洞 环境 1.进入 vulhub 的 Fastjson 1.2.47 路径 cd /../../vulhub/fa…

企业IT运维事中故障定位方法及工具

企业IT故障定位指诊断故障直接原因或根因&#xff0c;故障定位有助于故障恢复动作更加有效。故障定位通常是整个故障过程中耗时最长的环节&#xff0c;定位的目标围绕在快速恢复的基础上&#xff0c;而非寻找问题根因&#xff0c;后者由问题管理负责。通常大部分可用性故障&…

GEE案例——小流域汇流计算以缅甸仰光为例(如何绘制除小流域内的河道)

简介 本案例主要介绍如何实现小流域内河流汇流的计算,这里需要用到地形中的坡度以及卷积的计算内容。 流域 流域是指一个地理区域内所有水流都会汇集到同一个主要水体(如河流、湖泊或海洋)的区域。流域由周围山脉、丘陵和地形特征所定义,其中的水流通过降水、融雪和地下…

计算机网络针对交换机的配置

实验 目的 交换机的基本配置&#xff0c;交换机VLAN配置 实验条件 Windows&#xff0c;Cisco packet tracer 实验 内容 交换机的基本配置&#xff0c;交换机VLAN配置 实验 过程 一、交换机的基本配置 进入特权模式 Switch>enable 进入配置模式 Switch#configure ter…

德国SycoTec义齿雕刻机主轴 助力高精密雕铣加工

随着科技的不断进步&#xff0c;义齿加工机械在牙科领域的应用越来越广泛。为了满足市场对高精度、高效率义齿加工设备的需求&#xff0c;SycoTec高速电主轴凭借其卓越的性能和可靠的质量&#xff0c;为CNC四轴、五轴义齿加工设备、五轴联动义齿加工中心、CAM/CAD义齿雕刻机、椅…

算法题中nextInt(),nextLine()的易错陷阱

nextInt()读取空格或回车前的整数 nextLine()读取回车前的一行&#xff0c;空格不会中断读取 陷阱代码如下&#xff1a; public class nextInt {public static void main(String[] args) {Scanner scannernew Scanner(System.in);System.out.println("请输入字符串数组…

C++11可变模板参数:海纳百川的Args

目录 一、可变模板参数的概念及功能 1.1Args的概念与使用 1.2获取args中的参数 二、emplace可变模板参数的实际应用 三、逗号表达式展开参数包 一、可变模板参数的概念及功能 1.1Args的概念与使用 C11的新特性可变参数模板能够让您创建可以接受可变参数的函数模板和类模板…

item_get_app在竞品分析中的应用与效果评估

item_get_app作为淘宝开放平台的重要API接口&#xff0c;为商家在竞品分析中提供了强大的数据支持。在竞争激烈的电商市场中&#xff0c;竞品分析是商家不可或缺的一环&#xff0c;而item_get_app的应用则使得这一分析过程更加高效、精准。通过调用item_get_app接口&#xff0c…

C语言 08 类型转换

一种类型的数据转换为另一种类型的数据&#xff0c;这种操作称为类型转换。 类型转换分为自动类型转换和强制类型转换。 自动类型转换 比如现在希望将一个 short 类型的数据转换为 int 类型的数据&#xff1a; #include <stdio.h>int main(){short s 10;// 直接将s的…

Redis: 配置文件详解(Redis.conf)

文章目录 一、Units二、INCLUDES三、NETWORK四、GENERAL五、SECURITY六、LIMITS 一、Units 单位&#xff0c;配置大小单位&#xff0c;开头定义了一些基本的度量单位&#xff0c;只支持bytes&#xff0c;不支持bit&#xff0c;大小写不敏感 二、INCLUDES 包含&#xff0c;多…

275. 传纸条(DP)

题目描述 小渊和小轩是好朋友也是同班同学&#xff0c;他们在一起总有谈不完的话题。一次素质拓展活动中&#xff0c;班上同学安排坐成一个 m 行 n 列的矩阵&#xff0c;而小渊和小轩被安排在矩阵对角线的两端&#xff0c;因此&#xff0c;他们就无法直接交谈了。幸运的是&…

easyExcel - 按模板导出

目录 前言一、情景介绍二、文档介绍2.1 读取模板2.2 填充模板 三、代码示例3.1 案例一&#xff1a;工资表3.2 案例二&#xff1a;报价单 四、我所遇到的问题 前言 Java-easyExcel入门教程&#xff1a;https://blog.csdn.net/xhmico/article/details/134714025 之前有介绍过如…

人工智能研究生前置知识—Anaconda与python工作环境

人工智能研究生前置知识—Anaconda与python工作环境 python环境管理 python工作环境的管理是需要满足的基本条件&#xff0c;指的是不同的python版本之间的切换。或者说是允许安装不同版本的python 解决&#xff1a;conda是一个跨平台的包管理工具&#xff0c;其环境管理功能允…

Python学习,记录不熟悉知识点

目录 Set&#xff08;集合&#xff09; 集合内置方法完整列表 根据字符串的表达式计算结果 ​编辑 条件控制&#xff1a; if – elif – else match...case 循环语句&#xff1a; while循环 for循环 在同一行中有多个赋值操作&#xff08;先计算&#xff0c;再赋值&…

创建型模式--5.建造者模式【卡雷拉公司】

1. 造船&#xff0c;我是专业的 在海贼世界中&#xff0c;水之都拥有全世界最好的造船技术&#xff0c;三大古代兵器之一的冥王就是由岛上的造船技师们制造出来的。现在岛上最大、最优秀的造船公司就是卡雷拉公司&#xff0c;它的老板还是水之都的市长&#xff0c;财富权力他都…

Discord注册教程:Discord刚注册就被封怎么办?附申诉教程!

Discord如今在海外社交媒体平台中迅速崛起&#xff0c;许多社交媒体营销人员也纷纷利用其社群特性进行推广&#xff0c;Discord注册也就成为社媒营销人员必经之路。然而&#xff0c;很多人注册Discord账号时常常会想&#xff1a;“在国内使用Discord会封号吗&#xff1f;”事实…