STM32 HAL库 STM32CubeMX -- I2C(IIC)

2023-05-16

文章目录

  • 一、I2C 协议简介
    • I2C 物理层
    • I2C协议层
    • I2C架构
    • 通讯过程
  • 二、STM32Cube MX配置
  • 三、I2C HAL库函数


一、I2C 协议简介

I2C 通讯协议(Inter - Integrated Circuit) 也就是IIC;

由Phiilps 公司开发的,它引脚少,硬件实现简单,可扩展性强,不需要USART、CAN 等通讯协议的外部收发设备。

I2C协议分为物理层和协议层。

物理层规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输。

协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准。

简单来说物理层规定我们用嘴巴还是用肢体来交流,协议层则规定我们用中文还是英文来交流。

I2C 物理层

I2C

I2C的物理层有如下特点:

(1) 它是一个支持设备的总线。“总线”指多个设备共用的信号线。在一个I2C 通讯总线中,可连接多个I2C 通讯设备,支持多个通讯主机及多个通讯从机。

(2) 一个I2C 总线只使用两条总线线路,一条双向串行数据线(SDA) ,一条串行时钟线(SCL)。数据线即用来表示数据,时钟线用于数据收发同步。

(3) 每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址进行不同设备之间的访问。

(4) 总线通过上拉电阻接到电源。当I2C 设备空闲时,会输出高阻态,而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平。

(5) 多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线。

(6) 具有三种传输模式:标准模式传输速率为100kbit/s ,快速模式为400kbit/s ,高速模式下可达3.4Mbit/s, 但目前大多I2C 设备尚不支持高速模式。

(7) 连接到相同总线的IC 数量受到总线的最大电容400pF 限制。

I2C协议层

I2C 的协议定义了通讯的起始和停止信号、数据有效性、响应、仲裁、时钟同步和地址广播等环节。

主机写数据到从机(写数据)
主机写数据到从机

广播完地址,接收到应答信号后,主机开始正式向从机传输数据(DATA),数据包的大小为8 位,主机每发送完一个字节数据;

要等待从机的应答信号(ACK),重复这个过程,可以向从机传输N 个数据,这个N 没有大小限制;

当数据传输结束时,主机向从机发送一个停止传输信号§,表示不再传输数据;

主机由从机中读数据(读数据)

主机由从机中读数据

广播完地址,接收到应答信号后,从机开始向主机返回数据(DATA),数据包大小也为8 位,从机每发送完一个数据;

等待主机的应答信号(ACK),重复这个过程,可以返回N 个数据,这个N 也没有大小限制;

当主机希望停止接收数据时,就向从机返回一个非应答信号(NACK),则从机自动停止数据传输。

通讯复合格式(读和写数据)

通讯复合

I2C 通讯常用的是复合格式

该传输过程有两次起始信号(S)。一般在第一次传输中,主机通过SLAVE_ADDRESS 寻找到从设备后,发送一段“数据”,这段数据通常用于表示从设备内部的寄存器或存储器地址(注意区分它与SLAVE_ADDRESS 的区别);

在第二次的传输中,对该地址的内容进行读或写。也就是说,第一次通讯是告诉从机读写地址,第二次则是读写的实际内容。

通讯的起始和停止信号

通讯的起始和停止信号

当SCL 线是高电平时SDA线从高电平向低电平切换,这个情况表示通讯的起始。
当SCL 是高电平时SDA 线由低电平向高电平切换,表示通讯的停止。

起始和停止信号一般由主机产生。

数据有效性

数据有效性

I2C 使用SDA 信号线来传输数据,使用SCL 信号线进行数据同步。

SDA 数据线在SCL 的每个时钟周期传输一位数据。
传输时,SCL 为高电平的时候SDA 表示的数据有效,即此时的SDA 为高电平时表示数据“1”,为低电平时表示数据“0”。
当SCL 为低电平时,SDA 的数据无效,一般在这个时候SDA 进行电平切换,为下一次表示数据做好准备。

每次数据传输都以字节为单位,每次传输的字节数不受限制。

地址及数据方向

地址及数据方向

I2C 总线上的每个设备都有自己的独立地址,主机发起通讯时,通过SDA 信号线发送设备地址(SLAVE_ADDRESS) 来查找从机。

I2C 协议规定设备地址可以是7 位或10 位。

紧跟设备地址的一个数据位用来表示数据传输方向,它是数据方向位(R/),第8位或第11 位。数据方向位为“1”时表示主机由从机读数据,该位为“0”时表示主机向从机写数据。

读数据方向时,主机会释放对SDA 信号线的控制,由从机控制SDA 信号线,主机接收信号,写数据方向时,SDA 由主机控制,从机接收信号。

响应

响应

I2C 的数据和地址传输都带响应。

响应包括“应答(ACK)”和“非应答(NACK)”两种信号。

作为数据接收端时,当设备(无论主从机) 接收到I2C 传输的一个字节数据或地址后,若希望对方继续发送数据,则需要向对方发送“应答(ACK)”信号,发送方会继续发送下一个数据;
若接收端希望结束数据传输,则向对方发送“非应答(NACK)”信号,发送方接收到该信号后会产生一个停止信号,结束信号传输。

传输时主机产生时钟,在第9 个时钟时,数据发送端会释放SDA 的控制权,由数据接收端控制SDA,若SDA 为高电平,表示非应答信号(NACK),低电平表示应答信号(ACK)。

I2C架构

STM32 的I2C 外设可用作通讯的主机及从机,支持100Kbit/s 和400Kbit/s 的速率,支持7 位、10位设备地址,支持DMA 数据传输,并具有数据校验功能。它的I2C 外设还支持SMBus2.0 协议。

I2C架构

通讯引脚

I2C 的所有硬件架构都是根据图中左侧SCL 线和SDA 线展开的(其中的SMBA 线用于SMBUS 的警告信号,I2C 通讯没有使用)。

STM32 芯片有多个I2C 外设,它们的I2C 通讯信号引出到不同的GPIO 引脚上,使用时必须配置到这些指定的引脚。

引脚I2C1I2C2
SCLPB6 / PB8(重映射)PB10
SDAPB7 / PB9(重映射)PB11

时钟控制逻辑

SCL 线的时钟信号,由I2C 接口根据时钟控制寄存器(CCR) 控制,控制的参数主要为时钟频率。

配置I2C 的CCR 寄存器可修改通讯速率相关的参数:
I2C 通讯的 “标准/快速”模式,这两个模式分别I2C 对应100/400Kbit/s 的通讯速率。
快速模式下可选择SCL 时钟的占空比,可选Tlow/Thigh=2 或Tlow/Thigh=16/9 模式,我们知道I2C 协议在SCL 高电平时对SDA 信号采样,SCL 低电平时SDA 准备下一个数据,修改SCL 的高低电平比会影响数据采样,但其实这两个模式的比例差别并不大。

CCR 寄存器中还有一个12 位的配置因子CCR,它与I2C 外设的输入时钟源共同作用,产生SCL 时钟,STM32 的I2C 外设都挂载在APB1 总线上,使用APB1 的时钟源PCLK1,SCL信号线的输出时钟公式如下:

标准模式:

Thigh=CCRTPCKL1 Tlow = CCRTPCLK1
快速模式中Tlow/Thigh=2 时:
Thigh = CCRTPCKL1 Tlow = 2CCRTPCKL1
快速模式中Tlow/Thigh=16/9 时:
Thigh = 9
CCRTPCKL1 Tlow = 16CCR*TPCKL1

例如,我们的PCLK1=36MHz,想要配置400Kbit/s 的速率,计算方式如下:
PCLK 时钟周期:TPCLK1 = 1/36000000
目标SCL 时钟周期:TSCL = 1/400000
SCL 时钟周期内的高电平时间:THIGH = TSCL/3
SCL 时钟周期内的低电平时间:TLOW = 2*TSCL/3
计算CCR 的值:CCR = THIGH/TPCLK1 = 30

计算结果得出CCR 为30,向该寄存器位写入此值则可以控制IIC 的通讯速率为400KHz。

数据控制逻辑

I2C 的SDA 信号主要连接到数据移位寄存器上,数据移位寄存器的数据来源及目标是数据寄存器(DR)、地址寄存器(OAR)、PEC 寄存器以及SDA 数据线。

当向外发送数据的时候,数据移位寄存器以“数据寄存器”为数据源,把数据一位一位地通过SDA 信号线发送出去;当从外部接收数据的时候,数据移位寄存器把SDA 信号线采样到的数据一位一位地存储到“数据寄存器”中。

若使能了数据校验,接收到的数据会经过PCE 计算器运算,运算结果存储在“PEC 寄存器”中。

当STM32 的I2C 工作在从机模式的时候,接收到设备地址信号时,数据移位寄存器会把接收到的地址与STM32 的自身的“I2C 地址寄存器”的值作比较,以便响应主机的寻址。

STM32 的自身I2C 地址可通过修改“自身地址寄存器”修改,支持同时使用两个I2C 设备地址,两个地址分别存储在OAR1 和OAR2 中。

整体控制逻辑

整体控制逻辑负责协调整个I2C 外设,控制逻辑的工作模式根据我们配置的“控制寄存器(CR1/CR2)”的参数而改变。

在外设工作时,控制逻辑会根据外设的工作状态修改“状态寄存器(SR1 和SR2)”,我们只要读取这些寄存器相关的寄存器位,就可以了解I2C 的工作状态。

除此之外,控制逻辑还根据要求,负责控制产生I2C 中断信号、DMA 请求及各种I2C 的通讯信号(起始、停止、响应信号等)。

通讯过程

使用I2C 外设通讯时,在通讯的不同阶段它会对“状态寄存器(SR1 及SR2)”的不同数据位写入参数,我们通过读取这些寄存器标志来了解通讯状态。

主发送器

主发送器

主发送器发送流程:

(1) 控制产生起始信号(S),当发生起始信号后,它产生事件“EV5”,并会对SR1 寄存器的“SB”位置1,表示起始信号已经发送;

(2) 紧接着发送设备地址并等待应答信号,若有从机应答,则产生事件“EV6”及“EV8”,这时SR1 寄存器的“ADDR”位及“TXE”位被置1,ADDR 为1 表示地址已经发送,TXE 为1 表示数据寄存器为空;

(3) 以上步骤正常执行并对ADDR 位清零后,我们往I2C 的“数据寄存器DR”写入要发送的数据,这时TXE 位会被重置0,表示数据寄存器非空,I2C 外设通过SDA 信号线一位位把数据发送出去后,又会产生“EV8”事件,即TXE 位被置1,重复这个过程,就可以发送多个字节数据了;

(4) 当我们发送数据完成后,控制I2C 设备产生一个停止信号§,这个时候会产生EV8_2 事件,SR1 的TXE 位及BTF 位都被置1,表示通讯结束。
假如我们使能了I2C 中断,以上所有事件产生时,都会产生I2C 中断信号,进入同一个中断服务函数,到I2C 中断服务程序后,再通过检查寄存器位来判断是哪一个事件。

主接收器

主接收器

主接收器接收流程:

(1) 同主发送流程,起始信号(S) 是由主机端产生的,控制发生起始信号后,它产生事件“EV5”,并会对SR1 寄存器的“SB”位置1,表示起始信号已经发送;

(2) 紧接着发送设备地址并等待应答信号,若有从机应答,则产生事件“EV6”这时SR1 寄存器的“ADDR”位被置1,表示地址已经发送。

(3) 从机端接收到地址后,开始向主机端发送数据。当主机接收到这些数据后,会产生“EV7”事件,SR1 寄存器的RXNE 被置1,表示接收数据寄存器非空,我们读取该寄存器后,可对数据寄存器清空,以便接收下一次数据。此时我们可以控制I2C 发送应答信号(ACK) 或非应答信号(NACK),若应答,则重复以上步骤接收数据,若非应答,则停止传输;

(4) 发送非应答信号后,产生停止信号( P ),结束传输。

在发送和接收过程中,有的事件不只是标志了我们上面提到的状态位,还可能同时标志主机状态之类的状态位,而且读了之后还需要清除标志位,比较复杂。

二、STM32Cube MX配置

IIC

STM32的I2C协议也支持SMBus模式(一般用于笔记本电池管理)

Master features  主模式特性
I2C Speed Mode: IIC模式设置 快速模式和标准模式。
I2C Clock Speed: I2C传输速率,默认为100KHz

Slave features  从模式特性
Clock No Stretch Mode: 时钟没有扩展模式

	IIC时钟拉伸(Clock stretching)
	clock stretching通过将SCL线拉低来暂停一个传输.直到释放SCL线为高电平,传输才继续进行.
	clock stretching是可选的,实际上大多数从设备不包括SCL驱动,所以它们不能stretch时钟.

Primary Address Length selection: 从设备地址长度 设置从设备的地址是7bit还是10bit 大部分为7bit
Dual Address Acknowledged: 双地址确认
Primary slave address:  从设备初始地址

三、I2C HAL库函数

 //IIC写函数
 HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);
功能:HAL库 IIC写数据
参数:
*hi2c 设置使用的IIC 名称 例:&hi2c1
DevAddress 写入的地址 例 0xA0
*pData 需要写入的数据的地址
Size 要发送的字节数
Timeout 最大传输时间,超过传输时间将自动退出传输函数

//示例: HAL_I2C_Master_Transmit(&hi2c1,0xA0,(uint8_t*)tx_data,100,1000);

//IIC读函数
HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);
功能:HAL库 IIC读一个字节
参数:
*hi2c: 设置使用的是那个IIC 名称 例:&hi2c1
DevAddress: 读取的地址 例 0xA0
*pData: 存储读取到的数据的地址
Size: 接收的字节数
Timeout: 最大读取时间,超过时间将自动退出读取函数

//示例: HAL_I2C_Master_Receive(&hi2c1,0xA0,(uint8_t*)rx_data,100,1000);

HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout);
功能:HAL库 IIC写数据函数
参数: 
*hi2c: 设置使用的是那个IIC 名称 例:&hi2c1
DevAddress: 从机设备地址 
MemAddress:从机寄存器地址
MemAddSize:从机寄存器地址长度
*pData: 存储读取到的数据的地址
Size: 接收的字节数
Timeout: 最大读取时间,超过时间将自动退出写入函数

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32 HAL库 STM32CubeMX -- I2C(IIC) 的相关文章

  • STM32F4 通过软复位跳转到引导加载程序,无需 BOOT0 和 BOOT1 引脚

    我问这个问题是因为可以在这里找到类似问题的答案 通过应用程序跳转到 STM32 中的引导加载程序 即从用户闪存在引导模式下使用引导 0 和引导 1 引脚 用户 JF002 JF002回答 当我想跳转到引导加载程序时 我在其中一个备份寄存器中
  • [MM32硬件]搭建灵动微MM32G0001A6T的简易开发环境

    作为学习单片机的经典 自然是通过GPIO点亮LED 或者是响应按钮的外部中断例程 这我们看看SOP8封装的芯片MM32G0001A6T得引脚 除了VDD和GND固定外 我们可以使用PA14 PA1 PA13 PA15 PA2 PA3这六个G
  • 硬件基础-电容

    电容 本质 电容两端电压不能激变 所以可以起到稳定电压作用 充放电 电容量的大小 想使电容容量大 使用介电常数高的介质 增大极板间的面积 减小极板间的距离 品牌 国外 村田 muRata 松下 PANASONIC 三星 SAMSUNG 太诱
  • 解决KEIL编译慢问题

    两种方案 使用v6版本的ARM Compiler 如果v6版本编译不过 必须使用v5版本的 则可以勾选掉Browse Information选项 提升很明显 1分多钟能优化到几秒 看代码量 但是这个有个弊端 在KEIL中会影响函数跳转 建议
  • STM32的HAL中实现单按、长按和双按功能

    我正在尝试实现单击 双击和长按功能来执行不同的功能 到目前为止 我已经理解了单击和长按的逻辑 但我不知道如何检测双击 至于代码 我使用计数器实现了单击和长按 但代码仅停留在第一个 if 条件上 bool single press false
  • 无法使用 OpenOCD 找到脚本文件

    我正在尝试按照本教程将 OpenOCD 与我的 ST 发现板一起使用 https japaric github io discovery README html https japaric github io discovery READM
  • 毕设开题分享 单片机智能教室系统(智能照明+人数统计)

    1 简介 Hi 大家好 今天向大家介绍一个学长做的单片机项目 单片机智能教室系统 智能照明 人数统计 大家可用于 课程设计 或 毕业设计 项目分享 https gitee com feifei1122 simulation project
  • Windows IoT 和 DS3231 RTC 时钟

    对于我的项目 我需要当前时间和日期 不幸的是 当 RP2 关闭时 它就会失去一切 接下来的事情是 我将没有互联网连接来使用 NTP 为此 我需要实现 DS3231 RTC 模块 所有设备的通信都通过 I2C 运行 Raspberry Ard
  • CMSIS & STM32,如何开始? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在 STM32 上使用 CMSIS 启动项目 网上一搜 没找到具体的教程 有些使用 SPL 开始项
  • STM32F4XX的12位ADC采集数值超过4096&右对齐模式设置失败

    文章目录 一 前言 二 问题1 数值超过4096 三 问题1的排错过程 四 问题2 右对齐模式设置失败 五 问题2的解决方法 5 1 将ADC ExternalTrigConv设置为0 5 2 使用ADC StructInit 函数 一 前
  • 是什么让 SPI 比 I2C 协议更快 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我了解 I2C 和 SPI 通信的基础知识 因为两者都是同步协议 我想知道是什么让 SPI 比 I2C 更快 如果我没记错的话 使用 I2
  • 通过JTAG恢复STM32 MCU磨掉的标记

    我有一块可能带有 STM32 MCU 的板 我想为该板制作定制固件 因为库存板有很多问题 不幸的是 电路板制造商很友善地磨掉了所有标记 有没有办法通过 jtag 获取设备 系列 ID 并将其交叉引用到型号 我能找到的一切都是关于获取芯片的唯
  • 嵌入式 C++11 代码 — 我需要 volatile 吗?

    采用 Cortex M3 MCU STM32F1 的嵌入式设备 它具有嵌入式闪存 64K MCU固件可以在运行时重新编程闪存扇区 这是由闪存控制器 FMC 寄存器完成的 所以它不像a b那么简单 FMC 获取缓冲区指针并将数据刻录到某个闪存
  • MCP23017 I2C 设备驱动程序探测函数未调用

    我正在使用以下 I2C GPIO设备驱动 https github com torvalds linux blob master drivers gpio gpio mcp23s08 c访问 MCP23017 GPIO 使用 insmod
  • 读取时不返回写入 I2C 的缓冲区

    我试图在写入后从 I2C 总线上的内存位置读取一个值 当我在终端中运行它时 我得到奇怪的输出 这是我的程序 include
  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d
  • 移动数组中的元素

    我需要一点帮助 我想将数组中的元素向上移动一个元素 以便新位置 1 包含位置 1 中的旧值 new 2 包含 old 1 依此类推 旧的最后一个值被丢弃 第一个位置的新值是我每秒给出的新值 我使用大小为 10 的数组 uint32 t TE
  • stm32l0: 执行MI命令失败。使用 vFlashErase 数据包擦除闪存时出错

    我正在使用 Nucleo STM32L031 和 AC6 STM32 工作台 eclipse 我编写应用程序并进入调试模式 一切正常 直到我在应用程序中添加另一个功能 我注意到当我删除 评论 新函数 软件可以再次进入调试模式 但是当我添加
  • GCC 变量映射和 MISRA-C

    我主要知道两种使用 GCC 声明内存映射寄存器的方法 有许多变体 使用双字段 每个外设的数据结构等 要么使用初始化为正确地址的指针 例如volatile uint32 t pMyRegister uint32 t 0xDEADBEEFUL
  • STM32F4 定时器 - 计算周期和预分频,以生成 1 ms 延迟

    我在用STM32F407VGT6 with CubeMX 因此 我从通用定时器开始 但我被预分频值和周期值所困扰 基本上我想每隔一段时间生成一个定时器中断n 其中 n 1 2 3 ms 并执行一些任务 计算周期和预分频值的公式有很多变化 公

随机推荐

  • MySQL gbk中文md5加密

    在MySQL中自带md5 函数可以进行md5加密 xff0c 但是加密字段默认为utf 8格式 select md5 39 这是一串加密数据 39 输出结果 xff1a ca53cf805e403f238b60935e8b68f0f3 可以
  • crosstab 、pivot_table 、groupby比较

    所用数据前五条 目标 生成数据透视图 crosstab pd crosstab index 61 data 39 admit 39 columns 61 data 39 prestige 39 以上代码用于计数 xff0c 如要展示其他数据
  • numpy 矩阵创建

    mat xff1a 分号用于隔开数据 matrix 将ndarray 转为矩阵 bmat 将小矩阵合并成大矩阵 矩阵特有属性与说明 属性 说明 T 返回自身转置H返回自身的共轭转置I返回自身的逆矩阵A返回自身数据的二位数组 xff08 没有
  • numpy 矩阵复制

    纵向复制 横向复制
  • excel 中“万”字处理

    61 IF ISNUMBER FIND 34 万 34 M2 SUBSTITUTE M2 34 万 34 34 34 10000 M2 函数中的3个M2为需要处理单元格所在位置 结果展示如下
  • python groupby 不同列聚合

    dataframe 在groupby后有时候需要对不同的列按照不同的聚合方式聚合 聚合方法如图 xff1a num agg中输入各列数据的聚合方式 可用于多条件groupby
  • dataframe 中万字处理

    df 39 点赞 39 apply lambda x float str x replace 39 万 39 39 39 10000 if 39 万 39 in str x else x astype int
  • VSCode之CMake使用

    一 准备工作 下载 对应平台的VScode安装C 43 43 扩展 安装Cmake 工具扩展 并行需要安装 Cmake xff0c 编译器 xff0c 调试器和构建工具 cmake version 虽然咱们使用VSCode编辑代码 xff0
  • 运行apt-get update后出现错误

    一般错误是如下两种 xff1a 1 一般如果你的ubuntu是中文的设定了地区的 xff0c 错误是如下 xff1a W 无法下载http ppa launchpad net deluge team ppa ubuntu dists nat
  • 表达式求值(含括号的复杂运算)

    具体解析看注释 span class token macro property span class token directive keyword include span span class token string lt bits
  • HttpClient模拟登录总结(不能跳转及跳转后不能登录)

    最近在写一个模拟登录的程序 xff0c 从网上找了很多资料 xff0c 都没能有一个完整的例子可成功跳转登录后的页面 xff0c 现把我的代码拿来与大家分享一下 xff0c 希望可以帮到一些人吧 其原理是 xff1a 通过HttpClien
  • JestonTX2更新软件源

    JestonTX2刷机后需要更新软件源 更新软件源后 xff0c 才可以正常安装QT等软件 软件源记录文件放在以下文件中 cd etc apt source list 可以使用gedit打开此文件 sudo gedit etc apt so
  • Kali的下载安装详细过程

    1 什么是Kali xff1f Kali Linux是专门用于渗透测试的Linux操作系统 2 打开官网 Kali Linux Penetration Testing and Ethical Hacking Linux Distributi
  • 本地搭建GitLab地址不一致问题

    1 本地虚拟机用docker搭建Gitlab project clone 地址如下 xff1a 实际地址如下 xff1a http 192 168 56 51 root apacha backend 本来没在意这个问题 xff0c clon
  • 数据库笔试题(答案)

    一 填空题 每题2分 xff0c 共10分 1 索引字段值不唯一 xff0c 应该 使用 的索引类型为 普通索引 2 只有满足联接条件的记录才包含在查询结果中 xff0c 这种联接为 内联接 3 E R模型的组成包括那些 元素 实体 属性
  • mac时间机器占用大量系统盘空间且在访达中无法找到

    mac用时间机器备份到外置移动硬盘 xff0c 但是后来发现mac系统盘占用随之增加 经过研究发现 xff0c 时间机器备份是现在mac系统盘备份然后转移到移动硬盘 xff0c 而且系统盘中的备份文件是隐藏的 xff0c 所以在关于本机 x
  • android——降低gradle的版本、下载好gradle的包存放的位置

    一 降低gradle的版本 本文以gradle版本7 0 2改成6 3为例子 xff1a 1 在build gradle里面修改dependencies里面的 classpath 34 com android tools build gra
  • C语言十进制转八进制、十六进制以及十六进制转十进制、八进制

    以下程序的输出结果是 main int a 61 20 printf 34 d o x n 34 a a a 看到这个题目首先我们要明白 o 和 x代表的是什么意思 o代表的是输出该数字的八进制 x代表的是输出该数字的十六进制 1 题目给出
  • 解决Mybatis分页插件PageHelper自动添加limit导致分页失败问题

    目录 1 问题描述2 解决方案2 1 方案一2 2 方案二 3 完成效果4 一点困惑5 参考文献 1 问题描述 今天在完善项目的时候 xff0c 有一个需求就是给我的评论区实现分页显示评论数 xff0c 但是当自己运行的时候点击查看评论的时
  • STM32 HAL库 STM32CubeMX -- I2C(IIC)

    文章目录 一 I2C 协议简介I2C 物理层I2C协议层I2C架构通讯过程 二 STM32Cube MX配置三 I2C HAL库函数 一 I2C 协议简介 I2C 通讯协议 Inter xff0d Integrated Circuit 也就