【雅特力AT32】IIC使用指南_附读写EEPROM案例

目录

1.12C接口简介
2.12C接口通信

2.1主机通信流程
2.1.1 主机通信初始化
1>主机时钟初始化
2>主机通信初始化
3>主机 10 bits 寻址的特殊时序初始化
2.1.2 主机通信初始化软件接口
2.1.3 主机发送流程
2.1.4 主机发送流程软件接口
2.1.5 主机接收流程
2.1.6 主机接收流程软件接口

2.2 从机通信流程

2.2.1 从机通信初始化
1>从机地址配置
2>从机地址匹配
3>从机字节控制模式(通常SMBus 模式下才使用)
2.2.2 从机通信初始化软件接口
2.2.3 从机发送流程
2.2.4 从机发送流程软件接口
2.2.5 从机接收流程
2.2.6 从机接收流程软件接口

2.3 唤醒深睡眠模式

2.4 IIC读写EEPROM

2.4.1 功能简介
2.4.2 资源准备
2.4.3 软件设计

引言

​ AT32 的 I2C 总线接口用于处理微控制器和串行 I2C 总线之间的通信,支持主机和从机模式,支持唤醒深睡眠模式,最大通信速度为 1Mbit/s(增强快速模式 fast mode plus)。

​ 本文主要就 I 2C 总线接口的基本功能进行讲解和案列解析。

1. I2C接口简介

​ I2C 接口是由数据线 SDA 和时钟线 SCL 构成,在标准模式下通信速度可达到 100kHz快速模式下则可以达到 400kHz增强快速模式可达到 1MHz

​ 一帧数据传输从开始信号开始,在结束信号后停止,在收到开始信号后总线被认为是繁忙的,当收到结束信号后,总线被认为再次空闲。

​ I2C 接口具有主机和从机模式、多主机功能、可编程建立和保持时间、时钟延展功能、DMA 存取数据、支持SMBus 2.0 协议等特点。

在这里插入图片描述

I 2C1 可透过配置 CRM 中 PICLKS 寄存器的 I2C1SEL 位,时钟来源可选择来自 SYSCLK、PCLK和 HICK,并且支持从 Deepsleep mode 唤醒, I2C1 有模拟滤波器,可以滤掉 50ns 内的噪声

在这里插入图片描述

I 2C2 / I 2C3 时钟来源为 PCLK,不支持 Deepsleep mode 唤醒并且没有模拟滤波器。

2. I2C接口通信

2.1主机通信流程

2.1.1 主机通信初始化
1> 主机时钟初始化

在启动外设(I2CEN)之前,必须先设置 I2Cx_CLKCTRL 寄存器的各个位用以配置 I 2C 主时钟。

― DIV[7:0]:	I2C 时钟分频;
― SDAD[3:0]:数据保持时间(tHD;DAT)
― SCLD[3:0]:数据建立时间(tSU;DAT)
― SCLH[7:0]:SCL 高电平时间
― SCLL[7:0]:SCL 低电平时间

​ 该寄存器的配置可以使用 Artery_I2C_Timing_Configuration 时钟配置工具计算,见第三部分。

  • 低电平控制
当检测到 SCL 总线为低电平时,内部 SCLL 计数器开始计数,当计数值达到 SCLL 值时,释放 SCL 线,SCL 线变为高电平。
  • 高电平控制
当检测到 SCL 总线为高电平时,内部 SCLH 计数器开始计数,当计数值达到 SCLH 值时,拉低 SCL 线,SCL 线变为低电平,当在高电平期间,如果被外部总线拉低,那么内部 SCLH 计数器停止计数,并开始低电平计数,这为时钟同步提供了条件。

在这里插入图片描述

2> 主机通信初始化

启动通讯前须先设定 I2C_CTRL2 寄存器中的几项参数:

  • 1)设置传输字节数

    • ​ ≤255 字节

      配置 I2C_CTRL2 的 RLDEN=0,关闭重载模式
      配置 I2C_CTRL2 的 CNT[7:0] = N 
      
    • ​ ->255 字节

      配置 I2C_CTRL2 的 RLDEN=1,使能重载模式
      配置 I2C_CTRL2 的 CNT[7:0]=255
      剩余传输字节数 N = N - 255
      
  • 2)设置传输结束模式

    • 软件结束模式

      ASTOPEN=0:软件结束模式,当数据传输完成后,I2C_STS 的 TDC 标志置 1,软件设置GENSTOP=1 或者 GENSTART=1,发送 STOP 条件或者 START 条件。
      
    • 自动结束模式

      ASTOPEN=1:自动结束模式,当数据传输完成后,自动发送 STOP 条件。
      
  • 3)设置从机地址

    设置寻址的从机地址值(I2C_CTRL2 的 SADDR)设置从机地址模式(I2C_CTRL2 的 ADDR10)
    ADDR10=0:7 位地址模式
    ADDR10=1:10 位地址模式
    
  • 4)设置传输方向(I2C_CTRL2 的 DIR)

        DIR=0:主机接收数据DIR=1:主机发送数据
    
  • 5)开始传输

    设置 I2C_CTRL2 的 GENSTART=1,主机开始在总线上**发送 START 条件和从机地址**。
    
3> 主机 10 bits 寻址的特殊时序初始化

在 10 位地址传输模式下,I2C_CTRL2 的 READH10 用于产生特殊时序,当 READH10=1 时,支持如下传输序:主机先发送数据给从机,然后再从从机读取数据,传输时序图如下图所示:

在这里插入图片描述

2.1.2 主机通信初始化软件接口

主机通信初始化所用到的软件接口通过独立的函数接口实现,如下:

/* 主机时钟初始化 */
void i2c_init(i2c_type *i2c_x, uint8_t dfilters, uint32_t clk); 
/* 主机通信初始化 */
void i2c_transmit_set(i2c_type *i2c_x, uint16_t address, uint8_t cnt, i2c_reload_stop_mode_type rld_stop, i2c_start_stop_mode_type start_stop); 
/* 10 位地址使能 */
void i2c_addr10_mode_enable(i2c_type *i2c_x, confirm_state new_state); /* 10 位地址头读取时序使能 */
void i2c_addr10_header_enable(i2c_type *i2c_x, confirm_state new_state);

i2c_init 函数

用于主机时钟初始化,三个参数分别为:所使用的 I2C、数字滤波值和主机时钟配置值。

i2c_transmit_set 函数

用于初始化通信参数,包括:所使用的 I2C、从机地址、传输字节数、停止条件产生模式和起始条件产生模式。

i2c_addr10_mode_enable 函数

用于使能 10 位地址模式。

i2c_addr10_header_enable 函数

用于使能 10 位地址头读取时序,即主机发送完整的 10 位从机地址读序列或主机只发送 10 位地址的前 7 位。
2.1.3 主机发送流程
  1. I2C_TXDT 数据寄存器为空,I2C_STS 的 TDIS=1;

  2. 向 TXDT 数据寄存器写入数据,数据开始发送;

  3. 重复 1、2 步骤直到发送 CNT[7:0]个数据;

  4. 如果此时 I2C_STS 的 TCRLD=1(重载模式),分为以下两种情况:

    ― 剩余字节数 N>255:向 CNT 写入 255,N=N-255,TCRLD 被自动清 0,传输继续;
    ― 剩余字节数 N≤255:关闭重载模式(RLDEN=0),向 CNT 写入 N,TCRLD 被自动清 0,传输继续。
    
  5. 结束时序

    ― 停止条件产生:

    软件结束模式(ASTOPEN=0):此时 I2C_STS 的 TDC 置 1,设置 GENSTOP=1产生 STOP 条件;自动结束模式(ASTOPEN=1):自动产生 STOP 条件。
    

    ― 等待产生 STOP 条件:

    当 STOP 条件产生时,I2C_STS 的 STOPF 置 1,将 I2C_CLR的 STOPC 写 1,清除 STOPF 标志,传输结束.
    

在这里插入图片描述
在这里插入图片描述

2.1.4 主机发送流程软件接口

主机发送通过独立的函数接口实现,如下:

i2c_status_type i2c_master_transmit
(i2c_handle_type* hi2c, uint16_t address, uint8_t* pdata, uint16_t size, uint32_t timeout
);

i2c_master_transmit 函数为 i2c_application.c 文件所提供的应用层接口函数,参数包括:I2C 结构体指针、从机地址、发送数据指针、发送数据字节数和函数超时时间。

注:此函数为Artery 所提供的标准主机发送函数。用户也可根据前述主机发送流程,自行编写主机发送函数。

2.1.5 主机接收流程
  1. 当收到数据后,RDBF=1,读取 RXDT 数据寄存器,RDBF 被自动清零;

  2. 重复步骤 2 直到接收 CNT[7:0]个数据;

  3. 如果此时 I2C_STS 的 TCRLD=1(重载模式),分为以下两种情况:

    ― 剩余字节数 N>255:向 CNT 写入 255,N=N-255,TCRLD 被自动清 0,传输继续;― 剩余字节数 N≤255:关闭重载模式(RLDEN=0),向 CNT 写入 N,TCRLD 被自动清 0,传输继续。
    
  4. 当在接收到最后一个字节时,主机会自动发送一个 NACK。

  5. 结束时序

    ― 停止条件产生:软件结束模式(ASTOPEN=0):此时 I2C_STS 的 TDC 置 1,设置 GENSTOP=1 产生STOP 条件;自动结束模式(ASTOPEN=1):自动产生 STOP 条件。
    ― 等待产生 STOP 条件:当 STOP 条件产生时,I2C_STS 的 STOPF 置 1,将 I2C_CLR 的STOPC 写 1,清除 STOPF 标志,传输结束。
    

在这里插入图片描述
在这里插入图片描述

2.1.6 主机接收流程软件接口

主机接收通过独立的函数接口实现,如下:

i2c_status_type i2c_master_receive
(i2c_handle_type* hi2c, uint16_t address, uint8_t* pdata, uint16_t size, uint32_t timeout
);

i2c_master_receive 函数为 i2c_application.c 文件所提供的应用层接口函数,参数包括:I2C 结构体指针、从机地址、接收数据指针、接收数据字节数和函数超时时间。

注:此函数为 Artery 所提供的标准主机接收函数。用户也可根据前述主机接收流程,自行编写主机接收函数。

2.2 从机通信流程

2.2.1 从机通信初始化
1> 从机地址配置

每个 I 2C 从设备可同时支持 2 个从设备地址,由 OADDR1 和 OADDR2 指定

  • I2C_OADDR1

    — 通过 ADDR1EN 使能
    — 通过 ADDR1MODE 配置为 7 位(默认)或 10 位地址
    
  • I2C_OADDR2

    — 通过 ADDR2EN 使能
    — 固定 7 位地址模式
    — 可通过 ADDR2MASK [2:0]来在进行地址匹配比较时屏蔽掉 0~7 个 LSB 地址位ADDR2MASK = 0 表示 7 位地址中的每一位都要参与匹配比较ADDR2MASK = 7 表示任何非保留地址的 7 位地址都会被该从设备应答
    
2> 从机地址匹配
当 I 2C 启用的地址选中匹配时,ADDRF 中断状态标志会被置 1,如果 ADDRIEN 位为 1,就会产生一个中断。
如果两个从地址都使能,在地址匹配产生 ADDR 中断时,可以查看状态寄存器中的ADDR [6:0]来得知是 OADDR1 还是 OADDR2 被寻址了。
3> 从机字节控制模式(通常 SMBus 模式下才使用)

从设备可以对每个收到的字节进行应答控制。

所需配置:SCTRL = 1 & RLDEN =1 & STRETCH = 0 & CNT ≥ 1

从机字节控制流程:

1) 每收到一个字节 TCRLD 置位,时钟延展于第 8 和第 9 个脉冲之间
2) 软件读取 RXDT 中的值,并决定是否置位 ACK
3) 软件重装载 CNT = 1 来停止时钟延展
4) 应答或非应答信号在第 9 个脉冲时刻出现在总线上

注意:

置位 SCTRL 时,必须开启时钟延展,即 STRETCH = 0;
CNT 可以是大于 1 的值,来实现多个字节以自动 ACK 接收完毕后再启动应答控制,从设备发送时推荐关闭 SCTRL,此时无需字节应答控制。
2.2.2 从机通信初始化软件接口

从机通信初始化所用到的软件接口通过独立的函数接口实现,如下:

void i2c_own_address1_set(i2c_type *i2c_x, i2c_address_mode_type mode, uint16_t address);
void i2c_own_address2_set(i2c_type *i2c_x, uint8_t address, i2c_addr2_mask_type mask);
void i2c_own_address2_enable(i2c_type *i2c_x, confirm_state new_state);
void i2c_slave_data_ctrl_enable(i2c_type *i2c_x, confirm_state new_state);
void i2c_clock_stretch_enable(i2c_type *i2c_x, confirm_state new_state);
void i2c_reload_enable(i2c_type *i2c_x, confirm_state new_state);

i2c_own_address1_set 函数用于配置 OADDR1 地址模式以及 ADDR1 地址值。

i2c_own_address2_set 函数用于配置 ADDR2 地址值以及 ADDR2 屏蔽位。

i2c_own_address2_enable 函数用于使能 ADDR2 地址。

i2c_slave_data_ctrl_enable 函数用于使能从机字节控制模式。

i2c_clock_stretch_enable 函数用于使能从机时钟延展功能。

i2c_reload_enable 函数用于使能发送数据重载模式。

2.2.3 从机发送流程
  1. 响应主机地址,匹配时回复 ACK;

  2. TXDT 为空时,置位 TDIS,从设备写入发送数据;

  3. 每发送一个字节会收到 ACK,且置位 TDIS;

  4. 如果收到 NACK 位:

    — 置位 NACKF,产生中断;
    — 从设备自动释放 SCL 和 SDA(以便主设备发送 STOP 或 RESTART);
    
  5. 如果收到 STOP 位:

    — 置位 STOPF,产生中断;
    

​ 当从机发送开启时钟延展(STRETCH = 0)时,在等待 ADDRF 标志时和发送前一个数据的第 9 个时钟脉冲后,会把 TXDT 中的数据拷贝到移位寄存器中,如果此时 TDIS 还是置位,表示 TXDT 没有写进待发送数据,将发生时钟延展,如下流程图:

在这里插入图片描述

​ 需要注意的是,在时钟延展关闭(STRETCH=1)的情况下,如果在将要传输数据的第一个 Bit 位开始发送之前,也就是 SDA 边沿产生之前,如果数据还未写入 TXDT 数据寄存器,那么会发生欠载错误,此时 I2C_STS 的 OUF 将会置 1,并将 0xFF 发送到总线。

​ 为了能及时的写入数据,可以在通信开始前,先将数据写入到 DT 寄存器:软件先将 TDBE 置 1,目的是为了清空 TXDT 寄存器的数据,然后将第一个数据写入 TXDT 寄存器,此时 TDBE 清零。

在这里插入图片描述

2.2.4 从机发送流程软件接口

从机发送通过独立的函数接口实现,如下:

i2c_status_type i2c_slave_transmit
(i2c_handle_type* hi2c, uint8_t* pdata, uint16_t size, uint32_t timeout
);

i2c_slave_transmit 函数为 i2c_application.c 文件所提供的应用层接口函数,参数包括:I2C 结构体指针、发送数据指针、发送数据字节数和函数超时时间

注:此函数为 Artery 所提供的标准从机发送函数。用户也可根据前述从机发送流程,自行编写从机发送函数。

2.2.5 从机接收流程
  1. 当收到数据后,RDBF=1,读取 RXDT 数据寄存器,RDBF 被自动清零;

  2. 重复步骤 2 直到所有数据接收完成;

  3. 等待收到 STOP 条件,当收到 STOP 条件时,I2C_STS 的 STOPF 置 1,将 I2C_CLR的 STOPC 写 1,清除 STOPF 标志,传输结束。

在这里插入图片描述

2.2.6 从机接收流程软件接口

从机接收通过独立的函数接口实现,如下:

i2c_status_type i2c_slave_receive
(i2c_handle_type* hi2c, uint8_t* pdata, uint16_t size, uint32_t timeout
);

i2c_slave_receive 函数为 i2c_application.c 文件所提供的应用层接口函数,参数包括:I2C 结构体指针、接收数据指针、接收数据字节数和函数超时时间

注:此函数为 Artery 所提供的标准从机接收函数。用户也可根据前述从机接收流程,自行编写从机接收函数。

2.3 唤醒深睡眠模式

A423 上有 3 个 I2C,其中只有 I2C1 支持在被寻址到时将系统从深睡眠模式(DEEPSLEEP)唤醒

使用此功能的配置步骤

  1. 使能 I2C 唤醒深睡眠模式功能(I2C1_CTRL1 的 WAKEUPEN 位置 1)

    i2c_wakeup_enable(i2cx, TRUE);
    
  2. 数字滤波器值设置为 0(I2C1_CTRL1 的 DFLT 位设为 0)

    i2c_init(i2cx, 0x00, I2Cx_CLKCTRL);
    
  3. 开启时钟延展模式(I2C1_CTRL1 的 STRETCH 位设为 0)

    i2c_clock_stretch_enable(i2cx, TRUE);
    
  4. I2C 时钟选择 HICK(CRM_MISC2 的 I2C1SEL 位)

    crm_i2c1_clock_source_set(CRM_I2C1_CLOCK_SOURCE_HICK48);
    

关于 A423 唤醒深睡眠模式更多详细信息请参考《AN0208_AT32A423_PWC_Application_Note

2.4 IIC读写EEPROM

4.1 功能简介

使用硬件 I 2C 接口对 EEPROM 存储设备进行读写访问。

4.2 资源准备
  1. 硬件环境:

    对应产品型号的 AT-START BOARD4.7K 上拉电阻EEPROM 存储设备
    
  2. 软件环境

    project\at_start_a4xx\examples\i2c\eeprom
    
4.3 软件设计
  1. 配置流程

     开启 I2C 外设时钟
     配置 I2C 所复用的 GPIO
     配置 I2C 所用的 DMA 通道
     使能 I2C 外设接口
     写入 EEPROM 并读取写入的数据
     比较读写数据内容是否正确
    
  2. 代码介绍 main.c

    如若读写数据完全相同,则 LED3 会被点亮。

    int main(void)
    {i2c_status_type i2c_status;/* 初始化系统时钟 */ system_clock_config(); /* 配置 NVIC 优先级组 */nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);/* at-start board 初始化 */at32_board_init();hi2cx.i2cx = I2Cx_PORT;/* 配置 I2C */i2c_config(&hi2cx);while(1){/* wait for key USER_BUTTON press before starting the communication */while(at32_button_press() != USER_BUTTON){}/* 写数据到 EEPROM */ if((i2c_status = i2c_memory_write(&hi2cx, I2Cx_ADDRESS, 0, tx_buf1, BUF_SIZE, I2C_TIMEOUT)) != I2C_OK){error_handler(i2c_status);}delay_ms(5);/* 读 EEPROM 数据 */ if((i2c_status = i2c_memory_read(&hi2cx, I2Cx_ADDRESS, 0, rx_buf1, BUF_SIZE, I2C_TIMEOUT)) != I2C_OK){ error_handler(i2c_status);} (省略部分代码,完整代码请查看 BSP)/* 等待通讯完成 */ if(i2c_wait_end(&hi2cx, I2C_TIMEOUT) != I2C_OK){error_handler(i2c_status);}/* 比较读写数据 */if((buffer_compare(tx_buf1, rx_buf1, BUF_SIZE) == 0) &&(buffer_compare(tx_buf2, rx_buf2, BUF_SIZE) == 0) &&(buffer_compare(tx_buf3, rx_buf3, BUF_SIZE) == 0)){at32_led_on(LED3);}else{error_handler(i2c_status);}} 
    }error_handler(i2c_status);} (省略部分代码,完整代码请查看 BSP)/* 等待通讯完成 */ if(i2c_wait_end(&hi2cx, I2C_TIMEOUT) != I2C_OK){error_handler(i2c_status);}/* 比较读写数据 */if((buffer_compare(tx_buf1, rx_buf1, BUF_SIZE) == 0) &&(buffer_compare(tx_buf2, rx_buf2, BUF_SIZE) == 0) &&(buffer_compare(tx_buf3, rx_buf3, BUF_SIZE) == 0)){at32_led_on(LED3);}else{error_handler(i2c_status);}} 
    }
    

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

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

相关文章

leetcode 1361. 验证二叉树

二叉树上有 n 个节点,按从 0 到 n - 1 编号,其中节点 i 的两个子节点分别是 leftChild[i] 和 rightChild[i]。 只有 所有 节点能够形成且 只 形成 一颗 有效的二叉树时,返回 true;否则返回 false。 如果节点 i 没有左子节点&#…

【Ubuntu】Ubuntu安装编译C/C++环境简易版教程

环境 操作系统:ubuntu-22.04.4-desktop-amd64.iso 安装 第一步:更新软件包列表,检查可用的软件包更新 sudo apt update在这一步,我们可以确保系统中的软件包列表是最新的,以便后续的软件包管理操作。 第二步:安装…

​​XrayGLM原理与部署

接上一篇:VisualGLM-6B——原理与部署-CSDN博客 XrayGLM技术背景与原理 XrayGLM 是一种基于 VisualGLM-6B 微调开发的多模态医学影像诊断模型,专门用于处理医学影像(如 X 光胸片)的自动诊断和报告生成任务。该模型旨在为中文医学…

归并排序,外排序,计数排序(非比较排序)

归并排序:(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序…

智能软件开启精准品牌控价

在当今竞争激烈的商业世界中,品牌的价值如同璀璨的明珠,需要精心呵护。而价格管控,则是守护这颗明珠的关键防线。 当面对众多的产品和 SKU 时,传统的人力监测已显得力不从心。此时,力维网络自主开发的数据监测系统如同…

Redis 篇-深入了解在 Linux 的 Redis 网络模型结构及其流程(阻塞 IO、非阻塞 IO、IO 多路复用、异步 IO、信号驱动 IO)

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 用户空间与内核空间概述 2.0 Redis 网络模型 2.1 Redis 网络模型 - 阻塞 IO 2.2 Redis 网络模型 - 非阻塞 IO 2.3 Redis 网络模型 - IO 多路复用 2.3.1 IO 多路复…

如何守护变美神器安全?红外热像仪:放开那根美发棒让我来!

随着智能家电市场的迅速发展,制造商们越来越关注生产过程中效率和质量的提升。如何守护变美神器安全?红外热像仪:放开那根卷发棒让我来! 美发棒生产遇到什么困境? 美发棒生产过程中会出现设备加热不均情况&#xff0c…

图片该怎么转二维码展示?轻松将图片做成二维码的方法

随着现在互联网的不断发展,在日常生活中很多场景下会选择用二维码来展示信息或其他内容,让图片、文本、音视频、文件以及其他内容展示更加便捷,有效提升用户获取内容的效率。那么怎么用二维码来提供图片预览呢? 大家可以学习下面…

太速科技-389-基于KU5P的双路100G光纤网络加速计算卡

基于KU5P的双路100G光纤网络加速计算卡 一、板卡概述 基于Xilinx UltraScale16 nm KU5P芯片方案基础上研发的一款双口100 G FPGA光纤以太网PCI-Express v3.0 x8智能加速计算卡,该智能卡拥有高吞吐量、低延时的网络处理能力以及辅助CPU进行网络功能卸载的能力…

黑盒测试与白盒测试总结

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 黑盒测试与白盒测试是软件测试中两种不同的测试方法,它们的主要区别在于测试者对被测试软件的了解程度。下面,我们将详细介绍这两种测试方…

华为申请鸿蒙甄选、鸿蒙优选商标,加词的注意!

近日华为在35类广告销售上申请鸿蒙智选、鸿蒙优选、鸿蒙精品,鸿蒙甄选等商标,后面所加的词智选、优选、精品、甄选等基本上是属于通用词。 这样在35类拿到鸿蒙通用词商标,需要先拿到“鸿蒙“商标,经普推知产商标老杨检索发现&…

001. OBS (obs-studio)

1. 下载 https://obsproject.com/download windows c 插件下载 https://obsproject.com/visual-studio-2022-runtimes 2. 操作步骤 https://renwen.shnu.edu.cn/_s40/9a/2c/c28309a760364/page.psp https://zhuanlan.zhihu.com/p/597231652

智慧公厕:引领公共卫生新潮流@卓振思众

随着科技的不断进步,智慧公厕应运而生,为人们带来了全新的如厕体验。作为智慧公厕厂家,我们致力于打造更加舒适、便捷、环保的公共厕所。智慧公厕究竟有哪些神奇之处呢?让我们一起来揭开它的神秘面纱。【卓振思众】 一、环境监测&…

【FPGA必知必会】(二)7系列的配置(三)多FPGA配置

在一些复杂的应用中,会在同一张板卡上使用多个FPGA设备,如果每个FPGA都引出一组JTAG管脚,无疑增加了板卡的布局密度。 Xilinx提供了一种解决方案,可以使用同一个配置源来配置所有的FPGA设备。 如果多个FPGA使用相同的配置文件&a…

Linux 文件目录结构(详细)

一、基本介绍 Linux的文件系统是采用级层式的树状目录结构,在此结构中的最上层是根目录“/”,然后在此目录下再创建其他的目录。 Linux世界中,一切皆文件! 二、相关目录 /bin[常用](/usr/bin、/usr/local/bin) 是Binary的缩写,…

监测打鼾app

监测打鼾app,在现代生活中,打鼾不仅是一个常见的夜间问题,它对健康的隐患也越来越被人们所重视。随着科技的进步,监测打鼾的应用程序如雨后春笋般涌现,为改善睡眠质量提供了新的希望。其中,流静(LiuJing&am…

信息,就是位+上下文什么是文本文件和二进制文件

信息&#xff0c;就是位上下文 计算机系统是由硬件和软件系统组成的&#xff0c;它们共同工作来运行应用程序 hello.c #include <stdio.h>int main(){printf("Hello World~");return 0; }hello程序的生命周期是从一个源程序&#xff08;或者说源文件&#xf…

【高阶数据结构】平衡二叉树(AVL)的删除和调整

&#x1f921;博客主页&#xff1a;醉竺 &#x1f970;本文专栏&#xff1a;《高阶数据结构》 &#x1f63b;欢迎关注&#xff1a;感谢大家的点赞评论关注&#xff0c;祝您学有所成&#xff01; ✨✨&#x1f49c;&#x1f49b;想要学习更多《高阶数据结构》点击专栏链接查看&a…

《数据结构与算法之美》学习笔记五之队列

前情提要&#xff1a;上一章学习了栈相关的知识&#xff0c;主要有下面的内容&#xff1a; 栈操作的时间复杂度&#xff0c;对于顺序栈&#xff0c;入栈时如果栈的空间不够涉及到数据搬移&#xff0c;此时使用摊还分析法&#xff0c;将数据搬移的耗时均摊到不需要搬移数据的入…

django开发流程1

一、官方网站&#xff1a; Django documentation | Django documentation | Djangohttps://docs.djangoproject.com/en/5.1/ 1.安装 django : pip install django 2. django项目的配置文件 (settings.py) BASE_DIR 项目根路径 DEBUG 调试模式 INSTALLE…