RK3568外置RTC芯片PCF8563T(或替代型号)实验

RK3568 外接 PCF8563 RTC

  • Chapter0 RK3568 外接 PCF8563 RTC
    • 1 menuconfig中打开pcf8563驱动
    • 2 设备树DTS
    • 3 修改驱动
  • Chapter1 【正点原子Linux连载】第三十一章 外置RTC芯片AT8563T实验 摘自【正点原子】ATK-DLRK3568嵌入式Linux驱动开发指南
    • 第三十一章 外置RTC芯片AT8563T实验
    • 31.1 AT8563芯片(PCF8563替代)
    • 31.2 硬件原理图分析


Chapter0 RK3568 外接 PCF8563 RTC

原文链接

1 menuconfig中打开pcf8563驱动

在kernel的menuconfig中选中

>Device Drivers
 
  >Real TIme Clock
 
    >Philips PCF8563/Epson RTC8564

2 设备树DTS

&i2c3 {
  status = "okay";
 
+  pcf8563: pcf8563@51 {
+    status = "okay";
+    compatible = "nxp,pcf8563";
+    reg = <0x51>;  // 读a3h, 写a2h: a3 >> 1 = 0x51
+  };
};
  rk809: pmic@20 {
    compatible = "rockchip,rk809";
    reg = <0x20>;
    ...
 
    pwrkey {
      status = "okay";
    };
 
+    rtc{
+      status = "disabled";
+    };
 
 
    pinctrl_rk8xx: pinctrl_rk8xx {
      ...
      };
      ...
   };
 

3 修改驱动

rtc芯片的电压不低,但是总报错,先注释掉就可以使用了。报错原因以后再看一下寄存器相关文档。

rk3568/kernel/drivers/rtc/rtc-pcf8563.c
 
static int pcf8563_get_datetime(struct i2c_client *client, struct rtc_time *tm)
{
  struct pcf8563 *pcf8563 = i2c_get_clientdata(client);
  unsigned char buf[9];
  int err;
 
  err = pcf8563_read_block_data(client, PCF8563_REG_ST1, 9, buf);
  if (err)
    return err;
 
-  /*if (buf[PCF8563_REG_SC] & PCF8563_SC_LV) {
-    pcf8563->voltage_low = 1;
-    dev_err(&client->dev,
-      "low voltage detected, date/time is not reliable.\n");
-    return -EINVAL;
-  }*/
 
  dev_dbg(&client->dev,
    "%s: raw data is st1=%02x, st2=%02x, sec=%02x, min=%02x, hr=%02x, "
    "mday=%02x, wday=%02x, mon=%02x, year=%02x\n",
    __func__,
    buf[0], buf[1], buf[2], buf[3],
    buf[4], buf[5], buf[6], buf[7],
    buf[8]);
 
 
  tm->tm_sec = bcd2bin(buf[PCF8563_REG_SC] & 0x7F);
  tm->tm_min = bcd2bin(buf[PCF8563_REG_MN] & 0x7F);
  tm->tm_hour = bcd2bin(buf[PCF8563_REG_HR] & 0x3F); /* rtc hr 0-23 */
  tm->tm_mday = bcd2bin(buf[PCF8563_REG_DM] & 0x3F);
  tm->tm_wday = buf[PCF8563_REG_DW] & 0x07;
  tm->tm_mon = bcd2bin(buf[PCF8563_REG_MO] & 0x1F) - 1; /* rtc mn 1-12 */
  tm->tm_year = bcd2bin(buf[PCF8563_REG_YR]);
  if (tm->tm_year < 70)
    tm->tm_year += 100;  /* assume we are in 1970...2069 */
  /* detect the polarity heuristically. see note above. */
  pcf8563->c_polarity = (buf[PCF8563_REG_MO] & PCF8563_MO_C) ?
    (tm->tm_year >= 100) : (tm->tm_year < 100);
 
  dev_dbg(&client->dev, "%s: tm is secs=%d, mins=%d, hours=%d, "
    "mday=%d, mon=%d, year=%d, wday=%d\n",
    __func__,
    tm->tm_sec, tm->tm_min, tm->tm_hour,
    tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday);
 
  return 0;
}
 

Chapter1 【正点原子Linux连载】第三十一章 外置RTC芯片AT8563T实验 摘自【正点原子】ATK-DLRK3568嵌入式Linux驱动开发指南

原文链接:https://blog.csdn.net/weixin_55796564/article/details/137628370

第三十一章 外置RTC芯片AT8563T实验

上一章我们学习了ATK-DLRK3568内置RTC外设,了解了Linux系统下RTC驱动框架。一般的应用场合使用SOC内置的RTC就可以了,而且成本也低,但是在一些对于时间精度要求比较高的场合,SOC内置的RTC就不适用了。我们需要根据自己的应用要求选择合适的外置RTC芯片,正点原子ATK-DLRK3568开发板上板载了一个RTC芯片:AT8563T,这是一个IIC接口的外置RTC芯片,本章我们就来学习一下如何驱动外置RTC芯片。

31.1 AT8563芯片(PCF8563替代)

31.1.1 AT8563简介
AT8563是一个CMOS实时时钟/日历芯片,针对低功耗进行了优化。计时计数器由世纪、年、月、日、日、时、分、秒位组成。系统可以设置或读取AT8563中存放的时间,从而对数据进行相应的处理。可以通过I2C总线接口与系统之前串行传输数据,比起采用并行总线的方案,可以减少电路板上的线路布线数目,非常适合于复杂的系统。
该芯片具有以下特点:
◎提供年、月、日、星期,时、分、秒计时,使用外置32.768Khz晶振。
◎低后备电流:0.25uA ,VDD=3.0V,温度25℃。
◎IIC接口,速度最高400KHz。
◎可编程时钟输出,可以供其他设备使用,可输出的时钟频率有32.768kHz、1.024kHz、32Hz和1Hz。
◎支持闹钟和定时功能。
◎IIC读IC读地址为0XA3,写地址为0XA2
◎内部集成震荡电容,片内电源复位功能
◎封装形式:DIP8、SO8、SSO8、MSOP8。
由下图31.1.1.1得知ATK-DLRK3568开发板板载的封装为SO8,对应就是AT8563T芯片。

这是AT8563的32.768kHz晶振引脚,AT8563必选要外接32.768kHz晶振。
图标5、6这是AT8563的IIC引脚,AT8563通过IIC接口与主控进行通信,因此AT8563本质是个IIC器件。
图标3这是中断引脚。
31.1.2 AT8563寄存器详解
AT8563有16个内部寄存器,这些寄存器都是8位的。前两个寄存器(0X00和0X01)为控制/状态寄存器。0X020X08为时间和日期寄存器,这些寄存器保存着秒、分、时、日、星期、月和年信息。0X090X0C为闹钟寄存器,保存闹钟信息。0X0D为时钟输出频率寄存器,0X0E和0X0F这两个寄存器时钟控制寄存器。注意、时分秒、年月日、闹钟等时间信息为BCD格式。

另外还有时钟输出寄存(0X0D)以及定时器寄存器(0X0E和0X0F),这里我们不用AT8563的时钟输出和定时器功能,这里就不讲解了,感兴趣的可以参考AT8563数据手册。
总体来说,AT8563还是很简单的,这是一个IIC接口的RTC芯片,因此在Linux系统下就涉及到两类驱动:
◎IIC驱动,需要IIC驱动框架来读写AT8563芯片。
◎RTC驱动,因为这是一个RTC芯片,因此要用到RTC驱动框架。
如果要用到中断功能的话,还需要用到Linux系统中的中断子系统,这些我们前面都有相应的实验讲解。所以AT8563的Linux驱动并不复杂,而且重点是Linux系统默认就已经集成了AT8563驱动,我们使用起来非常简单,直接修改设备树,添加AT8563节点信息,然后使能内核的AT8563驱动即可。

31.2 硬件原理图分析

AT8563原理图如图31.2.1所示:
在这里插入图片描述
图31.2.1 AT8563原理图
从图31.2.1可以看出,AT8563连接到了ATK-DLRK3568的I2C5接口上,引脚为GPIO3_B3和GPIO3_B4。另外,AT8563的INT引脚连接到了GPIO0_D3引脚上。
31.3 实验驱动编写
31.3.1 修改设备树
1、添加或者查找AT8563所使用的IO的pinmux配置
AT8563的IIC接口连接到了I2C5上,对应的引脚GPIO3_B3和GPIO3_B4。在设备树中添加这2个引脚对应的配置信息。打开rk3568-pinctrl.dtsi文件,查找一下有没有I2C5的引脚配置信息,默认是有的,内容如下:
示例代码31.3.1.1 i2c5引脚节点

1   i2c5 {
2       /omit-if-no-ref/
3       i2c5m0_xfer: i2c5m0-xfer {
4           rockchip,pins =
5               /* i2c5_sclm0 */
6               <3 RK_PB3 4 &pcfg_pull_none_smt>,
7               /* i2c5_sdam0 */
8               <3 RK_PB4 4 &pcfg_pull_none_smt>;
9       };
10
11      /omit-if-no-ref/
12      i2c5m1_xfer: i2c5m1-xfer {
13          rockchip,pins =
14              /* i2c5_sclm1 */
15              <4 RK_PC7 2 &pcfg_pull_none_smt>,
16              /* i2c5_sdam1 */
17              <4 RK_PD0 2 &pcfg_pull_none_smt>;
18      };
19  };

从第6、8行可以看出,I2C5默认就是GPIO3_B3和GPIO_B4,所以I2C5的引脚是不需要我们去修改的,直接使用i2c5m0_xfer即可。如果一个引脚作为GPIO功能的话可以不用添加pinctrl信息,因此,重点引脚GPIO0_D3就不操作了。
2、在I2C5节点追加AT8563子节点
接着我们在rk3568-atk-evb1-ddr4-v10.dtsi文件,通过节点内容追加的方式,向I2C5节点中添加“rtc@51”子节点,节点如下所示:
示例代码31.3.1.2 追加at8563子节点

1   &i2c5 {
2       rtc@51 {
3           compatible = "nxp,pcf8563";
4           reg = <0x51>;
5           interrupt-parent = <&gpio0>;
6           interrupts = <RK_PD3 IRQ_TYPE_LEVEL_LOW>;
7           #clock-cells = <0>;
8       };
9   }

第2行,rtc子节点,@后面的“51”是AT8563的器件地址。
第3行,设置compatible值为“nxp,pcf8563”。
第4行,reg属性也是设置AT8563器件地址的,因此reg设置为0x51。
第5行,interrupt-parent属性设置中断控制器,因为GPIO0_D3数据在GPIO0组,所以这里设置中断控制器为GPIO0。
第6行,interrupts设置中断信息,RK_PD3表示GPIO0_D3,IRQ_TYPE_LEVEL_LOW表示下降沿触发。

31.3.2 AT8563驱动使能
1、使用Linux内核自带的PCF8563驱动
这里为什么要使用PCF8563驱动呢?原因很简单,AT8563与PCF8563的驱动兼容。输入如下命令打开Linux配置菜单:
make ARCH=arm64 menuconfig
配置路径如下:
-> Device Drivers
-> Real Time Clock
-> <*> Philips PCF8563/Epson RTC8564 //选中PCF8563
如图31.3.2.1所示:
在这里插入图片描述
图31.3.2.1 使能PCF8563驱动
选择并保存后,重新编译内核源码使用新的boot.img文件启动开发板。
31.4 运行测试
当配置好AT8563驱动的时候,启动过程会提示如图31.4.1.1所示信息:
在这里插入图片描述
图31.4.1 AT8563启动过程
也可以在系统查看,如图31.4.2所示信息:
在这里插入图片描述
图31.4.2 查看AT8563设备
这里介绍一下,rtc0就是核心板上的RK809内部硬件RTC时钟,rtc1则是AT8563。系统已经识别出了AT8563,说明驱动没有问题。
将当前时间写入RTC1,注意读RTC之前需要写一次RTC才能读。
date +%T //查看系统时间并输出24小时制
hwclock -w -f /dev/rtc1 //将当前时间写入RTC1
hwclock -f /dev/rtc1 –show //读取RTC1的时间
在这里插入图片描述
图31.4.3 操作结果
从图31.4.3可以看出,正确的读出了时间信息,整个开发板掉电以后AT8563也会继续计时,因为有一个纽扣电池供电。
31.5 AT8563驱动分析
上一节我们已经测试了AT8563,本小节我们来简单看一下AT8563驱动源码,根据示例代码31.3.1.2中的第3行的compatible属性值可以找到相对应到驱动文件,在Linux源码中搜索字符串“nxp,pcf8563”即可找到驱动文件,路径为drivers/rtc/rtc-pcf8563.c。
AT8563是个I2C器件,因此基础驱动框架是I2C,在rtc-pcf8563.c文件中找到如下所示内容:
示例代码31.5.1 pcf8563 I2C驱动框架

1  static const struct i2c_device_id pcf8563_id[] = {
2   	{ "pcf8563", 0 },
3   	{ "rtc8564", 0 },
4   	{ }
5  };
6  MODULE_DEVICE_TABLE(i2c, pcf8563_id);
7  
8  #ifdef CONFIG_OF
9  static const struct of_device_id pcf8563_of_match[] = {
10  	{ .compatible = "nxp,pcf8563" },
11  	{ .compatible = "epson,rtc8564" },
12  	{ .compatible = "microcrystal,rv8564" },
13 	 	{}
14 };
15 MODULE_DEVICE_TABLE(of, pcf8563_of_match);
16 #endif
17 
18 static struct i2c_driver pcf8563_driver = {
19  	.driver     = {
20      	.name   = "rtc-pcf8563",
21      	.of_match_table = of_match_ptr(pcf8563_of_match),
22  	},
23  	.probe      = pcf8563_probe,
24  	.id_table   = pcf8563_id,
25 };
26 
27 module_i2c_driver(pcf8563_driver);

上述示例代码就是个标准的I2C驱动框架,第9~14行的pcf8563_of_match结构体数组就是设备树匹配数组,第10行的compatible属性为“nxp,pcf8563”,和我们的设备树向匹配。匹配以后第23行的pcf8563_probe函数就会执行。
接下来看一下pcf8563_probe函数,函数源码如下(有缩略):
示例代码31.5.2 pcf8563_probe 函数

1  static int pcf8563_probe(struct i2c_client *client,
2               const struct i2c_device_id *id)
3  {
4   struct pcf8563 *pcf8563;
5   int err;
6   unsigned char buf;
......
13  pcf8563 = devm_kzalloc(&client->dev, sizeof(struct pcf8563),
14              GFP_KERNEL);
15  if (!pcf8563)
16      return -ENOMEM;
17 
18  i2c_set_clientdata(client, pcf8563);
19  pcf8563->client = client;
20  device_set_wakeup_capable(&client->dev, 1);
21 
22  /* Set timer to lowest frequency to save power */
23  buf = PCF8563_TMRC_1_60;
24  err = pcf8563_write_block_data(client, PCF8563_REG_TMRC, 1, &buf);
25  if (err < 0) {
26      dev_err(&client->dev, "%s: write error\n", __func__);
27      return err;
28  }
29 
30  /* Clear flags and disable interrupts */
31  buf = 0;
32  err = pcf8563_write_block_data(client, PCF8563_REG_ST2, 1, &buf);
33  if (err < 0) {
34      dev_err(&client->dev, "%s: write error\n", __func__);
35      return err;
36  }
37 
38  pcf8563->rtc = devm_rtc_device_register(&client->dev,
39              pcf8563_driver.driver.name,
40              &pcf8563_rtc_ops, THIS_MODULE);
41
42  if (IS_ERR(pcf8563->rtc))
43      if (IS_ERR(pcf8563->rtc))
44  if (client->irq > 0) {
45      err = devm_request_threaded_irq(&client->dev, client->irq,
46              NULL, pcf8563_irq,
47              IRQF_SHARED | IRQF_ONESHOT | IRQF_TRIGGER_LOW,
48              pcf8563_driver.driver.name, client);
49      if (err) {
50          dev_err(&client->dev, "unable to request IRQ %d\n",
51                              client->irq);
52          return err;
53      }
54
55  }
56
57#if defined(CONFIG_COMMON_CLK) && !defined(CONFIG_ROCKCHIP_THUNDER_BOOT)
58  /* register clk in common clk framework */
59  pcf8563_clkout_register_clk(pcf8563);
60#endif
61
62  /* the pcf8563 alarm only supports a minute accuracy */
63  pcf8563->rtc->uie_unsupported = 1;
64
65  return 0;
66}

第13行,申请内存内存,rtc-pcf8563.c定义了一个pcf8563结构体来描述AT8563芯片,所以这里就是申请一个AT8563实例。
第23~36行,初始化AT8563。
第38~40行,pcf8563结构体里面有个rtc成员变量,此成员变量是个rtc_device结构体指针。看到这里,大家应该很熟悉了,这个就是上一章讲解的RTC驱动框架最核心的rtc_device。这里需要对这个rtc指针分配内存。设置rtc_device的ops成员变量为pcf8563_rtc_ops,pcf8563_rtc_ops包含了AT8563的具体操作,包括设置时间、读取时间、设置闹钟等。
第44~55行,中断初始化,AT8563有个中断引脚INT,因此可以使用中断功能。这里使用devm_request_threaded_irq函数完成中断申请已经初始化,中断函数为pcf8563_irq。
总结一下,pcf8563_probe函数的核心就是初始化AT8563,然后使用上一章讲的RTC驱动框架来设置AT8563,然后向内核注册。
接下来我们看一下AT8563的核心:pcf8563_rtc_ops,内容如下:
示例代码31.5.3 pcf8563_rtc_ops

1 static const struct rtc_class_ops pcf8563_rtc_ops = {
2   	.ioctl      	= pcf8563_rtc_ioctl,
3   	.read_time  	= pcf8563_rtc_read_time,
4   	.set_time   	= pcf8563_rtc_set_time,
5   	.read_alarm 	= pcf8563_rtc_read_alarm,
6   	.set_alarm  	= pcf8563_rtc_set_alarm,
7   	.alarm_irq_enable = pcf8563_irq_enable,
8 };

pcf8563_rtc_ops提供了AT8563的时间以及闹钟读写操作函数,应用程序对AT8563的所有操作最终都是通过这些函数来完成的。我们以读时间为例,当应用程序读取AT8563当前时间的时候,.read_time就会执行,在这里就是pcf8563_rtc_read_time函数,此函数又封装了一层函数函数pcf8563_get_datetime源码如下(有省略):

示例代码31.5.4 pcf8563_get_datetime函数

1  static int pcf8563_get_datetime(struct i2c_client *client, 
struct rtc_time *tm)
2  {
3   	
4   	struct pcf8563 *pcf8563 = i2c_get_clientdata(client);
5  	 	unsigned char buf[9];
6   	int err;
7  
8   	err = pcf8563_read_block_data(client, PCF8563_REG_ST1, 9, buf);
9   	if (err)
10     		return err;
11 
12  	if (buf[PCF8563_REG_SC] & PCF8563_SC_LV) {
13      	pcf8563->voltage_low = 1;
14      	dev_err(&client->dev,
15          		"low voltage detected, date/time is not reliable.\n");
16      	return -EINVAL;
17  	}
......
28  	tm->tm_sec = bcd2bin(buf[PCF8563_REG_SC] & 0x7F);
29  	tm->tm_min = bcd2bin(buf[PCF8563_REG_MN] & 0x7F);
30  	tm->tm_hour = bcd2bin(buf[PCF8563_REG_HR] & 0x3F); 
31  	tm->tm_mday = bcd2bin(buf[PCF8563_REG_DM] & 0x3F);
32  	tm->tm_wday = buf[PCF8563_REG_DW] & 0x07;
33  	tm->tm_mon = bcd2bin(buf[PCF8563_REG_MO] & 0x1F) - 1;34  	tm->tm_year = bcd2bin(buf[PCF8563_REG_YR]) + 100;
35  	/* detect the polarity heuristically. see note above. */
36  	pcf8563->c_polarity = (buf[PCF8563_REG_MO] & PCF8563_MO_C) ?
37      	(tm->tm_year >= 100) : (tm->tm_year < 100);
......
45  	return 0;
46 }

第8行,使用pcf8563_read_block_data函数从PCF8563_REG_ST1寄存器(地址为0X00)开始,连续读取9个寄存器的数据。这样就可以得到AT8563的控制与状态寄存器1和2,以及事件与日期寄存器的值。
第12行,判断AT8563的0X02寄存器VL位是否为1,也就是检查AT8563是否处于低电压模式,事件和日期是否有效。
第28~34行,依次获取AT8563中的时间和日期值,这里使用bcd2bin函数将原始的BCD值转换为时间值。将获取到的时间和日期打包到参数tm中,tm是个rtc_time结构体指针变量。
第36行,判断0X07寄存器的C位(bit7)的值,此位为1的话表示20xx年,为0的话就是19xx年。
可以看出pcf8563_rtc_read_time函数很简单,就是读取AT8563内部的时间和日期值,然后将其打包进rtc_time里面。其他的函数大同小异,大家可以自行分析一下,这里就不讲解了。
至此,AT8563驱动就简单分析完成了,其他IIC接口的RTC芯片驱动基本都是类似的,大家可以在实际项目开发中选择合适的RTC芯片。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GBase 8s 数据库集群切换及恢复

GBase 8s 数据库切换分为自动切换、由CM控制的按FOC规则的切换、手工切换。 自动切换 全自动切换用于HAC集群中&#xff0c;由于集群只有两个节点&#xff0c;数据库相互之前进行状态检查&#xff0c;发现异常时&#xff0c;能按DRAUTO的配置方式进行自动切换。 在HAC集群中&…

MyBatis(该篇足已)

目录 一.MyBatis是什么&#xff1f; 二.为什么学习MyBatis呢&#xff1f; 三.MyBatis的学习 3.1MyBatis的开发流程 3.2MyBatis项目 四.MyBatis的增删改操作 五.参数占位符 #{} 和 ${} 六.映射返回 七.映射失败 八.数据库连接池 九.动态SQL 9.1<if>标签 9.2&…

https从入门到放弃(概念+实战+上线)

什么是HTTPS 大家都知道http&#xff0c;为什么现在又多了一个https呢&#xff1f;HTTP是明文传输的&#xff0c;也就意味着&#xff0c;介于发送端、接收端中间的任意节点都可以知道传输的内容是什么。这些节点可能是路由器、代理等。 举个最常见的例子&#xff0c;用户登陆…

微服务领域的寻路者 —— Eureka深度探索与实战秘籍

文章目录 一、引言定义目标一个接地气的例子引言小结 二、Eureka架构2.1 Eureka Server一个有趣的例子2.2 Eureka Client一段简单的代码示例架构小结 三、工作流程1. 服务注册2. 心跳检测3. 服务发现4. 健康检查与失效剔除工作流程小结 四、核心机制4.1 服务注册与续约4.2 服务…

五、VGA 叠加图像原理和实现(十字光标)

前言&#xff1a;该案例在VGA项目&#xff1a;联合精简帧双fifosobel算法 实现VGA显示项目的基础上进行改动。 要求&#xff1a;通过串口助手把 198x198 的十字光标图像二进制数据传递给 FPGA 板卡&#xff0c;FPGA 板 卡接收到后存储到 Ram 中用于 VGA 叠加显示。 预期效果展…

保护身份安全:FIDO2认证在钓鱼攻击中的应用

攻击者主要使用钓鱼攻击来窃取和滥用用户身份。根据全球统计局&#xff08;Statista&#xff09;对员工报告的恶意电子邮件的研究显示&#xff0c;2023年第一季度&#xff0c;58.2%的恶意电子邮件是凭证窃取攻击&#xff0c;40.5%是冒充攻击&#xff0c;1.3%是恶意软件传送。钓…

aop获取方法运行时间

Slf4j Component Aspect//aop类 public class TimeAspect {/*Around 环绕通知 用ProceedingJoinPoint Before 前置通知 用JoinPoint&#xff08;是ProceedingJoinPoint的父类型&#xff09;&#xff0c;用它可以获得方法执行的相关信息&#xff0c;如目标类名&#xff0c;方法…

硬盘格式化后找不到硬盘原因是什么?硬盘格式化后能恢复数据吗

在日常使用电脑过程中&#xff0c;硬盘格式化是一个常见的操作&#xff0c;它可以帮助我们清除硬盘上的数据并重新整理文件系统。然而&#xff0c;有时在格式化硬盘后&#xff0c;我们可能会发现硬盘在系统中无法被识别或找到&#xff0c;这往往让人感到困惑和焦虑。同时&#…

海外静态IP购买指南:探索全球网络连接的奥秘

在数字化时代&#xff0c;互联网连接的重要性不言而喻。对于企业和个人而言&#xff0c;拥有稳定、高速的网络连接是成功的关键。而在特定应用场景下&#xff0c;如远程办公、跨境电商、服务器托管等&#xff0c;海外静态IP地址的需求日益凸显。本文将为您详细解读海外静态IP购…

航空电子ARINC818采集卡

ARINC818采集卡是针对航空电子数字视频总线协议&#xff08;Avionics Digital Video BUS&#xff0c;ADVB&#xff09;的高性能PCIe视频光纤采集测试设备。ARINC818协议主要应用于机载设备间的实时高清图像传输&#xff0c;目前已经成功应用于多款民用、军用机型当中&#xff0…

软件测试编写文档模板

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、测试岗位必备的文档 在一个常规的软件测试流程中&#xff0c;会涉及到测试计划、测试方案、…

《一“企”谈》∣企企通走进『鹏辉能源』,探索百亿储能上市企业如何实现供应链数字化转型

随着运营模式的升级和市场竞争的加剧&#xff0c;采购数字化已成为企业提升竞争力的关键。通过整合人工智能、大数据、云计算和物联网等先进技术&#xff0c;采购流程正逐步实现智能化、协同化和绿色化&#xff0c;大幅提升采购效率和决策质量。 广州鹏辉能源科技股份有限公司&…

C#调用电脑摄像头拍照

1.打开VS2019&#xff0c;新建一个Form窗体&#xff0c;工具->NuGet包管理工具->管理解决方案的NuGet包&#xff0c;在浏览里搜索AForge.Controls、AForge.Video.DirectShow&#xff0c;安装AForge.Controls和AForge.Video.DirectShow 2.安装AForge组件完成后&#xff0c…

Workfine签章方案使用说明

概述 为支持绝大部分第三方签章平台&#xff0c;Workfine针对性添加了部分动作事件与message支持。用户只需要自己开发中间代理程序&#xff0c;用于Workfine与签章平台的通讯即可完成整套签章方案。 整体业务流程图如下&#xff1a; 设计端添加发送PDF动作事件&#xff0c;生…

Java常见数据结构---八大结构

前言&#xff1a; 数据结构是计算机底层存储、组织数据的方式。是指数据相互之间是以什么方式排列在一起的。 通常情况下&#xff0c;精心选择的数据结构可以带来更高的运行或者存储效率 常见的八大数据结构&#xff1a; 栈&#xff1a; 思想&#xff1a; 栈是一种数据结构&…

JL-杰理芯片-认识TA的SDK的第二天

耳机升级 测试盒的有线升级和无线升级&#xff08;要加key&#xff09; 烧录器的有线升级&#xff08;不要key&#xff09;&#xff08;强制升级&#xff09; 一拖八的强制升级 测试盒无线升级 要求&#xff1a;耳机的主控&#xff08;芯片&#xff09;至少是D4的 测试盒设…

WordPress中插入视频的两种方法详解

最近我在建设WordPress网站的时候需要上传视频&#xff0c;我使用的是Hostease的主机安装的WordPress&#xff0c;随后在咨询了他们的技术支持后获得了一些解决方法。下面将介绍WordPress中插入视频的两种方法&#xff1a;本地上传和外部引用。 本地上传视频 使用WordPress的古…

springmvc核心流程

核心流程及配置 核心流程 执行流程 用户发送请求到DispatcherServlet前端控制器&#xff0c;前端控制器收到请求后自己不进行处理&#xff0c;而是委托给其他的解析器进行处理&#xff0c;作为统一访问点&#xff0c;进行全局的流程控制 DispatcherServlet调用HandlerMapping映…

Postman基础功能-Collection和批量运行

一、Collection&#xff08;集合&#xff09;介绍 当我们对一个或多个系统中的很多接口用例进行维护时&#xff0c;首先想到的就是对接口用例进行分类管理&#xff0c;同时还希望对这批接口用例做回归测试。 在 Postman 中也提供了这样一个功能&#xff0c;就是 Collec…

基础ArkTS组件:帧动画,内置动画组件,跑马灯组件(HarmonyOS学习第三课【3.6】)

帧动画 帧动画也叫序列帧动画&#xff0c;其原理就是在时间轴的每帧上逐帧绘制不同的内容&#xff0c;使其连续播放而成动画。ArkUI开发框架提供了 ImageAnimator 组件实现帧动画能力&#xff0c;本节笔者介绍一下 ImageAnimator 组件的简单使用。 官方文献 说明 该组件从A…