嵌入式进阶——RTC时钟

🎬 秋野酱:《个人主页》
🔥 个人专栏:《Java专栏》《Python专栏》

⛺️心若有所向往,何惧道阻且长

文章目录

    • RTC时钟
    • 原理图
    • PCF8563寄存器
      • 控制与状态寄存器
    • 设备地址
    • I2C环境初始化
    • RTC寄存器数据读取
    • RTC寄存器数据写入
    • RTC闹钟设置
    • RTC定时器设置
    • 驱动封装
    • BCD(Binary-Coded Decimal)
    • 一些状态分析
    • 有源晶振和无源晶振

RTC时钟

RTC时钟是一种实时时钟芯片,通常与微控制器或计算机等设备配合使用,提供高精度的时间和日期信息,以便于设备进行时间相关的操作,如记录数据、定时执行任务、闹钟提醒等。
RTC时钟的应用场景非常广泛,例如计算机主板、智能家居、物联网设备、工业自动化等领域。在这些应用中,RTC时钟可以提供高精度的时间戳、定时任务、日历功能等,从而为系统提供更加可靠的时间基准。
除了时间和日期信息,一些RTC时钟芯片还集成了温度传感器、电池备份等功能,以提供更加全面的服务。例如,在断电情况下,RTC时钟的备用电池可以维持时钟的运行,以保证时间和日期信息的准确性。
以下是几种常见的RTC时钟芯片及其特点和应用场景:

  1. DS1302:DS1302是一款低功耗时钟模块,集成了时钟、日历和时钟报警功能,能够以BCD格式存储时间和日期信息。它具有低功耗、简单易用、成本低等特点,适用于需要长时间运行且功耗要求较低的应用场景。
  2. DS3231:DS3231是一款高精度的I2C RTC时钟芯片,能够以二进制格式存储时间和日期信息,并具有时钟报警、温度补偿等功能。它具有高精度、低功耗、高可靠性等特点,适用于对时钟精度要求较高的应用场景,如电子钟、精密计时器等。
  3. PCF8563:PCF8563是一款低功耗的I2C RTC时钟芯片,能够以BCD格式存储时间和日期信息,并具有时钟报警、时钟输出等功能。它具有低功耗、集成度高、工作稳定等特点,适用于需要长时间运行且功耗要求较低的应用场景。
  4. RV-4162-C7:RV-4162-C7是一款高精度的I2C RTC时钟芯片,能够以二进制格式存储时间和日期信息,并具有时钟输出、时钟同步、时钟校准等功能。它具有高精度、低功耗、抗干扰能力强等特点,适用于对时钟精度要求较高的应用场景,如高精度计时器、高精度工控系统等。
  5. MCP7940N:MCP7940N是一款低功耗的I2C RTC时钟芯片,能够以BCD格式存储时间和日期信息,并具有时钟输出、时钟同步、时钟报警等功能。它具有低功耗、成本低等特点,适用于需要长时间运行且功耗要求较低的应用场景,如电子钟、自动售货机等。
    我们开发板中采用的是PCF8563

原理图

在这里插入图片描述

在这里插入图片描述
原理图外围设计:

  1. 外部电池: 确保断电后能正常工作
  2. 晶振:确保震荡频率准确。
  3. 肖特基二极管:防止电流倒灌。
    引脚说明:
  4. INT: 中断引脚。当触发到定时任务时,会触发引脚高低电平变化。
  5. SCL和SDA:为I2C通讯的两个引脚。用来保证MCU和RTC时钟芯片间进行通讯的。

PCF8563寄存器

在这里插入图片描述

控制与状态寄存器

用来配置控制和状态切换的寄存器。
在这里插入图片描述
在这里插入图片描述

设备地址

// 设备地址
#define		PCF8563_ADDR  0x51 << 1
// 存储地址:时间的存储地址开始位置
#define		PCF8563_REG_TD   0x02

I2C环境初始化

#include "Config.h"
#include "GPIO.h"
#include "Delay.h"#include "I2C.h"
#include "UART.h"
#include "NVIC.h"
#include "Switch.h"
/***1. 初始化IO口,将P32,P33初始化开漏OD模式
2. 初始化I2C协议 \ UARTEAXSFR();EA = 13. 通过I2C读取RTC时钟芯片数据
4. 通过I2C给RTC时钟芯片写数据
***/void GPIO_config() {P3_MODE_OUT_OD(GPIO_Pin_2 | GPIO_Pin_3);
}void UART_config(void) {// >>> 记得添加 NVIC.c, UART.c, UART_Isr.c <<<COMx_InitDefine		COMx_InitStructure;					//结构定义COMx_InitStructure.UART_Mode      = UART_8bit_BRTx;	//模式, UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTxCOMx_InitStructure.UART_BRT_Use   = BRT_Timer1;			//选择波特率发生器, BRT_Timer1, BRT_Timer2 (注意: 串口2固定使用BRT_Timer2)COMx_InitStructure.UART_BaudRate  = 115200ul;			//波特率, 一般 110 ~ 115200COMx_InitStructure.UART_RxEnable  = ENABLE;				//接收允许,   ENABLE或DISABLECOMx_InitStructure.BaudRateDouble = DISABLE;			//波特率加倍, ENABLE或DISABLEUART_Configuration(UART1, &COMx_InitStructure);		//初始化串口1 UART1,UART2,UART3,UART4NVIC_UART1_Init(ENABLE,Priority_1);		//中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3UART1_SW(UART1_SW_P30_P31);		// 引脚选择, UART1_SW_P30_P31,UART1_SW_P36_P37,UART1_SW_P16_P17,UART1_SW_P43_P44
}
/****************  I2C初始化函数 *****************/
void	I2C_config(void)
{I2C_InitTypeDef		I2C_InitStructure;I2C_InitStructure.I2C_Mode      = I2C_Mode_Master;	//主从选择   I2C_Mode_Master, I2C_Mode_SlaveI2C_InitStructure.I2C_Enable    = ENABLE;						//I2C功能使能,   ENABLE, DISABLEI2C_InitStructure.I2C_MS_WDTA   = DISABLE;					//主机使能自动发送,  ENABLE, DISABLEI2C_InitStructure.I2C_Speed     = 13;								//总线速度=Fosc/2/(Speed*2+4),      0~63// 400K = 24M / 2 / (Speed * 2 + 4):// 400  = 12000 / (Speed * 2 + 4)// Speed * 2   = 26I2C_Init(&I2C_InitStructure);NVIC_I2C_Init(I2C_Mode_Master,DISABLE,Priority_0);	//主从模式, I2C_Mode_Master, I2C_Mode_Slave; 中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3I2C_SW(I2C_P33_P32);					//I2C_P14_P15,I2C_P24_P25,I2C_P33_P32
}#define NUMBER	7void main() {// 设备地址 read A3h and write A2hu8 dev_addr = 0x51 << 1; 	// (设备地址 << 1) | 0 = 写地址. // 存储地址u8 mem_addr = 0x02;// 用于接收从机传来的数据u8 p[NUMBER];// 保存时间信息u8 second, minute, hour, day, week, month;u16 year;// 开启扩展寄存器使能EAXSFR();GPIO_config();UART_config();I2C_config();EA = 1;//		4. 通过I2C给RTC时钟芯片写数据
//	void I2C_WriteNbyte(u8 dev_addr, u8 mem_addr, u8 *p, u8 number);printf("--------------------------------read\n");while(1) {//		3. 通过I2C读取RTC时钟芯片数据I2C_ReadNbyte(dev_addr, mem_addr, &p, NUMBER);printf("%d:%d:%d \n", (int)hour, (int)minute, (int)second);delay_ms(250);delay_ms(250);delay_ms(250);delay_ms(250);}
}

RTC寄存器数据读取

I2C_ReadNbyte(PCF8563_ADDR, 0x02, dat, 7);
second = (dat[0] & 0x0F) + ((dat[0] >> 4) & 0x07) * 10;
minute = (dat[1] & 0x0F) + ((dat[1] >> 4) & 0x07) * 10;
hour = (dat[2] & 0x0F) + ((dat[2] >> 4) & 0x03) * 10;
day = (dat[3] & 0x0F) + ((dat[3] >> 4) & 0x03) * 10;
weekday = dat[4] & 0x07;
month = (dat[5] & 0x0F) + ((dat[5] >> 4) & 0x01) * 10;
year = ((dat[6] >> 4) & 0x0F) * 10 + (dat[6] & 0x0F);
year += ((dat[5] >> 7) & 0x01) * 100 + 1900;		

RTC寄存器数据写入

year = 2023;
month = 12;
day = 31;
weekday = 0;
hour = 23;
minute = 59;
second = 50;
if(year >= 2100) {c = 1;
}
tmp[0] = ((second / 10) << 4) + (second % 10);
tmp[1] = ((minute / 10) << 4) + (minute % 10);
tmp[2] = ((hour / 10) << 4) + (hour % 10);
tmp[3] = ((day / 10) << 4) + (day % 10);
tmp[4] = weekday % 7;
tmp[5] = (c << 7) + ((month / 10) << 4) + (month % 10);
tmp[6] = (u8)(((year % 1000) / 10) << 4) + (u8)((year % 1000) % 10);
I2C_WriteNbyte(PCF8563_ADDR, 0x02, tmp, 7);	

RTC闹钟设置

通过配置寄存器来配置闹钟

u8 config;
// 先读配置
I2C_ReadNbyte(PCF8563_ADDR, 0x01, &config, 1);
// 再去设置, 设置的时候别动别人的配置
config |= 0x02;
config &= ~0x08;//clear clock标记
I2C_WriteNbyte(PCF8563_ADDR, 0x01, &config, 1);
void ext_int3_call(void) {u8 tmp[7];u16 year;u8 month, day, weekday, hour, minute, second, c = 0;u8 config[1] = {0};printf("alarm \r\n");// 读取状态I2C_ReadNbyte(PCF8563_ADDR, 0x01, config, 1);printf("config: %d\r\n", (int)config[0]);// 判断闹钟是否被激活if((config[0] >> 3) & 0x01 == 1) {//清除 alarm 标记config[0] &= ~0x08;I2C_WriteNbyte(RTC_ADDR, 0x01, config, 1);I2C_ReadNbyte(RTC_ADDR, 0x01, config, 1);printf("config: %d\r\n", (int)config[0]);}
}

RTC定时器设置

通过配置寄存器来配置定时器。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

u8 config;
// 先读配置
I2C_ReadNbyte(PCF8563_ADDR, 0x01, &config, 1);
// 再去设置, 设置的时候别动别人的配置
config |= 0x01;
config &= ~0x04;//clear timer标记
I2C_WriteNbyte(PCF8563_ADDR, 0x01, &config, 1);
u8 config[1] = {0};I2C_ReadNbyte(PCF8563_ADDR, 0x01, config, 1);
printf("config: %d\r\n", (int)config[0]);
if((config[0] >> 2) & 0x01 == 1) {printf("timer \r\n");config[0] &= ~0x04;I2C_WriteNbyte(PCF8563_ADDR, 0x01, config, 1);
}

驱动封装

头文件封装

#ifndef __PCF8563_H__
#define __PCF8563_H__#include "config.h"
#include "I2C.h"#define PCF8563_SCL			P32
#define PCF8563_SDA			P33
#define PCF8563_INT			P37
#define PCF8563_ADDR		0x51 << 1
#define PCF8563_ADDR_W		0xA2
#define PCF8563_ADDR_R		0xA3#define PCF8563_SCL_INIT()	{P3M1 |= 0x04, P3M0 |= 0x04;}
#define PCF8563_SDA_INIT()	{P3M1 |= 0x08, P3M0 |= 0x08;}
#define PCF8563_INT_INIT()	{P3M1 &= ~0x80, P3M0 &= ~0x80;}//u16 year;
//u8 month, day, weekday, hour, minute, second
// 定义clock
typedef struct {u16 year;u8 month;u8 day;u8 weekday;u8 hour;u8 minute;u8 second;
} Clock_t;//定义alarm
typedef struct {u8 hour;u8 enableHour;u8 minute;u8 enableMinute;u8 day;u8 enableDay;u8 weekday;u8 enableWeekday;
} Alarm_t;// 国产芯片的HZ1有问题,不要使用,建议使用HZ64
enum TimerFreq{ HZ4096 = 0, HZ64 = 1, HZ1 = 2, HZ1_60 = 3};extern void PCF8563_on_alarm(void); 
extern void PCF8563_on_timer(void); void PCF8563_init(void);
void PCF8563_get_clock(Clock_t *c);
void PCF8563_set_clock(Clock_t c);void PCF8563_enable_alarm();
void PCF8563_set_alarm(Alarm_t a);
void PCF8563_disable_alarm();void PCF8563_enable_timer();
void PCF8563_set_timer(enum TimerFreq freq, u8 period);
void PCF8563_disable_timer();#endif

● 定义结构体Clock_t表示时间数据,通过这个结构体承载数据,方便读取和设置。
● 定义结构体Alarm_t表示闹钟数据,通过这个结构体承载数据,方便读取和设置。
● 定义枚举TimerFreq限定计时器设置的范围。

#include "PCF8563.h"
#include <stdio.h>void PCF8563_init(void) {PCF8563_SCL_INIT();PCF8563_SDA_INIT();PCF8563_INT_INIT();
}void PCF8563_get_clock(Clock_t *c) {u8 dat[7];I2C_ReadNbyte(PCF8563_ADDR, 0x02, dat, 7);c->second  = (dat[0] & 0x0F) + ((dat[0] >> 4) & 0x07) * 10;c->minute  = (dat[1] & 0x0F) + ((dat[1] >> 4) & 0x07) * 10;c->hour    = (dat[2] & 0x0F) + ((dat[2] >> 4) & 0x03) * 10;c->day 	   = (dat[3] & 0x0F) + ((dat[3] >> 4) & 0x03) * 10;c->weekday =  dat[4] & 0x07;c->month   = (dat[5] & 0x0F) + ((dat[5] >> 4) & 0x01) * 10;c->year    = ((dat[6] >> 4) & 0x0F) * 10 + (dat[6] & 0x0F);c->year   += ((dat[5] >> 7) & 0x01) * 100 + 1900;
}void PCF8563_set_clock(Clock_t clk) {u8 tmp[7];u8 c = 0;if(clk.year >= 2000) {c = 1;}tmp[0] = ((clk.second / 10) << 4) + (clk.second % 10);tmp[1] = ((clk.minute / 10) << 4) + (clk.minute % 10);tmp[2] = ((clk.hour   / 10) << 4) + (clk.hour   % 10);tmp[3] = ((clk.day    / 10) << 4) + (clk.day    % 10);tmp[4] = clk.weekday % 7;tmp[5] = (c << 7) + ((clk.month / 10) << 4) + (clk.month % 10);tmp[6] = (u8)(((clk.year % 1000) / 10) << 4) + (u8)((clk.year % 1000) % 10);I2C_WriteNbyte(PCF8563_ADDR, 0x02, tmp, 7);
}void PCF8563_enable_alarm() {u8 config;// 先读配置I2C_ReadNbyte(PCF8563_ADDR, 0x01, &config, 1);// 再去设置, 设置的时候别动别人的配置config |= 0x02;config &= ~0x08;//clear clock标记I2C_WriteNbyte(PCF8563_ADDR, 0x01, &config, 1);
}void PCF8563_set_alarm(Alarm_t a) {u8 tmp[4];tmp[0] = ((a.minute / 10) << 4) + (a.minute % 10);if(a.enableMinute == 0) {tmp[0] += (1 << 7);}tmp[1] = ((a.hour / 10) << 4) + (a.hour % 10);if(a.enableHour == 0) {tmp[1] += (1 << 7);}tmp[2] = ((a.day / 10) << 4) + (a.day % 10);if(a.enableDay == 0) {tmp[2] += (1 << 7);}tmp[3] = a.weekday % 7;if(a.enableWeekday == 0) {tmp[3] += (1 << 7);}I2C_WriteNbyte(PCF8563_ADDR, 0x09, tmp, 4);
}void PCF8563_disable_alarm() {u8 config[1];// 先读配置I2C_ReadNbyte(PCF8563_ADDR, 0x01, config, 1);// 再去设置, 设置的时候别动别人的配置config[0] &= ~0x02;config[0] &= ~0x08;//clear clock标记I2C_WriteNbyte(PCF8563_ADDR, 0x01, config, 1);
}void PCF8563_enable_timer() {u8 config;// 先读配置I2C_ReadNbyte(PCF8563_ADDR, 0x01, &config, 1);// 再去设置, 设置的时候别动别人的配置config |= 0x01;config &= ~0x04;//clear timer标记I2C_WriteNbyte(PCF8563_ADDR, 0x01, &config, 1);
}void PCF8563_set_timer(enum TimerFreq freq, u8 period) {u8 config;config = freq + (1 << 7);//计数频率 + timer enableI2C_WriteNbyte(PCF8563_ADDR, 0x0E, &config, 1);config = period; // config, periodI2C_WriteNbyte(PCF8563_ADDR, 0x0F, &config, 1);
}void PCF8563_disable_timer() {u8 config[1];// 先读配置I2C_ReadNbyte(PCF8563_ADDR, 0x01, config, 1);// 再去设置, 设置的时候别动别人的配置config[0] &= ~0x01;config[0] &= ~0x04;//clear timer标记I2C_WriteNbyte(PCF8563_ADDR, 0x01, config, 1);
}void Ext_INT3 (void) interrupt INT3_VECTOR
{u8 config[1];// 先读配置I2C_ReadNbyte(PCF8563_ADDR, 0x01, &config, 1);// 判断闹钟是否被激活 Alarm Flag && AIEif((config[0] & 0x08) && (config[0] & 0x02)) {//清除 alarm 标记config[0] &= ~0x08;I2C_WriteNbyte(PCF8563_ADDR, 0x01, config, 1);PCF8563_on_alarm();}// 判断计时器是否被激活 Timer Flag && TIEif((config[0] & 0x04) && (config[0] & 0x01)) {//清除 timer 标记config[0] &= ~0x04;I2C_WriteNbyte(PCF8563_ADDR, 0x01, config, 1);PCF8563_on_timer();}
}

● Ext_INT3中断函数为当前STC8H平台可用的。如果切换平台需要进行对应的移植操作。

BCD(Binary-Coded Decimal)

BCD(Binary-Coded Decimal)是一种用二进制编码表示十进制数字的格式。
在BCD格式中,每个十进制数位用4个二进制位来表示。BCD的目的是使得数字的编码与显示更加直观和容易处理。在BCD格式中,每个十进制数位的取值范围是0到9。
例如,数字5用BCD表示为0101,数字9用BCD表示为1001。这种表示方法使得每个十进制数位都独立地编码,方便在数字处理和显示设备上进行操作。
10进制数转BCD数:

// 十位取出左移4位 + 个位 (得到BCD数)
#define WRITE_BCD(val) 	((val / 10) << 4) + (val % 10)
// 将高4位乘以10 + 低四位 (得到10进制数)
#define READ_BCD(val) 	(val >> 4) * 10 + (val & 0x0F) 

一些状态分析

PCF8563的规则:

  1. 通电后,就开始工作,内部可配置寄存器(时间,闹钟,定时器)
  2. 如果已经有电池,但是单片机断电了,单片机重新通电后,单片机应该遵守PCF8563中已经配置的规则(时间,闹钟,定时器)

有源晶振和无源晶振

晶振可分为有源晶振与无源晶振。一般我们说的“晶振”指的是有源晶振,而无源晶振通常叫“晶体”,或者叫“谐振器”。两者最大的区别是:
● 有源晶振自身即可起振
● 无源晶振则需要外加专门的时钟电路才能起振
总体来看,有源晶振的精度、稳定度等方面均要好于无源晶振,尤其是在精密测量领域,大部分用的都是高档的有源晶振,以方便把各种补偿技术集成在一起,减少设计复杂性。
在这里插入图片描述

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

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

相关文章

2024.5.28晚训题解

提前预告&#xff0c;市赛初中组会考算法题&#xff0c;应该会有两道模板题 比如DFS BFS 二分 简单动态规划&#xff0c;虽然我们没学多久&#xff0c;但是模板题你还是要会写的 A题 编辑距离 动态规划 注意多组输入 #include<iostream> using namespace std; int dp[1…

9、C#【进阶】特性

特性 文章目录 1、特性概念2、自定义特性 Attribute3、特性的使用4、限制自定义特性的使用范围5、系统自带特性1、过时特性2、调用者信息特性3、条件编译特性4、外部dll包函数特性 1、特性概念 特性是一种允许我们向程序的程序集添加元数据的语言结构 它是用于保存程序机构信息…

【机器学习300问】103、简单的经典卷积神经网络结构设计成什么样?以LeNet-5为例说明。

一个简单的经典CNN网络结构由&#xff1a;输入层、卷积层、池化层、全连接层和输出层&#xff0c;这五种神经网络层结构组成。它最最经典的实例是LeNet-5&#xff0c;它最早被设计用于手写数字识别任务&#xff0c;包含两个卷积层、两个池化层、几个全连接层&#xff0c;以及最…

ansible批量漏洞升级openssh版本

1、ansible宿主机准备好环境&#xff0c;并写好hosts文件 [rootoxidized ansible]# cat hosts [all] 10.10.200.33 10.10.200.34 10.10.200.35跑playbook之前记得提前发送秘钥 ssh-copy-id 10.10.200.33/34/352、下载好安装包&#xff0c;然后编写yml [rootoxidized ansible]…

【实用的 IDEA 配置和操作技巧总结】

前置知识 IDEA的设置快捷键为ctrlalts键&#xff0c;后文介绍IDEA常见的配置就不再赘述这一点了。 基础配置 取消默认打开上次项目 日常开发都会打开不同的项目&#xff0c;初次安装IDEA之后&#xff0c;每次打开IDEA都会开启上一次启动的项目&#xff0c;所以我们需要进入设…

0基础学习Mybatis系列数据库操作框架——Mysql的Geometry数据处理之WKB方案

大纲 序列化反序列化完整TypeHandlerSQL XML完整XML Mapper测试代码代码 在《0基础学习Mybatis系列数据库操作框架——Mysql的Geometry数据处理之WKT方案》中&#xff0c;我们介绍WTK方案的优点&#xff0c;也感受到它的繁琐和缺陷。比如&#xff1a; 需要借助ST_GeomFromText…

350种类型、10W+量级的API,企业应该怎么管?

忽如一夜春风来&#xff0c;万物皆可API。 在互联网时代&#xff0c;API无处不在&#xff1a;企业对外开放的数据、服务和业务能力&#xff0c;以API的形式提供给合作方&#xff1b;企业内部应用与应用、App与App之间的通信&#xff0c;通过API进行&#xff1b;甚至应用内部的…

php 连接sqlserver步骤

1.首先要确定使用的是sqlserver的哪个版本&#xff0c;比如sqlserver2012 2.确定服务器是64位还是32位的 3.确认一下使用php的哪个版本&#xff0c;比如php7.1 SQL Server 的 Microsoft PHP 驱动程序 Microsoft Drivers for PHP 支持矩阵 - PHP drivers for SQL Server | Mi…

怎么做好客户信息管理?

根据Forrester的调查表示&#xff0c;客户满意度的影响可能会使某些行业的收入每年增加高达 10 亿美元。而提升客户满意度的关键环节便是做好客户信息管理。但企业在进行客户信息管理中往往会遇到以下问题&#xff1a; 客户信息乱&#xff1a;客户信息存在各个 Excel表格、个人…

PMP报考条件怎么查询?如何判定自己是否符合条件?

PMP报考条件在PMI官网上就可以查询&#xff0c;PMP报考条件只需要符合项目管理培训经历和项目管理经验两个方面的要求即可&#xff0c;大家可以对照下方的规定判断自己是否符合PMP报名条件 PMP报考条件 以下是PMI&#xff08;中国&#xff09;官网对于PMP报名条件的规定&…

ubuntu strace命令

strace 是 Linux 系统中的一个调试工具&#xff0c;用于跟踪并记录系统调用&#xff08;system calls&#xff09;和信号&#xff08;signals&#xff09;。在 Ubuntu 中&#xff0c;strace 命令可以帮助开发者和系统管理员了解一个程序在运行时如何与操作系统内核进行交互&…

vue+antd实践:在输入框光标处插入内容

今天来看一个很简单的需求。 需求描述&#xff1a;在输入框光标处&#xff0c;插入指定的内容。 效果如下&#xff1a; 实现思路&#xff1a;刚开始还在想怎么获取光标的位置&#xff0c;但是发现所做的项目是基于vue3antd组件&#xff0c;那么不简单了嘛&#xff0c;只要调…

配置物联网平台 保姆级教程

一、云平台配置&#xff08;我们这里使用阿里云&#xff09; 1、注册和登录 &#xff08;1&#xff09;找到云平台官网&#xff0c;点击右上角的注册登录&#xff0c;完成之后&#xff0c;进行实名认证&#xff0c;任选一种认证方式。 ​​​​​​​ 2、实例的开通和创建 …

Scala环境的搭建

要搭建Scala&#xff0c;我们必须先下载java&#xff0c;由于我的电脑已经搭建好了环境&#xff0c;因此我这里用截图来教大家搭建环境。 可以从网上搜索安装包对其进行安装 IntelliJ IDEA – 领先的 Java 和 Kotlin IDE 不建议下载最新版的&#xff0c;大家下载的版本可以下…

本杀小程序开发实战手册:从构思到上线

一、引言 随着移动互联网的快速发展&#xff0c;剧本杀作为一种新兴的娱乐方式&#xff0c;受到了越来越多年轻人的喜爱。为了满足市场需求&#xff0c;开发一款剧本杀小程序成为了许多创业者和开发者的选择。本文将从构思、设计、开发到上线等方面&#xff0c;为您详细解析剧…

第52期|GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以找…

万界星空科技定制化MES系统帮助实现数字化生产

由于不同企业的生产流程、需求和目标各异&#xff0c;MES管理系统的个性化和定制化需求也不同。有些企业需要将MES管理系统与ERP等其他管理系统进行集成&#xff0c;以实现全面的信息共享和协同工作。有些企业需要将MES管理系统与SCADA等控制系统进行集成&#xff0c;以实现实时…

windows ollama 指定模型下载路径

为Ollama指定模型的下载路径 在Windows系统中&#xff0c;如果想为Ollama指定模型的下载路径&#xff0c;可以通过设置环境变量来实现。以下是详细的步骤&#xff1a; 确定默认下载路径&#xff1a; 默认情况下&#xff0c;Ollama的模型可能会下载到C:\Users\<用户名>…

企业内网终端监控管理软件有哪些?推荐4款企业终端监控管理软件

企业内网终端监控管理软件是一种专为企业内部网络设计的安全与管理工具&#xff0c;旨在帮助企业管理、监控和保护其内部网络中的各种终端设备&#xff0c;如个人电脑、笔记本、移动设备等。 这类软件的主要功能包括但不限于以下几个方面&#xff1a; 1&#xff0c;实时监控&a…

快消终端门店真实性新玩法:全流程校验+多元认证多重保障

在某饮品企业会议室&#xff0c;气氛凝重。城市经理一脸严肃地扫视着团队成员&#xff0c;小李、小张和小陈等人在这锐利的目光下显得有些局促不安。 城市经理沉声开口&#xff1a;小李上报的“幸福超市”’新店在XX大街上并不存在。这是怎么回事&#xff1f; 小李支吾着回答…