I2C(一):存储器模式:stm32作为主机对AT24C02写读数据

存储器模式:在HAL库中,I2C有专门对存储器外设设置的库函数

I2C(一):存储器模式的使用

  • 1、I2C轮询式写读AT24C02一页数据
  • 2、I2C轮询式写读AT24C02多页数据
  • 3、I2C中断式写读AT24C02一页数据
  • 4、I2C使用DMA式写读AT24C02一页数据

1、I2C轮询式写读AT24C02一页数据

AT24C02 是一款常见的 2 Kbit(256 字节)I²C 接口的 EEPROM(电可擦可编程只读存储器)。它的存储结构如下:

存储容量:AT24C02 的总存储容量为 2 Kbit(即 256 字节)
页(Page)大小:AT24C02 的每一页(Page)的大小为 8 字节。
写数据时,最多一次型写入1页(8字节),超过即会从页的开头覆盖
读数据时,没有限定字节数。

①I2C.c文件的代码如下

#include "I2C.h"/*** @brief:I2C1初始化函数*/
I2C_HandleTypeDef hi2c1;                            //I2C初始化结构体
void I2C1_Init(void)
{/* 1、对I2C1进行初始化 */__HAL_RCC_I2C1_CLK_ENABLE();                    //使能I2C1的时钟hi2c1.Instance = I2C1;                          //选择I2C1hi2c1.Init.ClockSpeed = 100000;                 //通信速率100K,标志模式HAL_I2C_Init(&hi2c1);
}/*** @brief:HAL_I2C_Init()调用此函数*/
void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c)
{GPIO_InitTypeDef GPIO_Init;                     //IO口初始化结构体if(hi2c->Instance == I2C1){/* I2C1引脚的初始化:PB6 = SCL,PB7 = SDA*/__HAL_RCC_GPIOB_CLK_ENABLE();              //使能GPIOB的时钟GPIO_Init.Mode = GPIO_MODE_AF_OD;           //复用开漏输出GPIO_Init.Pin = GPIO_PIN_6 | GPIO_PIN_7;    //PB6和PB7GPIO_Init.Speed = GPIO_SPEED_FREQ_LOW;      //最大输出速度:低HAL_GPIO_Init(GPIOB, &GPIO_Init);}else if(hi2c->Instance == I2C2){}
}

②I2C.h文件的代码如下

#ifndef __I2C_H
#define __I2C_H#include "stm32f1xx_hal.h"
extern I2C_HandleTypeDef hi2c1;                            //I2C初始化结构体
void I2C1_Init(void);#endif

③main.c文件的代码如下

#include "stm32f1xx_hal.h"
#include "STM32_RCC_Init.h"
#include "UART.h"
#include "I2C.h"#define AT24C02_Address 0xA0uint8_t WriteData[8] = {1,2,3,4,5,6,7,88};
uint8_t ReadData[8];int main(void){HAL_Init();HSE_RCC_Init(); UART1_Init(115200);I2C1_Init();printf("启动判断!\r\n");/* 存储器模式:对AT24C02第一页进行写 */HAL_I2C_Mem_Write(&hi2c1, AT24C02_Address, 0, I2C_MEMADD_SIZE_8BIT, WriteData, 8, 1000);//I2C1,从机地址,从机内部地址,每次传输的数据大小,需要写入的数据缓冲区,需要写入多少个数据/* 查询从机知否准备就绪 */if(HAL_I2C_IsDeviceReady(&hi2c1, AT24C02_Address, 20, 1000) == HAL_OK)//I2C1,从机地址,查询次数,超时时间{/* 存储器模式:向从机第一页读取数据 */HAL_I2C_Mem_Read(&hi2c1, AT24C02_Address, 0, I2C_MEMADD_SIZE_8BIT, ReadData, 8, 1000);}else{printf("芯片忙碌!\r\n");}/* 将读取到的数据通过串口打印 */for(uint8_t i = 0; i<8; i++){printf("ReadData[%d] = %d\r\n",i,ReadData[i]);}while(1){}	
}

在这里插入图片描述

2、I2C轮询式写读AT24C02多页数据

①I2C.c文件的代码如下

#include "I2C.h"/*** @brief:I2C1初始化函数*/
I2C_HandleTypeDef hi2c1;                            //I2C初始化结构体
void I2C1_Init(void)
{/* 1、对I2C1进行初始化 */__HAL_RCC_I2C1_CLK_ENABLE();                    //使能I2C1的时钟hi2c1.Instance = I2C1;                          //选择I2C1hi2c1.Init.ClockSpeed = 100000;                 //通信速率100K,标志模式HAL_I2C_Init(&hi2c1);
}/*** @brief:HAL_I2C_Init()调用此函数*/
void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c)
{GPIO_InitTypeDef GPIO_Init;                     //IO口初始化结构体if(hi2c->Instance == I2C1){/* I2C1引脚的初始化:PB6 = SCL,PB7 = SDA*/__HAL_RCC_GPIOB_CLK_ENABLE();              //使能GPIOB的时钟GPIO_Init.Mode = GPIO_MODE_AF_OD;           //复用开漏输出GPIO_Init.Pin = GPIO_PIN_6 | GPIO_PIN_7;    //PB6和PB7GPIO_Init.Speed = GPIO_SPEED_FREQ_LOW;      //最大输出速度:低HAL_GPIO_Init(GPIOB, &GPIO_Init);}else if(hi2c->Instance == I2C2){}
}

②I2C.h文件的代码如下

#ifndef __I2C_H
#define __I2C_H#include "stm32f1xx_hal.h"
extern I2C_HandleTypeDef hi2c1;                            //I2C初始化结构体
void I2C1_Init(void);#endif

③main.c文件的代码如下

#include "stm32f1xx_hal.h"
#include "STM32_RCC_Init.h"
#include "UART.h"
#include "I2C.h"#define AT24C02_Address 0xA0uint8_t WriteData[16] = {1,2,3,4,5,6,7,8,8,7,6,5,4,3,2,1};
uint8_t ReadData[16];int main(void){HAL_Init();HSE_RCC_Init(); UART1_Init(115200);I2C1_Init();printf("启动判断!\r\n");uint8_t i = 0;for(i = 0; i<2; i++){/* 存储器模式:对AT24C02的页进行写 */HAL_I2C_Mem_Write(&hi2c1, AT24C02_Address, i*8, I2C_MEMADD_SIZE_8BIT, &WriteData[i*8], 8, 1000);//while(HAL_I2C_IsDeviceReady(&hi2c1, AT24C02_Address, 20, 1000) != HAL_OK);HAL_Delay(10);}/* 查询从机知否准备就绪 */if(HAL_I2C_IsDeviceReady(&hi2c1, AT24C02_Address, 20, 1000) == HAL_OK)//I2C1,从机地址,查询次数,超时时间{/* 存储器模式:向从机读取数据 */HAL_I2C_Mem_Read(&hi2c1, AT24C02_Address, 0, I2C_MEMADD_SIZE_8BIT, ReadData, 16, 1000);}else{printf("芯片忙碌!\r\n");}/* 将读取到的数据通过串口打印 */for(i = 0; i<16; i++){printf("ReadData[%d] = %d\r\n",i,ReadData[i]);}while(1){}	
}

在这里插入图片描述

3、I2C中断式写读AT24C02一页数据

实验要求:连接PB0的按键按下后,单片机主机向从机AT24C02写入数据。连接PB1的按键按下后,主机向从机AT24C02读取数据,然后通过串口打印。

①Key.c文件的代码如下

#include "Key.h"/*** 按键引脚的初始化,使用PB0和PB1*/
void Key_GPIO_Init(void)
{/* 1、开启GPIOB的时钟 */__HAL_RCC_GPIOB_CLK_ENABLE();/* 2、对GPIOB0进行配置 */GPIO_InitTypeDef GPIO_Init;GPIO_Init.Pin = GPIO_PIN_0|GPIO_PIN_1;      //选择PB0GPIO_Init.Mode = GPIO_MODE_INPUT;           //选择输入模式GPIO_Init.Pull = GPIO_PULLUP;               //选择上拉模式HAL_GPIO_Init(GPIOB, &GPIO_Init);
}/*** @brief:判断是按键1按下还是按键2按下*/
uint8_t Key_Scan(void)
{uint8_t Key_Num = 0;if(PB0_IN == GPIO_PIN_RESET)        //PB0按下{HAL_Delay(10);                  //延时消抖while(PB0_IN == GPIO_PIN_RESET);Key_Num =  1;}if(PB1_IN == GPIO_PIN_RESET)        //PB1按下{HAL_Delay(10);                  //延时消抖while(PB1_IN == GPIO_PIN_RESET);Key_Num =  2;}  return Key_Num;
}

①I2C.c文件的代码如下

#include "I2C.h"/*** @brief:I2C1初始化函数*/
I2C_HandleTypeDef hi2c1;                            //I2C初始化结构体
void I2C1_Init(void)
{/* 1、对I2C1进行初始化 */__HAL_RCC_I2C1_CLK_ENABLE();                    //使能I2C1的时钟hi2c1.Instance = I2C1;                          //选择I2C1hi2c1.Init.ClockSpeed = 100000;                 //通信速率100K,标志模式HAL_I2C_Init(&hi2c1);/* 配置I2C1的NVIC */HAL_NVIC_SetPriority(I2C1_EV_IRQn,3,0);HAL_NVIC_EnableIRQ(I2C1_EV_IRQn);
}/*** @brief:HAL_I2C_Init()调用此函数*/
void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c)
{GPIO_InitTypeDef GPIO_Init;                     //IO口初始化结构体if(hi2c->Instance == I2C1){/* I2C1引脚的初始化:PB6 = SCL,PB7 = SDA*/__HAL_RCC_GPIOB_CLK_ENABLE();              //使能GPIOB的时钟GPIO_Init.Mode = GPIO_MODE_AF_OD;           //复用开漏输出GPIO_Init.Pin = GPIO_PIN_6 | GPIO_PIN_7;    //PB6和PB7GPIO_Init.Speed = GPIO_SPEED_FREQ_LOW;      //最大输出速度:低HAL_GPIO_Init(GPIOB, &GPIO_Init);}else if(hi2c->Instance == I2C2){}
}

②I2C.h文件的代码如下

#ifndef __I2C_H
#define __I2C_H#include "stm32f1xx_hal.h"
extern I2C_HandleTypeDef hi2c1;                            //I2C初始化结构体
void I2C1_Init(void);#endif

③main.c文件的代码如下

#include "stm32f1xx_hal.h"
#include "STM32_RCC_Init.h"
#include "UART.h"
#include "I2C.h"
#include "Key.h"#define AT24C02_Address 0xA0uint8_t WriteData[8] = {1,2,3,4,5,6,7,8};
uint8_t ReadData[8];int main(void){HAL_Init();HSE_RCC_Init(); UART1_Init(115200);I2C1_Init();Key_GPIO_Init();printf("启动判断!\r\n");while(1){switch(Key_Scan()){case 1://按键PB0按下if(HAL_I2C_IsDeviceReady(&hi2c1, AT24C02_Address, 20, 1000) == HAL_OK){/* 存储器模式:对AT24C02的页进行写,且开启写入完成中断 */HAL_I2C_Mem_Write_IT(&hi2c1, AT24C02_Address, 0, I2C_MEMADD_SIZE_8BIT, WriteData, 8);}break;case 2://按键PB1按下if(HAL_I2C_IsDeviceReady(&hi2c1, AT24C02_Address, 20, 1000) == HAL_OK){/* 存储器模式:对AT24C02的页进行读,且开启读取完成中断 */HAL_I2C_Mem_Read_IT(&hi2c1, AT24C02_Address, 0, I2C_MEMADD_SIZE_8BIT, ReadData, 8);}break;      }}	
}

④stm32f1xx_it.c文件的代码如下

#include "stm32f1xx_hal.h"   
#include "stm32f1xx_it.h" 
#include "I2C.h" 
#include "UART.h"/*** I2C1中断服务函数 */
void I2C1_EV_IRQHandler(void)
{HAL_I2C_EV_IRQHandler(&hi2c1);//中断服务总函数
}/******************* 下面的中断的回调函数 ***************************/
/*** 存储器模式:I2C1主机发送完成中断回调函数*/
void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c)
{if(hi2c->Instance == I2C1){printf("发送完成了!\r\n");}else if(hi2c->Instance == I2C2){}
}/*** 存储器模式:I2C1主机读取完成中断回调函数*/
extern uint8_t ReadData[8];
void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c)
{if(hi2c->Instance == I2C1){printf("读取完成了!\r\n");for(uint8_t i = 0; i<8; i++){printf("ReadData[%d] = %d\r\n",i,ReadData[i]);}}else if(hi2c->Instance == I2C2){}
}

在这里插入图片描述

4、I2C使用DMA式写读AT24C02一页数据

实验要求:连接PB0的按键按下后,单片机主机向从机AT24C02写入数据。连接PB1的按键按下后,主机向从机AT24C02读取数据,然后通过串口打印。
在这里插入图片描述I2C的DMA非常的难用,需要配置I2C的NVIC中断和配置I2C的中断函数。才会调用I2C的DMA中断。还不知直接使用I2C的中断回调函数。
①I2C.c文件的代码如下

#include "I2C.h"/*** @brief:I2C1初始化函数*/
I2C_HandleTypeDef hi2c1;                            //I2C初始化结构体
void I2C1_Init(void)
{/* 1、对I2C1进行初始化 */__HAL_RCC_I2C1_CLK_ENABLE();                    //使能I2C1的时钟hi2c1.Instance = I2C1;                          //选择I2C1hi2c1.Init.ClockSpeed = 100000;                 //通信速率100K,标志模式HAL_I2C_Init(&hi2c1);/* 配置I2C1的NVIC */HAL_NVIC_SetPriority(I2C1_EV_IRQn,3,0);HAL_NVIC_EnableIRQ(I2C1_EV_IRQn);
}/*** @brief:HAL_I2C_Init()调用此函数*/
DMA_HandleTypeDef hdma1_I2C_Tx;                     //DMA1配置结构体
DMA_HandleTypeDef hdma1_I2C_Rx;                     //DMA1配置结构体
void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c)
{GPIO_InitTypeDef GPIO_Init;                     //IO口初始化结构体if(hi2c->Instance == I2C1){/* I2C1引脚的初始化:PB6 = SCL,PB7 = SDA*/__HAL_RCC_GPIOB_CLK_ENABLE();               //使能GPIOB的时钟GPIO_Init.Mode = GPIO_MODE_AF_OD;           //复用开漏输出GPIO_Init.Pin = GPIO_PIN_6 | GPIO_PIN_7;    //PB6和PB7GPIO_Init.Speed = GPIO_SPEED_FREQ_LOW;      //最大输出速度:低HAL_GPIO_Init(GPIOB, &GPIO_Init);/* 2、初始化DMA1的通道6 */__HAL_RCC_DMA1_CLK_ENABLE();                                   //使能DMA1的时钟hdma1_I2C_Tx.Instance = DMA1_Channel6;                         //选择DMA1的通道6hdma1_I2C_Tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;   //外设站点数据宽度,8位hdma1_I2C_Tx.Init.PeriphInc = DMA_PINC_DISABLE;                //外设地址是否递增,选择不自增hdma1_I2C_Tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;      //内存站点数据宽度,8位hdma1_I2C_Tx.Init.MemInc = DMA_MINC_ENABLE;                    //内存地址是否递增,选择自增hdma1_I2C_Tx.Init.Direction = DMA_MEMORY_TO_PERIPH;            //传输方向:这里选择内存---->寄存器hdma1_I2C_Tx.Init.Mode = DMA_NORMAL;                           //计数器传输模式:选择不自动重装hdma1_I2C_Tx.Init.Priority = DMA_PRIORITY_MEDIUM;              //通道1传输优先级,选择中等__HAL_LINKDMA(&hi2c1,hdmatx,hdma1_I2C_Tx);                     //将I2C1_TX和DMA1通道6连接起来HAL_DMA_Init(&hdma1_I2C_Tx);/* 配置DMA1通道6的NVIC */HAL_NVIC_SetPriority(DMA1_Channel6_IRQn,3,0);HAL_NVIC_EnableIRQ(DMA1_Channel6_IRQn);/* 3、配置DMA1的通道7 */hdma1_I2C_Rx.Instance = DMA1_Channel7;                         //选择DMA1的通道7hdma1_I2C_Rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;   //外设站点数据宽度,8位hdma1_I2C_Rx.Init.PeriphInc = DMA_PINC_DISABLE;                //外设地址是否递增,选择不自增hdma1_I2C_Rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;      //内存站点数据宽度,8位hdma1_I2C_Rx.Init.MemInc = DMA_MINC_ENABLE;                    //内存地址是否递增,选择自增hdma1_I2C_Rx.Init.Direction = DMA_PERIPH_TO_MEMORY;            //传输方向:这里选择寄存器---->内存hdma1_I2C_Rx.Init.Mode = DMA_NORMAL;                           //计数器传输模式:选择不自动重装hdma1_I2C_Rx.Init.Priority = DMA_PRIORITY_MEDIUM;              //通道1传输优先级,选择中等__HAL_LINKDMA(&hi2c1,hdmarx,hdma1_I2C_Rx);                     //将I2C1_RX和DMA1通道7连接起来HAL_DMA_Init(&hdma1_I2C_Rx);/* 配置DMA1通道6的NVIC */HAL_NVIC_SetPriority(DMA1_Channel7_IRQn,3,0);HAL_NVIC_EnableIRQ(DMA1_Channel7_IRQn);}else if(hi2c->Instance == I2C2){}
}

②I2C.h文件的代码如下

#ifndef __I2C_H
#define __I2C_H#include "stm32f1xx_hal.h"
extern I2C_HandleTypeDef hi2c1;                            //I2C初始化结构体
extern DMA_HandleTypeDef hdma1_I2C_Tx;                     //DMA1配置结构体
extern DMA_HandleTypeDef hdma1_I2C_Rx;                     //DMA1配置结构体
void I2C1_Init(void);#endif

③main.c文件的代码如下

#include "stm32f1xx_hal.h"
#include "STM32_RCC_Init.h"
#include "UART.h"
#include "I2C.h"
#include "Key.h"#define AT24C02_Address 0xA0uint8_t WriteData[8] = {1,2,3,4,5,6,7,8};
uint8_t ReadData[8];int main(void){HAL_Init();HSE_RCC_Init(); UART1_Init(115200);I2C1_Init();Key_GPIO_Init();printf("启动判断!\r\n");while(1){switch(Key_Scan()){case 1://按键PB0按下if(HAL_I2C_IsDeviceReady(&hi2c1, AT24C02_Address, 20, 1000) == HAL_OK){/* 存储器模式:对AT24C02的页进行写,且开启DMA写入完成中断 */HAL_I2C_Mem_Write_DMA(&hi2c1, AT24C02_Address, 0, I2C_MEMADD_SIZE_8BIT, WriteData, 8);}break;case 2://按键PB1按下if(HAL_I2C_IsDeviceReady(&hi2c1, AT24C02_Address, 20, 1000) == HAL_OK){/* 存储器模式:对AT24C02的页进行读,且开启DMA读取完成中断 */HAL_I2C_Mem_Read_DMA(&hi2c1, AT24C02_Address, 0, I2C_MEMADD_SIZE_8BIT, ReadData, 8);}break;      }}	
}

④stm32f1xx_it.c文件的代码如下

#include "stm32f1xx_hal.h"   
#include "stm32f1xx_it.h" 
#include "I2C.h" 
#include "UART.h"/*** I2C1中断服务函数 */
void I2C1_EV_IRQHandler(void)
{HAL_I2C_EV_IRQHandler(&hi2c1);//中断服务总函数
}
/*** DMA1通道6的中断服务函数 */
void DMA1_Channel6_IRQHandler(void)
{HAL_DMA_IRQHandler(&hdma1_I2C_Tx);
}/*** DMA1通道7的中断服务函数 */
void DMA1_Channel7_IRQHandler(void)
{HAL_DMA_IRQHandler(&hdma1_I2C_Rx);
}
/******************* 下面的中断的回调函数 ***************************/
/*** 存储器模式:I2C1的DMA发送完成中断回调函数*/
void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c)
{if(hi2c->Instance == I2C1){printf("发送完成了!\r\n");}else if(hi2c->Instance == I2C2){}
}/*** 存储器模式:I2C1的DMA读取完成中断回调函数*/
extern uint8_t ReadData[8];
void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c)
{if(hi2c->Instance == I2C1){printf("读取完成了!\r\n");for(uint8_t i = 0; i<8; i++){printf("ReadData[%d] = %d\r\n",i,ReadData[i]);}}else if(hi2c->Instance == I2C2){}
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch:减少 Elastic 容器镜像中的 CVE(常见的漏洞和暴露)

作者&#xff1a;来自 Elastic Maxime Greau 在这篇博文中&#xff0c;我们将讨论如何通过在 Elastic 产品中切换到最小基础镜像并优化可扩展漏洞管理程序的工作流程来显著减少 Elastic 容器镜像中的常见漏洞和暴露 (Common Vulnerabilities and Exposures - CVEs)。 基于 Chai…

【AI学习】Transformer深入学习(二):从MHA、MQA、GQA到MLA

前面文章&#xff1a; 《Transformer深入学习&#xff08;一&#xff09;&#xff1a;Sinusoidal位置编码的精妙》 一、MHA、MQA、GQA 为了降低KV cache&#xff0c;MQA、GQA作为MHA的变体&#xff0c;很容易理解。 多头注意力&#xff08;MHA&#xff09;&#xff1a; 多头注…

使用python调用翻译大模型实现本地翻译【exe客户端版】

以前分享过一个 关于python 部署 网页端的 翻译大模型的 文章 有兴趣的小伙伴可以去看一下 https://blog.csdn.net/Drug_/article/details/144488795 今天就再分享一个 使用python 来制作一个 exe 客户端版的 本地大模型。 实际也很简单 只不过把 用 fastApi 框架 做的 网页端…

python3GUI--智慧交通监控与管理系统 By:PyQt5

文章目录 一&#xff0e;前言二&#xff0e;预览三&#xff0e;软件组成&技术难点1.软件组成结构2.技术难点3.项目结构 四&#xff0e;总结 大小&#xff1a;35.5 M&#xff0c;软件安装包放在了这里! 一&#xff0e;前言 博主高产&#xff0c;本次给大家带来一款我自己使…

JavaVue-Get请求 数组参数(qs格式化前端数据)

前言 现在管理系统&#xff0c;像若依&#xff0c;表格查询一般会用Get请求&#xff0c;把页面的查询条件传递给后台。其中大部分页面会有日期时间范围查询这时候&#xff0c;为了解决请求参数中的数组文件&#xff0c;前台就会在请求前拦截参数中的日期数组数据&#xff0c;然…

Vue2/Vue3使用DataV

Vue2 注意vue2与3安装DataV命令命令是不同的Vue3 DataV - Vue3 官网地址 注意vue2与3安装DataV命令命令是不同的 vue3vite 与 Vue3webpack 对应安装也不同vue3vite npm install kjgl77/datav-vue3全局引入 // main.ts中全局引入 import { createApp } from vue import Da…

RocketMQ消费者如何消费消息以及ack

1.前言 此文章是在儒猿课程中的学习笔记&#xff0c;感兴趣的想看原来的课程可以去咨询儒猿课堂 这篇文章紧挨着上一篇博客来进行编写&#xff0c;有些不清楚的可以看下上一篇博客&#xff1a; https://blog.csdn.net/u013127325/article/details/144934073 2.broker是如何…

高等数学学习笔记 ☞ 无穷小比较与等价无穷小替换

1. 无穷小比较 1. 本质&#xff1a;就是函数的极限趋于0时的速度&#xff0c;谁快谁慢的问题。 2. 定义&#xff1a;若是在同一自变量的变化过程中的无穷小&#xff0c;且&#xff0c;则&#xff1a; ①&#xff1a;若&#xff0c;则称是比的高阶无穷小&#xff0c;记作&…

django StreamingHttpResponse fetchEventSource实现前后端流试返回数据并接收数据的完整详细过程

django后端环境介绍&#xff1a; Python 3.10.14 pip install django-cors-headers4.4.0 Django5.0.6 django-cors-headers4.4.0 djangorestframework3.15.2 -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple 总环境如下&#xff1a; Package Version -…

Kafka为什么快(高性能的原因)

我们知道&#xff0c;Kafka 是基于磁盘存储的&#xff0c;但它却又具有高性能、高吞吐、低延时等特点&#xff0c;吞吐量可达几十上百万。那么 Kafka 这么快的原因是什么呢&#xff1f; Kafka 高性能主要取决于以下几方面&#xff1a; &#xff08;1&#xff09;消息批处理压缩…

Luma AI 简单几步生成视频

简单几步生成视频 登录我们的 AceDataPlatform 网站&#xff0c;按照下图所示即可生成高质量的视频&#xff0c;同时&#xff0c;我们也提供了简单易用的 API 方便集成调用&#xff0c;可以查看 Luma API了解详情 技术介绍 我们使用了 Luma 的技术&#xff0c;实现了上面的图…

Postman[7] 内置动态参数及自定义的动态参数

postman 内置动态参数和自定义的动态参数 1.内置动态参数 格式&#xff1a;{{$参数名}} 1.1时间戳 {{$timestamp}} //生成当前时间的时间戳 1.2随机整数 {{$randomint}} //生成0-1000之间的随机数 1.3GUID字符串 {{$guid}} //生成随机GUID字符串 2.自定义动态参数 格式…

Excel VBA 自动填充空白并合并相同值的解决方案

文章目录 Excel VBA: 自动填充空白并合并相同值的解决方案问题背景解决方案1. VBA代码实现2. 代码说明3. 使用方法4. 注意事项 扩展优化总结 Excel VBA: 自动填充空白并合并相同值的解决方案 问题背景 在Excel中经常会遇到这样的数据处理需求&#xff1a;一列数据中存在多个空…

STM32-笔记32-ESP8266作为服务端

esp8266作为服务器的时候&#xff0c;这时候网络助手以客户端的模式连接到esp8266&#xff0c;其中IP地址写的是esp8266作为服务器时的IP地址&#xff0c;可以使用ATCIFSR查询esp8266的ip地址&#xff0c;端口号默认写333。 当esp8266作为服务器的时候&#xff0c;需要完成哪些…

JavaScript性能

随着应用规模的增长&#xff0c;JavaScript 性能的优化变得尤为重要。这篇文章将分享 10 个实用的优化技巧&#xff0c;帮助开发者提升前端性能。 减少 DOM 操作 操作 DOM 是性能瓶颈。将多个操作合并到一个操作中&#xff0c;或者使用虚拟 DOM&#xff08;如 React&#xff…

组网实训实现

小型单元网络实现 IP划分&#xff1a; 外网:172.1.1.0/24 172.1.2.0/24 内网&#xff1a;基于192.168.3.0/24的子网划分 综合办公楼&#xff1a;192.168.3.00 000000 /26&#xff08;192.168.3.0-192.168.3.63&#xff09; 综合一楼&#xff1a;192.168.3.0000 0000 /28&…

GIT 企业级开发学习 1_基本操作

本节主要命令&#xff1a; git init ls 不能列出 .git ls -a 列出 .git 创建本地仓库 1. 初始化 Git 仓库 git init • 初始化一个新的 Git 仓库&#xff0c;在当前目录下生成一个 .git 隐藏文件夹&#xff0c;用于存储版本控制信息。 2. 查看隐藏文件 ls -a • 使用 ls …

Elasticsearch:利用 AutoOps 检测长时间运行的搜索查询

作者&#xff1a;来自 Elastic Valentin Crettaz 了解 AutoOps 如何帮助你调查困扰集群的长期搜索查询以提高搜索性能。 AutoOps 于 11 月初在 Elastic Cloud Hosted 上发布&#xff0c;它通过性能建议、资源利用率和成本洞察、实时问题检测和解决路径显著简化了集群管理。 Au…

《learn_the_architecture_-_generic_interrupt_controller_v3_and_v4__lpisn》学习笔记

1.LPI&#xff08;Locality-specific Peripheral Interrupts&#xff09;是一种基于消息的中断&#xff08;Message Signaled Interrupt&#xff0c;MSI&#xff09;&#xff0c;由中断翻译服务(ITS)提供翻译。这是因为LPI的设计目标是为系统中大量的设备提供高效的中断管理&am…

SD下载、安装、使用、卸载-Stable Diffusion整合包v4.10发布!

目录 前言概述 SD安装1、安装软件2、启动3、配置4、运行5、测试 导入SD模型【决定画风】常用模型下载安装模型 SD卸载SD文生图提示词提示词使用技巧提示词的高级使用技巧强调关键词 前言 我向来不喜欢搞一些没有用的概念&#xff0c;所以直接整理可能用到的东西。 sd简单的说…