当前位置: 首页 > news >正文

I2C模块理解

I2C模块理解

文章目录

    • I2C模块理解
      • 1.配置I2C
      • 2.信号
      • 3.数据传输
        • 3.1主机发送
        • 3.2主机接收
        • 3.3从机发送
        • 3.4从机接收
      • 4.中断传输
      • 5.Aardvark

1.配置I2C

I2C的特征

  1. 只需要两条公共总线(线)即可控制I2C网络上的任何设备
  2. 无需像UART通信那样事先约定数据传输速率。因此可以根据需要随时调整数据传输速度
  3. 用于验证传输数据的简单机制
  4. 使用7位寻址系统来定位I2C总线上的特定设备
  5. I2C网络易于扩展,新设备可以简单地连接到两条公共I2C总线上
image-20230308132412626

image-20230314101137773

I2C优缺点

1.由于只需要两根电线,I2C 非常适合有许多设备连接在总线上的电路板。这有助于降低成本和电路的复杂性作为额外的设备添加到系统。

2.由于只有两条连接,因此处理寻址和确认的开销会更加复杂。这在简单的配置中可能效率低下,可能首选 SPI 这样的直接链接接口。

2.信号

1.起始信号

I2C协议规定,SCL处于高电平时,SDA由高到低变化,这种信号是起始信号。

2.停止信号

I2C协议规定,SCL处于高电平,SDA由低到高变化,这种信号是停止信号。

image-20230313195217681

3.数据有效性

I2C协议对数据的采样发生在SCL高电平期间,除了起始和停止信号,在数据传输期间,SCL为高电平时,SDA必须保持稳定,不允许改变,在SCL低电平时才可以进行变化。

image-20230313194953080

4.应答信号与非应答信号

应答信号出现在1个字节传输完成之后,即第9个SCL时钟周期内,此时主机需要释放SDA总线,把总线控制权交给从机

如果总线之前为高电平,从机控制总线从高电平到低电平,则为应答信号

如果总线之前为高电平,从机控制总线持续高电平,则为非应答信号

3.数据传输

传输模式SDASCL备注
主机发送模式输出输出主机发送一系列数据到从机。一个开始条件(S),随后一个从机地址,(SLA)+写控制字(W),表示进入主机发送模式。
主机接收模式输入输出主机接收模式中,主机从从机接收一系列数据。一个开始条件(S),随后一个从机地址,(SLA)+读控制字®表示进入主机接收模式。
从机接收模式输入输入从机接收模式中,从机从主机接收一系列数据,进入从机模式前,需设置从机地址
从机发送模式输出输入从机发送模式中,从机发送一系列数据到主机。进入从机模式前,需设置从机地址

I2C 数据传输是以8-bit 进行双向数据传输,标准模式下可达100kbit/s 的传输速率,快速模式可达400kbit/s 的传输速率。

I2C 协议的一个示例。

image-20230314101742837

3.1主机发送

示意图:

image-20230307193159819
void HT_I2C_Master_Transmit(HT_I2C_TypeDef *I2Cx, uint8_t DevAddress, uint8_t *pData, uint16_t Size)
{// 1.查询I2C 控制寄存器中的开始标志位, 如果空闲则生成开始信号, 否则不会生成开始信号HT_I2C_start(I2Cx);                         // 2.查询I2C 控制寄存器中的中断标志位,判断是否置位成功while(HT_I2C_ITFlagStatusGet(I2Cx)==RESET){;}  if(I2Cx == HT_I2C0){// 3.查询I2C 状态寄存器中是否未启动标志  08H -> 起始条件已被发送if(HT_I2C0->I2CSTA == I2C_START){// 4.写入I2C 数据寄存器 从机地址HT_I2C0->I2CDAT = I2C_ADD_WRITE (DevAddress);// 5.清空I2C 控制寄存器中的中断标志位HT_I2C0->I2CCON &= ~I2C_I2CCON_SI; /* Clear the SI bit*/        }else return;// 6.查询I2C 控制寄存器中的中断标志位,判断是否置位成功while(HT_I2C_ITFlagStatusGet(I2Cx)==RESET){;}      // 7.查询I2C 状态寄存器是否回复ACK 0X18H为 SLA+W 已被发送 ACK 已被接收if(HT_I2C0->I2CSTA!= I2C_MASTER_TRANS_ADDR_ACK)     {return;}else{while (Size > 0)  /* send data to slave */{// 8.写入I2C 数据寄存器的值 遍历pData数组HT_I2C0->I2CDAT = *(pData++);  // 9.清空I2C 控制寄存器中的中断标志位                                 HT_I2C0->I2CCON &= ~I2C_I2CCON_SI; /* Clear the SI bit*/        // 10.查询I2C 控制寄存器中的中断标志位,判断是否置位成功while (HT_I2C_ITFlagStatusGet (I2Cx)== RESET) {;}               // 11.查询I2C 状态寄存器是否回复ACK 0X28H为 数据字节已被发送, ACK 已被接收if (HT_I2C0->I2CSTA != I2C_MASTER_TRANS_DATA_ACK)               {return;}}}// 12.清空I2C 控制寄存器中的停止标志位 1:当处于主机模式,则向总线传输停止信号 0:不向总线传输停止信号 当前为主机模式HT_I2C0->I2CCON |= I2C_I2CCON_STO;// 13.清空I2C 控制寄存器中的中断标志位HT_I2C0->I2CCON&= ~I2C_I2CCON_SI;
}

3.2主机接收

image-20230308132802252

void HT_I2C_Master_Receive (HT_I2C_TypeDef *I2Cx,uint8_t DevAddress, uint8_t *pData, uint16_t Size)
{// 1.查询I2C 控制寄存器中的开始标志位, 如果空闲则生成开始信号, 否则不会生成开始信号HT_I2C_Start (I2Cx);        /*Generate start condition*/   // 2.查询I2C 控制寄存器中的中断标志位,判断是否置位成功while (HT_I2C_ITFlagStatusGet (I2Cx)== RESET) {;}          if (I2Cx == HT_I2C0){// 3.查询I2C 状态寄存器中是否未启动标志  08H -> 起始条件已被发送if (HT_I2C0->I2CSTA== I2C_START) /*start condition transmitted*/           {// 4.读取I2C 数据寄存器 从机地址HT_I2C0->I2CDAT = I2C_ADD_READ (DevAddress); /* Send Slave address */   // 5.清空I2C 控制寄存器中的中断标志位HT_I2C0->I2CCON &= ~I2C_I2CCON_SI; /* Clear the SI bit*/                }else return;// 6.查询I2C 控制寄存器中的中断标志位,判断是否置位成功while (HT_I2C_ITFlagStatusGet (I2Cx)== RESET) {;}   // 7.查询I2C 状态寄存器是否  40H SLA+R 已被发送; ACK 已被接收        if (HT_I2C0->I2CSTA!= I2C_MASTER_RCV_ADDR_ACK)              {return;}else{while (Size >0){// 8.将获取到的数据放入数组pData中*(pData++) = HT_I2C0->I2CDAT ;          /* 获取数据*/             // 9.清空I2C 控制寄存器中的中断标志位HT_I2C0->I2CCON &= ~I2C_I2CCON_SI;      /* Clear the SI bit*/   // 10.查询I2C 控制寄存器中的中断标志位,判断是否置位成功while (HT_I2C_ITFlagStatusGet (I2Cx)== RESET) {;}               // 11. 50H 数据字节已被接收;已返回ACKif (HT_I2C0->I2CSTA != I2C_MASTER_RCV_DATA_ACK)                 {return;}}}HT_I2C0->I2CCON |= I2C_I2CCON_STO;  /*Generate STOP condition*/HT_I2C0->I2CCON &= ~I2C_I2CCON_SI;  /* Clear the SI bit*/}

3.3从机发送

image-20230308132908113

void HT_I2C_Slave_Transmit(HT_I2C_TypeDef *I2Cx,uint8_t *pData, uint16_t Size)
{if (I2Cx==HT_I2C0){// 1.查询I2C 控制寄存器中的中断标志位,清除中断标志HT_I2C0->I2CCON &= ~I2C_I2CCON_SI; /* Clear the SI bit*/    // 2.查询I2C 控制寄存器中的中断标志位,判断是否置位成功while(HT_I2C_ITFlagStatusGet(I2Cx)==RESET){;}               // 3.A8H 自身SLA+R 已被接收;已返回ACKif(HT_I2C0->I2CSTA == I2C_SLAVE_TRANS_ADDR_ACK)             {// 4.发送数据到接收器while(Size >0) /* send data to slave */                 {// 5.写入I2C 数据寄存器的值 遍历pData数组HT_I2C0->I2CDAT = *(pData++);      // 6.查询I2C 控制寄存器中的中断标志位,清除中断标志                HT_I2C0->I2CCON &= ~I2C_I2CCON_SI;     // 7.查询I2C 控制寄存器中的中断标志位,判断是否置位成功            while(HT_I2C_ITFlagStatusGet(I2Cx)==RESET){;}    // 8.B8H 数据字节已被发送;ACK 已被接收  if (HT_I2C0->I2CSTA != I2C_SLAVE_TRANS_DATA_ACK)   {return;}}}else return;}
}

3.4从机接收

image-20230308132954141

void HT_I2C_Slave_Receive(HT_I2C_TypeDef *I2Cx,uint8_t *pData, uintl6_t Size)
{if (I2Cx== HT_I2C0){// 1.查询I2C 控制寄存器中的中断标志位,清除中断标志HT_I2C0->I2CCON &= ~I2C_I2CCON_SI; /* Clear the SI bit*/// 2.查询I2C 控制寄存器中的中断标志位,判断是否置位成功while(HT_I2C_ITFlagStatusGet(I2Cx)==RESET){;}// 3.60H 自身的SLA+W 已被接收;已返回ACKif(HT_I2C0->I2CSTA == I2C_SLAVE_RCV_ADDR_ACK){// 4.发送数据到接收器while(Size >0) /* send data to slave */{// 5.写入I2C 数据寄存器的值 遍历pData数组*(pData++) = HT_I2C0->I2CDAT;// 6.查询I2C 控制寄存器中的中断标志位,清除中断标志HT_I2C0->I2CCON &= ~I2C_I2CCON_SI;// 7.查询I2C 控制寄存器中的中断标志位,判断是否置位成功while(HT_I2C_ITFlagStatusGet(I2Cx)==RESET){;}// 8.80H 自身SLV 地址已被寻址;DATA 字节已被接收; 已返回ACKif (HT_I2C0->I2CSTA != I2C_SLAVE_RCV_DATA_ACK){return;}}}else return;}}

4.中断传输

对I2C总线来说工作在中断和非中断模式在时序上是相同的,只不过在非中断模式下是通过检测ACK信号来判断从设备响应了,在中断模式下是通过中断信号来判断从设备响应了,一般是读主CPU侧的I2C控制器的中断标志来判断的。

5.Aardvark

1.aardvark适配器为发送器接口函数

# 1.设置比特率
Set Bitrate (aa_i2c_bitrate)
# 2.从 I2C 从设备读取字节流。
Master Read (aa_i2c_read)
# 3.从具有扩展状态信息的 I2C 从设备读取字节流
Master Read Extended (aa_i2c_read_ext)
# 4.向 I2C 从设备写入字节流。
Master Write (aa_i2c_write)
# 5.向具有扩展状态信息的 I2C 从设备写入字节流。
Master Write Extended (aa_i2c_write_ext)
# 6.向 I2C 从设备写入一个字节流,然后从同一个从设备读取。
Master Write-Read (aa_i2c_write_read)

2.aardvark适配器为接收器接口函数

# 1.启用 Aardvark 适配器作为 I2C 从设备。
Slave Enable (aa_i2c_slave_enable)
# 2.禁用 Aardvark 适配器作为 I2C 从设备。
Slave Disable (aa_i2c_slave_disable)
# 3.在 Aardvark 适配器进入从模式并由主服务器联系的情况下设置从服务器响应。
Slave Set Response (aa_i2c_slave_set_response)
# 4.返回从以前的 Aardvark I2C 从节写入到 I2C 主传输的字节数。
Slave Write Statistics (aa_i2c_slave_write_stats)
# 5.返回从以前的 Aardvark I2C 从服务器写入到具有扩展状态信息的 I2C 主传输的字节数。
Slave Write Statistics Extended (aa_i2c_slave_write_stats_ext)
# 6.从 I2C 从接收机读取字节。
Slave Read (aa_i2c_slave_read)
# 7.从具有扩展状态信息的 I2C 从接收机读取字节。
Slave Read Extended (aa_i2c_slave_read_ext)

3.使用方式

# 1.打开Aardvark端口
handle = aa_open(port)
if handle <= 0:print("Unable to open Aardvark device on port %d" % port)print("Error code = %d" % handle)sys.exit()# 2.激活/关闭各个子系统(I2C,SPI,GPIO)
aa_configure(handle, AA_CONFIG_SPI_I2C)  # 3.启动/关闭 SCL 和 SDA 上的 I2C 上拉电阻器
aa_i2c_pullup(handle, AA_I2C_PULLUP_BOTH)  # Power the EEPROM using the Aardvark adapter's power supply.
# 4.激活/关闭目标电源插脚4和6
aa_target_power(handle, AA_TARGET_POWER_BOTH)  # 5.将 I2C 比特率设置为kHz
bitrate = aa_i2c_bitrate(handle, bitrate)  
print("Bitrate set to %d kHz" % bitrate)# Set the bus lock timeout
# 6.以毫秒为单位设置 I2C 总线锁定超时
bus_timeout = aa_i2c_bus_timeout(handle, BUS_TIMEOUT)  
print("Bus lock timeout set to %d ms" % bus_timeout)# Perform the operation
if command == "write":_writeMemory(handle, device, addr, length, 0)  # 7.向 I2C 从设备写入字节流  地址、字节长度、FLAG、指向数据的指针print("Wrote to EEPROM")elif command == "read":_readMemory(handle, device, addr, length)  # 8.从 I2C 从设备读取字节流  地址、字节长度、FLAG、指向数据的指针

信号线:

image-20230314160048660

  1. SCL
  2. GND
  3. SDA
  4. NC/+5V
  5. MISO
  6. NC/+5V
  7. SCLK
  8. MOSI
  9. SS
  10. GND

疑问:

1.为什么每次执行程序之前都要清楚中断标志?

参考文档:

(43条消息) IIC中断和非中断模式_i2c 中断模式_退5不落5的博客-CSDN博客

(43条消息) 轮询和中断的区别,中断上下文_小翅小排的博客-CSDN博客

https://www.totalphase.com/support/articles/200468316#s5.5

https://pyaardvark.readthedocs.io/en/latest/intro.html#on-pyaardvark-datatypes

I2C通信基础知识:硬件、数据传输、配置 (enroo.com)

(51条消息) STM32F767+STM32CubeMX I2C通信读写EEPROM数据(采用轮询、DMA、中断三种方式)_stm32cubemx配置iic总线读写eeprom代码_LI++的博客-CSDN博客

(61条消息) Arduino UNO向AT24C02写入数据IIC完整通讯过程详解_at24c02写数据流程图_perseverance52的博客-CSDN博客

(61条消息) I2C通信协议详解-CSDN博客

相关文章:

I2C模块理解

I2C模块理解 文章目录I2C模块理解1.配置I2C2.信号3.数据传输3.1主机发送3.2主机接收3.3从机发送3.4从机接收4.中断传输5.Aardvark1.配置I2C I2C的特征 只需要两条公共总线&#xff08;线&#xff09;即可控制I2C网络上的任何设备无需像UART通信那样事先约定数据传输速率。因此…...

手把手教你使用--常用模块--HC05蓝牙模块,无线蓝牙串口透传模块,(实例:手机蓝牙控制STM32单片机点亮LED灯)

最近在学STM32&#xff0c;基本的学完了&#xff0c;想学几个模块来巩固一下知识&#xff0c;就想到了蓝牙模块。玩啥好难过有很多博客教怎么连的&#xff0c;但自己看起来还是有点糊涂。模块的原理和知识点我就不讲解了&#xff0c;这里我主要手把手记录一下我是如何对蓝牙模块…...

MyBatis高频面试题

目录 1、Mybatis中#和$的区别 2、Mybatis的编程步骤是什么样的 3...

Redis基础篇

redis的三大特点&#xff1a; 支持多数据类型&#xff0c;支持持久化&#xff0c;单线程 多路IO复用 对键操作的命令&#xff1a; keys * 查看当前库所有key exists key 判断key是否存在 del key 删除 unlink key 非阻塞删除&#xff0c;异步删除 expire key …...

unity的C#学习——静态常量和动态常量的定义与使用

定义常量 在C#中&#xff0c;常量是一种不可改变的量&#xff0c;一旦被定义&#xff0c;其值就不能被修改。C#中有两种类型的常量&#xff0c;静态常量和动态常量。 1、静态常量的定义 静态常量是在编译时就已经确定其值的常量&#xff0c;使用const关键字定义。由于在编译…...

栈----数据结构

栈&#x1f506;栈的概念&#x1f506;栈的结构&#x1f506;栈的实现&#x1f506;括号匹配问题&#x1f506;结语&#x1f506;栈的概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。**进行数据插入和删除操作的一端称为栈顶&am…...

【人人都能读标准】11. 原理篇总结:一个程序的完整执行过程

本文为《人人都能读标准》—— ECMAScript篇的第11篇。我在这个仓库中系统地介绍了标准的阅读规则以及使用方式&#xff0c;并深入剖析了标准对JavaScript核心原理的描述。 我们一路走了很远很远&#xff0c;终于到了本书原理篇的最后一站。 在原理篇中&#xff0c;我们先讲了…...

sheng的学习笔记-IO多路复用,NIO,BIO,AIO

基础概念IO分为几种&#xff1a;同步阻塞的BIO&#xff0c;同步非阻塞的NIO&#xff0c;异步非阻塞AIO&#xff0c;IO多路复用&#xff0c;信号驱动IO&#xff08;不常用&#xff09;对于一个network IO&#xff0c;它会涉及到两个系统对象&#xff0c;一个是调用这个IO的proce…...

【Python入门第三十五天】Python丨文件打开

在服务器上打开文件 假设我们有以下文件&#xff0c;位于与 Python 相同的文件夹中。 demofile.txt Hello! Welcome to demofile.txt This file is for testing purposes. Good Luck!如需打开文件&#xff0c;请使用内建的 open() 函数。 open() 函数返回文件对象&#xff…...

jsoup 框架的使用指南

概述 参考&#xff1a; 官方文档jsoup的使用JSoup教程jsoup 在 GitHub 的开源代码 概念简介 jsoup 是一款基于 Java 的 HTML 解析器&#xff0c;它提供了一套非常省力的 API&#xff0c;不但能直接解析某个 URL 地址、HTML 文本内容&#xff0c;而且还能通过类似于 DOM、CS…...

web前端开发和后端开发哪个难度大?

前言 因为涉及到的具体的应用的领域不同&#xff0c;所以说不能简单地说哪一个难&#xff0c;对于前端而言你会感觉到入门会非常的简单&#xff0c;这也是会给许多人一种错觉&#xff0c;前端很简单&#xff0c;但是只能说是在入门理解上是有利于新手的&#xff0c;前端在主要…...

认证与认可之间有什么区别和联系?

认证与认可之间有什么区别和联系&#xff1f; 当今社会&#xff0c;认证与认可已经深入企业的生活&#xff0c;那么认证与认可之间到底有什么区别和联系呢&#xff1f; 认证&#xff0c;是指由认证机构证明产品、服务、管理体系符合相关技术规范、相关技术规范的强制性要求或者…...

【Java|golang】1626. 无矛盾的最佳球队---最长子序列,不连续,二维数组排序

假设你是球队的经理。对于即将到来的锦标赛&#xff0c;你想组合一支总体得分最高的球队。球队的得分是球队中所有球员的分数 总和 。 然而&#xff0c;球队中的矛盾会限制球员的发挥&#xff0c;所以必须选出一支 没有矛盾 的球队。如果一名年龄较小球员的分数 严格大于 一名…...

C++ 八股文(简单面试题)

1.左值 可寻址变量&#xff0c;持久性&#xff1b; 2.右值 没有变量名&#xff0c;不可寻址&#xff0c;短暂性&#xff1b; 3.指针 指向的内存地址&#xff0c;指针变量存储的就是指向的对象的首地址 4.引用 为一个变量起别名&#xff0c;定义引用的时候一定要初始化&a…...

RK3588平台开发系列讲解(显示篇)DP显示调试方法

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、查看 connector 状态二、强制使能/禁⽤ DP三、DPCP 读写四、Type-C 接口 Debug五、查看 DP 寄存器六、查看 VOP 状态七、查看当前显示时钟八、调整 DRM log 等级沉淀、分享、成长,让自己和他人都能有所收获!😄…...

模拟请求发生跨域问题

参考&#xff1a;传送门 问题产生&#xff1a; Access to XMLHttpRequest at ‘http://test-cms.jinhuahuolong.com/api/pages/list’ from origin ‘null’ has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resourc…...

Qt实践项目:仿Everything软件实现一个QtEverything

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的在读研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧&#xff0c;喜欢的小伙伴给个三…...

WEB网站服务(一)

1.1 Apache网站服务基础1.1.1Apache简介Apache HTTP Server是开源软件项目的杰出代表&#xff0c;基于标准的HTTP网络协议提供网页浏览服务。Apache服务器可以运行在Linux,UNIX&#xff0c;windows等多种操作系统平台中。1.Apache的起源1995年&#xff0c;Apache服务程序的1.0版…...

Python数据分析script必备知识(一)

Python数据分析script必备知识(一) 1.重定向终端输出内容 使生成的结果移动到其他位置 # 重定向, 使生成的结果移动到其他位置 import syssys.stderr = sys.stdoutprint(dir(sys)) # ,,,,,__stderr__, __stdin__, __stdout__,,,,,,# 使用场景:脚本上线时,想要把输出结果…...

初识linux之管道

一、进程间通信的概念大家都知道&#xff0c;进程是具有独立性的&#xff0c;因为一个程序运行起来生成进程时&#xff0c;也会生成它的进程结构体&#xff0c;即PCB&#xff0c;然后然后通过进程结构体中的结构体指针找到它的虚拟地址空间&#xff0c;然后再通过它的页表映射到…...

C++成神之路 | 第一课【步入C++的世界】

目录 一、认识C++ 1.1、关于 C++ 1.2、C++的前世今生 1.2.1、C+...

【面试题】大厂面试官:你做过什么有亮点的项目吗?

大厂面试题分享 面试题库前后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★地址&#xff1a;前端面试题库前言大厂面试中除了问常见的算法网络基础&#xff0c;和一些八股文手写体之外&#xff0c;经常出现的一个问题就是&#xff0c;你做过什么项目…...

Springboot Long类型数据太长返回给前端,精度丢失问题 复现、解决

前言 惯例&#xff0c;收到兄弟求救&#xff0c;关于long类型丢失精度的问题&#xff1a; 存在一个初学者不会&#xff0c;就会有第二个初学者不会&#xff0c;所以我出手。 正文 不多说&#xff0c;开搞。 如题&#xff0c; 后端返回的数据 给到 前端&#xff0c; Long类型数…...

Anaconda虚拟环境的创建方法(命令创建)

虚拟环境介绍&#xff1a; 虚拟环境是一为某个项目创建的专属于它的python包&#xff0c;因此做python项目时&#xff0c;一般一个项目用一个虚拟环境。在实际开发中&#xff0c;如果项目A需要某个包的1.0版本&#xff0c;项目B需要此包的2.0版本。如果没有安装虚拟环境&#…...

数据结构——树与二叉树

作者&#xff1a;几冬雪来 时间&#xff1a;2023年3月22日 内容&#xff1a;数据结构树与二叉树的讲解&#xff08;介绍&#xff09; 目录 前言&#xff1a; 1.树的概念&#xff1a; 2.树与非树&#xff1a; 3.树的定义&#xff1a; 4.树的应用&#xff1a; 二叉树&…...

vue后台管理系统

后面可参考下&#xff1a;vue系列&#xff08;三&#xff09;——手把手教你搭建一个vue3管理后台基础模板 以下代码项目gitee地址 文章目录1. 初始化前端项目初始化项目添加加载效果配置 vite.config.js2. 使用路由安装路由配置路由配置别名和跳转安装pathvite.config.jsjsco…...

spring boot 集成 postgis jar

要将 PostGIS 集成到 Spring Boot 应用程序中,需要按照以下步骤进行操作:1. 将 PostGIS JDBC 驱动程序添加到项目依赖项中。可以在 Maven 或 Gradle 中添加以下依赖项:Maven:```xml <dependency><groupId>org.postgresql</groupId><artifactId>pos…...

【Java进阶篇】——反射机制

一、反射的概念 1.1 反射出现的背景 Java程序中&#xff0c;所有对象都有两种类型&#xff1a;编译时类型和运行时类型&#xff0c;而很多时候对象的编译时类型和运行时类型不一致 Object obj new String("hello")、obj.getClass(); 如果某些变量或形参的声明类型…...

Oracle中含有recover 状态的数据文件环境中,做异机恢复

背景&#xff1a; 我们在一些恢复测试案例中&#xff0c;会经常遇到一些奇怪的问题&#xff0c;其中有的是源端数据文件不规范而导致恢复过程出错&#xff0c;比较常见的错误有&#xff1a; 数据文件名称重复&#xff08;如&#xff1a;/oradata1/user01.dbf 和 /oradata2/us…...

图像识别模型

一、数据准备 首先要做一些数据准备方面的工作&#xff1a;一是把数据集切分为训练集和验证集&#xff0c; 二是转换为tfrecord 格式。在data_prepare&#xff0f;文件夹中提供了会用到的数据集和代码。首先要将自己的数据集切分为训练集和验证集&#xff0c;训练集用于训练模型…...