正点原子嵌入式linux驱动开发——外置RTC芯片PCF8563

news2024/12/24 1:02:00

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

PCF8563简介

PCF8563简介

PCF8563是一个CMOS RTC芯片,支持时间和日历功能,支持可编程的时钟输出、中断输出以及低电压检测。PCF8563提供了两线IIC接口来传输时间信息,最大传输速度为400Kbit/S,在读写寄存器的时候地址自增,PCF8563相关特性如下:

  1. 提供年、月、日、星期,时、分、秒计时,使用外置32.768Khz晶振。
  2. 低后备电流:0.25uA,VDD=3.0V,温度25℃。
  3. IIC接口,速度最高400KHz。
  4. 可编程时钟输出,可以供其他设备使用,可输出的时钟频率有32.768kHz、1.024kHz、32Hz和1Hz。
  5. 支持闹钟和定时功能。
  6. IIC读地址为0XA3,写地址为0XA2,也就是IIC器件地址为:0X51。
  7. 有一个开漏输出的中断引脚。

PCF8563框图如下图所示:

PCF8563框图

简单分析一下上图中的框图:

  1. 这是PCF8563的32.768kHz晶振引脚,PCF8563必选要外接32.768kHz晶振。
  2. 这是PCF8563的IIC引脚,PCF8563通过IIC接口与主控进行通信,因此PCF8563本质是个IIC器件。
  3. 时钟输出引脚。
  4. 中断引脚。
  5. 前面说了,PCF8563是个IIC器件,因此内部就有很多寄存器来实现RTC功能,比如配置芯片,读取时间信息等。这部分就PCF8563的内部寄存器。

PCF8563寄存器详解

PCF8563有16个内部寄存器,这些寄存器都是8位的。前两个寄存器(0x00和0x01)为控
制/状态寄存器。0X02-0X08为时间和日期寄存器,这些寄存器保存着秒、分、时、日、星期、月和年信息。0X09-0X0C为闹钟寄存器,保存闹钟信息。0X0D为时钟输出频率寄存器,0X0E和0X0F这两个寄存器时钟控制寄存器。注意、时分秒、年月日、闹钟等时间信息为BCD格式

接下来看一下这些寄存器如何使用:

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

寄存器结构如下图所示:

控制状态寄存器1

上图是控制状态寄存器 1,相应的位含义如下:

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

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

寄存器结构如下图所示:

控制状态寄存器2

上图是控制状态寄存器2,相应的位含义如下:

  • 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-0X08)

接下来看一下时间和日期相关寄存器,一共7个寄存器,结构如下图所示:

时间和日期寄存器

依次来看一下上图中的这些寄存器:

  • 0X02:此寄存器为秒钟寄存器,PCF8563是有低电压检测的,当VDD电压低于最小允许电压的时候VL(bit)位就会置1,表示时钟异常,如果电压正常的话就为0。SECONDS(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-0X0C)

接下来看一下闹钟相关寄存器,一共4个寄存器,结构如下图所示:

闹钟寄存器

依次来看一下上图中的这些寄存器:

  • 0X09:此寄存器为闹钟分钟寄存器,AE_M(bit7)为分钟闹钟使能位,为0的话使能分钟闹钟,为1的话关闭。MINUTE_ALARM(bit6-0)这7位表示具体的闹钟分钟,范围0-59,为BCD格式。
  • 0X0A:此寄存器为闹钟小时寄存器,含义和0X09寄存器类似。
  • 0X0B:此寄存器为闹钟日期寄存器,含义和0X09寄存器类似。
  • 0X0C:此寄存器为闹钟星期寄存器,含义和0X09寄存器类似。

另外还有时钟输出寄存(0X0D)以及定时器寄存器(0X0E和0X0F),这里不用PFC8563的时钟输出和定时器功能,就不讲解了。

总体来说,PCF8563还是很简单的,这是一个IIC接口的RTC芯片,因此在Linux系统下
就涉及到两类驱动:

  1. IIC驱动,需要IIC驱动框架来读写PCF8563芯片。
  2. RTC驱动,因为这是一个RTC芯片,因此要用到RTC驱动框架。

如果要用到中断功能的话,还需要用到Linux系统中的中断子系统,这些前面都有相应的实验讲解。所以PCF8563的Linux驱动并不复杂,而且重点是Linux系统默认就已经集了PCF8563驱动,使用起来非常简单,直接修改设备树,添加PCF8563节点信息,然后使能内核的PCF8563驱动即可

硬件原理图分析

PCF8563原理图如下图所示:

PCF8563原理图

从上图可以看出,PCF8563连接到了STM32MP157的I2C4接口上,引脚为PZ5、 PZ4。另外, PCF8563的INT引脚连接到了STM32MP157的PI3引脚上。

实验驱动编写

修改设备树

添加/查找PCF8563使用IO的pinmux配置

PCF8563的IIC接口连接到了STM32MP157的I2C4上,对应的引脚为PZ4和PZ5。另外还有一个中断引脚PI3,首先需要在设备树中添加这3个引脚对应的配置信息。

首先添加PZ4和PZ5,打开stm32mp15-pincrtl.dtsi文件,查找一下有没有I2C4的引脚配置信息,默认是有的,内容如下:

示例代码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 };

从第3、4行可以看出,I2C4默认引脚就是PZ4和PZ5,和本实验一样,所以I2C4的引脚不需要修改,直接使用i2c4_pins_a即可。接下来还需要定义中断引脚PI3的引脚信息,前面讲过了,如果一个引脚作为GPIO功能的话可以不用添加此引脚pinctrl信息

在I2C4节点下添加pinmux并追加pcf8563子节点

前面说了Linux内核内部已经集成了PCF8563驱动,所以肯定有文档描述如何使用这个驱动。打开Documentation/devicetree/bindings/rtc/pcf8563.txt,此文档描述了如何使用Linux内核自带的pcf8563驱动,也给出了参考设备节点,参考此文档即可。

在stm32mp157d-atk.dts文件,追加I2C4节点,追加如下所示内容:

示例代码 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 };

第2-4行,设置IO要使用的pinmux配置。

第7-10行,pcf8563设备子节点,第8行设置compatible为“nxp,pcf8563”,这个是必须的,否则无法匹配Linux内核自带的pcf8563驱动。从第9行设置pcf8563中断引脚为PI3,下降沿触发。pcf8563的I2C地址为0X51,因此reg为0X51

PCF8563驱动使能

上一个实验使能了STM32MP157内部RTC,为了防止干扰,所以要先关闭内部RTC!配置路径为:

-> Device Drivers
-> Real Time Clock
-> STM32 RTC //取消选中

如下图所示:

关闭STM32MP157内部RTC

使能Linux内核自带的PCF8563驱动

接下来需要使能Linux内核自带的PCF8563驱动,配置路径如下:

-> Device Drivers
-> Real Time Clock
-> <*> Philips PCF8563/Epson RTC8564 //选中 PCF8563

如下图所示:

使能PCF8563驱动

配置完成后重新编译内核和设备树,得到新的uImage以及stm32mp157d-atk.dtb。

运行测试

使用上面编译得到的内核和设备树启动开发板。当系统第一次启动,没有设置PCF8563时间的时候,启动过程会提示如下图所示信息:

PCF8563启动过程

从上图可以看出,系统已经识别出了PCF8563,说明驱动没问题。但是,这里提示检测到低电压,日期和时间无效。这是因为没有设置时间,等系统启动成功,然后参考上一篇笔记内部RTC的设置方法设置RTC时间,比如这里设置时间为2021年5月21号,下午15:52:00,输入如下命令:

date -s "2021-05-21 15:52:00" //设置时间
hwclock -w //保存

时间设置好以后重启系统,此时系统log信息如下图所示:

PCF8563启动信息

从上图可以看出,此时PCF8563再没有提示电压低的错误,而且正确的读出了时间信
息,整个开发板掉电以后PCF8563也会继续计时,因为有一个纽扣电池供电。

PCF8563驱动分析

上一小节已经测试了PCF8563,本小节来简单看一下PCF8563驱动源码,根据示例代码44.3.1.3中的第8行的compatible属性值可以找到对应到驱动文件,在Linux源码中搜索字符串“nxp,pcf8563”即可找到对应的驱动文件,驱动文件为drivers/rtc/rtc-pcf8563.c。

PCF8563是个I2C器件,因此基础驱动框架是I2C,在rtc-pcf8563.c文件中找到如下所示内容:

pcf8563 I2C驱动框架

上述示例代码就是个标准的I2C驱动框架,第9-14行的pcf8563_of_match结构体数组就是设备树匹配数组,第10行的compatible属性为“nxp,pcf8563”,和设备树相匹配。匹配以后第23行的pcf8563_probe函数就会执行。

接下来看一下pcf8563_probe函数,函数源码如下(有缩略):

示例代码44.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_allocate_device(&client->dev); 
39 if (IS_ERR(pcf8563->rtc)) 
40     return PTR_ERR(pcf8563->rtc); 
41 
42 pcf8563->rtc->ops = &pcf8563_rtc_ops; 
43 /* the pcf8563 alarm only supports a minute accuracy */ 
44 pcf8563->rtc->uie_unsupported = 1; 
45 pcf8563->rtc->range_min = RTC_TIMESTAMP_BEGIN_2000; 
46 pcf8563->rtc->range_max = RTC_TIMESTAMP_END_2099; 
47 pcf8563->rtc->set_start_time = true; 
48 
49 if (client->irq > 0) { 
50     err = devm_request_threaded_irq(&client->dev, client->irq, 
51             NULL, pcf8563_irq, 
52             IRQF_SHARED | IRQF_ONESHOT | IRQF_TRIGGER_LOW, 
53             pcf8563_driver.driver.name, client); 
54     if (err) { 
55         dev_err(&client->dev, "unable to request IRQ %d\n",
56                     client->irq); 
57         return err; 
58     } 
59 } 
60 
61 err = rtc_register_device(pcf8563->rtc); 
62 if (err) 
63     return err; 
...... 
70 return 0; 
71 }

第13行,申请内存内存,rtc-pcf8563.c定义了一个pcf8563结构体来描述PCF8563芯片,所以这里就是申请一个pcf8563实例。

第23-36行,初始化PCF8563。

第38行,pcf8563结构体里面有个rtc成员变量,此成员变量是个rtc_device结构体指针。
这个就是上一章讲解的RTC驱动框架最核心的rtc_device。这里需要对这个rtc指针分配内存。

第42行,设置rtc_device的ops成员变量为pcf8563_rtc_ops,pcf8563_rtc_ops包含了PCF8563的具体操作,包括设置时间、读取时间、设置闹钟等。

第44-47行,继续初始化rtc的其他成员变量。

第49-59行,中断初始化,PCF8563有个中断引脚INT,因此可以使用中断功能。这里使用devm_request_threaded_irq函数完成中断申请已经初始化,中断函数为pcf8563_irq。

第61行,调用rtc_register_device函数向系统注册rtc_device,也就是pcf8563。

总结 一下,pcf8563_probe函数的核心就是初始化PCF8563,然后使用上一章讲的RTC驱动框架来设置PCF8563,然后向内核注册。

接下来看一下PCF8563的核心:pcf8563_rtc_ops,内容如下:

pcf8563_rtc_ops

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

pcf8563_rtc_read_time函数

第8行,使用pcf8563_read_block_data函数从PCF8563_REG_ST1寄存器(地址为0X00)开始,连续读取9个寄存器的数据。这样就可以得到PCF8563的控制与状态寄存器1和2,以及事件与日期寄存器的值。

第12行,判断PCF8563的0X02寄存器VL位是否为1,也就是检查PCF8563是否处于低电压模式,事件和日期是否有效。

第28-34行,依次获取PCF8563中的时间和日期值,这里使用bcd2bin函数将原始的BCD值转换为时间值。将获取到的时间和日期打包到参数tm中,tm是个rtc_time结构体指针变量。

第36行,判断0X07寄存器的C位(bit7)的值,此位为1的话表示20xx年,为0的话就是19xx年。

可以看出pcf8563_rtc_read_time函数很简单,就是读取PCF8563内部的时间和日期值,然后将其打包进rtc_time里面。其他的函数大同小异,可以自行分析一下。

至此,PCF8563驱动就简单分析完成了,其他IIC接口的RTC芯片驱动基本都是类似的,可以在实际项目开发中选择合适的RTC芯片。

总结

这里的驱动PCF8563还是比较简单的,因为Linux内核是已经写好了相关驱动的,只要自己在Linux内核配置开启,然后在设备树中添加相应的对应的i2c节点以及GPIO对应的子节点就可以使用了。

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

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

相关文章

Halcon 常用通道Scale灰度元操作整理

一、说明 我们将常见的,基于图层信号幅度的操作集中展现出来,以便以后见到相关的操作不会产生唐突。至于这些算子在项目中的灵活应用,我们将在项目中具体指定。 二、基于数量(Scale)的操作 2.1 亮度(Scale)调整 scale_image_max(Image:ImageScaleMax::)

微信批量添加好友,让你的人脉迅速增长

在这个数字化时代&#xff0c;微信作为中国最流行的社交平台之一&#xff0c;已经成为了人们生活中不可或缺的一部分。它的广泛使用为我们提供了无限的社交可能性。你是否曾为了扩大人脉圈子而犯愁&#xff1f;今天&#xff0c;我将向你揭示一个高效添加微信好友的秘密武器&…

Camtasia2024破解版百度云网盘下载

真的要被录屏软件给搞疯了&#xff0c;本来公司说要给新人做个培训视频&#xff0c;想着把视频录屏一下&#xff0c;然后简单的剪辑一下就可以了。可谁知道录屏软件坑这么多&#xff0c;弄来弄去头都秃了&#xff0c;不过在头秃了几天之后&#xff0c;终于让我发现了一个值得“…

居舍系列再续“异国的相遇2023”艺术项目

跨越四城感知艺术声浪&#xff0c;以科技与艺术探索旅行中的情绪共鸣 太古酒店集团旗下居舍系列再度开启两年一度的艺术项目“异国的相遇 2023”&#xff08;Encounters Across Cultures&#xff09;新篇章 — 当艺术与科技同频 &#xff0c;以艺术为媒介&#xff0c;将科技赋予…

16 用于NOMA IoT网络上行链路安全速率最大化的HAP和UAV协作框架

文章目录 摘要相关模型仿真实验仿真结果 摘要 优化无人机到HAP的信道分配、用户功率和无人机三维位置来研究上行安全传输解决非凸问题&#xff0c;采用K-means聚类算法&#xff0c;将成对的用户划分成不同的组&#xff0c;每个簇可以有相应的无人机服务&#xff0c;然后将构造…

NAT技术与代理服务器

目录 一、NAT与NAPT技术 1.NAT技术 2.NAPT技术 &#xff08;1&#xff09;四元组的唯一性 &#xff08;2&#xff09;数据的传输过程 &#xff08;3&#xff09;NAPT的缺陷 二、代理服务器 1.正向代理和反向代理 2.代理服务器的应用 &#xff08;1&#xff09;游戏加…

16、Python --案例实操:控制台打印【 菱形 】和 【 圆 】

目录 控制台打印菱形控制台打印圆 控制台打印菱形 # 控制台打印菱形# 层数 num 8 # 打印上半部分 for i in range(num):# 第一行if i 0:print( * (num - 1 - i) *)else:print( * (num - 1 - i) * (i * 2 - 1) * *)# 打印下半部分 for i in range(num - 1):if i num …

Qt重定向QDebug,Qt/C++开源作品39-日志输出增强版V2022

Qt重定向QDebug&#xff0c;自定义一个简易的日志管理类 Chapter1 Qt重定向QDebug&#xff0c;自定义一个简易的日志管理类0.前言1.最简单的操作运行结果2.实现一个简易的日志管理类 Chapter2 Qt::Qt Log日志模块Qt Log日志模块官方解释官方Demo思路 Chapter3 QT日志模块的个性…

Vue3 创建项目

1 桌面打开 CMD窗口&#xff0c;使用vue create 项目名创建项目。 2 选择Manually select features 自定义配置 3 选择配置&#xff1a;使用空格确认/取消&#xff0c;回车确定&#xff1a; Babel 降级处理 CSS Pre-processors CSS预处理器 Linter/Formatter 代码检查 4 选择vu…

「滚雪球学Java」:基础程序设计(章节汇总)

&#x1f3c6;本文收录于「滚雪球学Java」专栏&#xff0c;专业攻坚指数级提升&#xff0c;助你一臂之力&#xff0c;带你早日登顶&#x1f680;&#xff0c;欢迎大家关注&&收藏&#xff01;持续更新中&#xff0c;up&#xff01;up&#xff01;up&#xff01;&#xf…

Vue3:将表格数据下载为excel文件

需求 将表格数据或者其他形式的数据下载为excel文件 技术栈 Vue3、ElementPlus、 实现 1、安装相关的库 下载xlsx 和 file-saver 库 npm install -S file-saver npm install -S xlsx引入XLSX库和FileSaver库 import XLSX from xlsx; import FileSaver from file-saver;…

华为OD机考算法题:高效的任务规划

题目部分 题目高效的任务规划难度难题目说明 你有 n 台机器编号为 1 ~ n&#xff0c;每台都需要完成一项工作&#xff0c; 机器经过配置后都能独立完成一项工作。 假设第 i 台机器你需要花 分钟进行设置&#xff0c; 然后开始运行&#xff0c; 分钟后完成任务。 现在&#x…

虹科培训 | 虹科携手PLCopen开展IEC 61131-3国际工程师培训

文章来源&#xff1a;虹科工业控制 阅读原文&#xff1a;https://mp.weixin.qq.com/s/MLYhBWiWx7qQSApx_3xhmA &#xff08;一&#xff09;课程背景 什么是IEC 61131-3&#xff1f; IEC 61131-3 是工业自动化行业唯一得到大量应用的组态编程语言国际标准&#xff1b;主导制定…

安卓端GB28181设备接入模块如何实现实时位置订阅(MobilePosition)

技术背景 实时位置&#xff08;MobilePosition&#xff09;订阅和上报&#xff0c;对GB28281设备接入终端尤其重要&#xff0c;如移动单兵设备、执法记录仪、智能安全帽、车载终端等&#xff0c;Android国标接入设备通过获取到实时经纬度信息&#xff0c;按照一定的间隔上报到…

引入二维码技术,易点易动全员盘点方案助力高效海量资产盘点

固定资产是企业重要的财务资源之一&#xff0c;而高效准确地进行海量固定资产盘点一直是企业管理的重要挑战。为了解决盘点过程中的繁琐和错误问题&#xff0c;易点易动固定资产管理系统引入了先进的二维码技术&#xff0c;并采用全员盘点方案。本文将详细介绍易点易动固定资产…

单目3D目标检测[基于深度辅助篇]

基于深度辅助的方法 1. Pseudo-LiDAR Pseudo-LiDAR from Visual Depth Estimation: Bridging the Gap in 3D Object Detection for Autonomous Driving康奈尔大学https://zhuanlan.zhihu.com/p/52803631 首先利用DRON或PSMNET从单目 (Monocular)或双目 (Stereo)图像获取对应的…

海外公司注册推广的9个实用技巧建议-华媒舍

在全球化的时代背景下&#xff0c;海外市场的开发对于企业来说是非常重要的战略决策。海外公司注册是进入海外市场的第一步&#xff0c;通过注册在海外的公司&#xff0c;企业可以获得更多的商业机会和巨大的价值。本篇文章将为您介绍海外公司注册推广的9个实用建议&#xff0c…

干洗店预约下单管理系统收衣开单拍照必备软件

随着生活水平的提高和节奏的加快&#xff0c;商务人士的衣物越来越多&#xff0c;但精力和时间却越来越少。于是&#xff0c;干洗店应运而生&#xff0c;在中国&#xff0c;几乎所有的中心城市干洗店都门庭若市。若每人每月需要干洗一套服装&#xff0c;一个城市每月则需干洗50…

Postgresql在jdbc处理bit字段的解决方案

问题&#xff1a; bit如果长度为1&#xff0c;则会默认为布尔型&#xff08;1-true 0-false&#xff09;&#xff1b; bit如果长度大于1&#xff0c;则会默认为bit类型&#xff0c;但是代码中以前常用的两种set方式&#xff0c;会报错 第一种方式&#xff1a; ps.setObject(i1,…

vm_flutter

附件地址 https://buuoj.cn/match/matches/195/challenges#vm_flutter 可以在buu下载到。 flutter我也不会&#xff0c;只是这个题目加密算法全部在java层&#xff0c;其实就是一个异或和相加。 反编译 package k;import java.util.Stack;/* loaded from: classes.dex */ pu…