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

细说STM32F407单片机通过IIC读写EEPROM 24C02

目录

一、操作说明 

二、工程配置

1、时钟、DEBUG、GPIO、USART6、NVIC、Code Generator

2、 IIC2

(1)Master Features组,主设备参数

(2)Slave Features组,从设备参数

三、软件设计

1、KELED

2、EEPROM

(1)24cxx.c

(2)24cxx.h

3、main.c

四、下载与运行


        本文旨在通过使用STM32F407的IIC总线读写 EEPROM 24C02。

        一些细节可以参考本文作者写的其他文章。

        参考文章1:细说STM32F407单片机轮询方式读写SPI FLASH W25Q16BV-CSDN博客  https://wenchm.blog.csdn.net/article/details/144587209

         参考文章2,细说STM32F407单片机IIC总线基础知识-CSDN博客  https://wenchm.blog.csdn.net/article/details/144717358

一、操作说明 

        项目使用旺宝红龙开发板,STM32F407ZGT6 KIT V1.0。 使用开发板上的按键S2、S3、S4、S5,依次按下诸键后执行如下操作,并且使用开发板上的LED灯,依次显示操作状态。S6是复位键。

[S2]KeyUp   = Write a number     LED1
[S3]KeyDown = Read the number    LED2
[S4]KeyLeft = Write a string     LED3
[S5]KeyRight= Read the string    LED4

二、工程配置

1、时钟、DEBUG、GPIO、USART6、NVIC、Code Generator

        与参考文章2相同。

        I2C的中断事件主要是表示传输过程和错误的一些事件,由于I2C通信是一种应答式通信,与其他外设的轮询式操作类似,本例不开启I2C2的中断。I2C也具有DMA功能,但是24C02操作的数据量小,没有使用DMA的必要。如果需要使用I2C接口的中断或DMA数据传输功能,可看参考文章中介绍的中断方式和DMA方式相关函数。 

2、 IIC2

        占用管脚PF0、PF1。默认全部设置。

(1)Master Features组,主设备参数

  • I2C Speed Mode,速度模式。可选标准模式(Standard Mode)或快速模式(Fast Mode)。
  • I2C Clock Speed (Hz),I2C时钟速度。标准模式最大值为100kHz,快速模式最大值为400kHz。
  • Fast Mode Duty Cycle,快速模式占空比。选择快速模式后这个参数会出现,用于设置时钟信号的占空比,是一个周期内低电平与高电平的时间比,有2:1和16:9两种选项。

        本示例中,速度模式选择标准模式。

(2)Slave Features组,从设备参数

  • Clock No Stretch Mode,禁止时钟延长。设置为Disabled表示允许时钟延长。
  • Primary AddressLength selection,设备主地址长度。可选7-bit或10-bit,本例选择7-bit。
  • DualAddress Acknowledge,双地址确认。从设备可以有两个地址,如果设置为Enabled。还会出现一个Secondary slave address参数,用于设置从设备副地址。
  • Primary slave address,从设备主地址。设置从设备主地址,作为I2C从设备时才需要设置。
  • General Call address detection,广播呼叫检测。设置为Disabled表示禁止广播呼叫,不对地址0x00应答;否则,就是允许广播呼叫,对地址0x00应答。

       STM32F407是I2C主设备,无须设置从设备地址。24C02是I2C从设备,其从设备地址是0xA0。 

三、软件设计

1、KELED

        keyled.c和keyled.h与参考文章相同。

2、EEPROM

       在项目中创建EEPROM文件夹,并在其中设计24cxx.c和24cxx.h。

        为便于程序的移植,在文件24cxx.h中定义一个宏I2C_HANDLE替代hi2c2。如果使用了不同的I2C接口,只需修改这个宏定义即可,而I2C接口的外设初始化由CubeMX自动生成的函数完成。在24cxx.h中还定义了表示24C02地址的宏DEV_ADDR_24CXX,如果实际电路中的24C02的I2C地址被修改了,修改这个宏即可

        在文件24cxx.h中定义了5个函数,前面4个都是直接封装I2C的HAL传输函数实现的,最后1个函数EP24C_WriteLongData()能自动将一个长的数据拆分为多个页(每页8字节)写入,这5个函数都使用I2C的阻塞式存储器数据传输函数。

(1)24cxx.c


/* 文件: 24cxx.c* 描述: 24C02驱动程序源程序文件*/#include "24cxx.h"
#define	EP24C_TIMEOUT 200						//超时等待时间,单位:ms
#define	EP24C_MEMADD_SIZE I2C_MEMADD_SIZE_8BIT  //存储器地址大小,8位地址//检查设备是否准备好I2C通讯,返回HAL_OK 表示OK
HAL_StatusTypeDef EP24C_IsDeviceReady(void)
{uint32_t Trials=10;		//尝试次数HAL_StatusTypeDef result=HAL_I2C_IsDeviceReady(&I2C_HANDLE,DEV_ADDR_24CXX,Trials,EP24C_TIMEOUT);return result;
}//向任意地址写入一个字节的数据, memAddr是存储器内部地址,byteData是需要写入的1个字节的数据
HAL_StatusTypeDef EP24C_WriteOneByte(uint16_t memAddress,uint8_t byteData)
{HAL_StatusTypeDef result=HAL_I2C_Mem_Write(&I2C_HANDLE,DEV_ADDR_24CXX,memAddress,EP24C_MEMADD_SIZE,&byteData,1,EP24C_TIMEOUT);return	result;
}//从任意地址读出一个字节的数据, memAddr是存储器内部地址,byteData是读出的1个字节的数据,若返回HAL_OK表示读取成功
HAL_StatusTypeDef EP24C_ReadOneByte(uint16_t memAddress,uint8_t *byteData)
{HAL_StatusTypeDef result=HAL_I2C_Mem_Read(&I2C_HANDLE,DEV_ADDR_24CXX,memAddress,EP24C_MEMADD_SIZE,byteData,1,EP24C_TIMEOUT);return result;
}//连续读取数据,任意地址,任意长度,不受页的限制
HAL_StatusTypeDef EP24C_ReadBytes(uint16_t memAddress,uint8_t *pBuffer,uint16_t bufferLen)
{if(bufferLen>MEM_SIZE_24CXX)	//超过总存储容量return HAL_ERROR;HAL_StatusTypeDef result=HAL_I2C_Mem_Read(&I2C_HANDLE,DEV_ADDR_24CXX,memAddress,EP24C_MEMADD_SIZE,pBuffer,bufferLen,EP24C_TIMEOUT);return result;
}//限定在一个页内写入连续数据,最多8字节。任意起始地址,但是起始地址+数据长度不能超过页边界
HAL_StatusTypeDef EP24C_WriteInOnePage(uint16_t memAddress,uint8_t *pBuffer,uint16_t bufferLen)
{if(bufferLen>PAGE_SIZE_24CXX)	//数据长度不能大于页的大小return HAL_ERROR;HAL_StatusTypeDef result=HAL_I2C_Mem_Write(&I2C_HANDLE,DEV_ADDR_24CXX,memAddress,EP24C_MEMADD_SIZE,pBuffer,bufferLen,EP24C_TIMEOUT);return result;
}//写任意长的数据,可以超过8字节,但数据地址必须从页首开始,即 8*N。自动分解为多次写入
HAL_StatusTypeDef EP24C_WriteLongData(uint16_t memAddress,uint8_t *pBuffer,uint16_t bufferLen)
{if(bufferLen>MEM_SIZE_24CXX)	//超过总存储容量return HAL_ERROR;HAL_StatusTypeDef result=HAL_ERROR;if(bufferLen<=PAGE_SIZE_24CXX)	//不超过1个page,直接写入后退出{result=HAL_I2C_Mem_Write(&I2C_HANDLE,DEV_ADDR_24CXX,memAddress,EP24C_MEMADD_SIZE,pBuffer,bufferLen,EP24C_TIMEOUT);return result;}uint8_t *pt=pBuffer;			//临时指针,不能改变传入的指针uint16_t pageCount=bufferLen/PAGE_SIZE_24CXX;	//Page个数for(uint16_t i=0; i<pageCount; i++)	//一次写入一个page的数据{result=HAL_I2C_Mem_Write(&I2C_HANDLE,DEV_ADDR_24CXX,memAddress,EP24C_MEMADD_SIZE,pt,PAGE_SIZE_24CXX,EP24C_TIMEOUT);pt += PAGE_SIZE_24CXX;memAddress += PAGE_SIZE_24CXX;HAL_Delay(5);					//必须有延时,以等待页写完if (result != HAL_OK)return result;}uint16_t leftBytes=bufferLen % PAGE_SIZE_24CXX;  //余数if (leftBytes>0)					//写入剩余的数据result=HAL_I2C_Mem_Write(&I2C_HANDLE,DEV_ADDR_24CXX,memAddress,EP24C_MEMADD_SIZE,pt,leftBytes,EP24C_TIMEOUT);return result;
}

(2)24cxx.h


/**  文件名:24cxx.h* 	功能描述: 24C02 EEPROM驱动程序,使用HAL库** 	(1)24C02是 256字节EEPROM,可以单个字节读写,连续读写时按页读写,每页8字节。所以,按页读写时最多8字节,页号0--31** 	(2)连续写入数据时要注意不要超过页的边界,否则从页的开始处重新写,会覆盖原来的内容。** 	(3)24C02地址是 0b1010xxxy, 其中xxx由芯片的地址引脚A2,A1,A0决定,一般接地,所以是0xA0, HAL库在读写时自动在最后一位写0或1进行读或写操作** 	(4)24C02的地址数据长度是8位,使用宏定义符号I2C_MEMADD_SIZE_8BIT*/#ifndef __24cxx_H
#define __24cxx_H#include "stm32f4xx_hal.h"
#include "i2c.h" 				//i2c.h中定义了hi2c2
/* 两个与硬件相关的定义,   */
#define I2C_HANDLE hi2c2		//I2C外设对象变量,利用i2c.h中定义的hi2c2
#define	DEV_ADDR_24CXX 0x00A0	//24C02的写地址
// EEPROM存储器参数
#define	PAGE_SIZE_24CXX 0x0008	//24C02的Page大小为8字节
#define	MEM_SIZE_24CXX (uint16_t)256 //24C02总共容量字节数,8*32=256字节//检查设备是否准备好
HAL_StatusTypeDef EP24C_IsDeviceReady(void);//在任意地址写入一个字节
HAL_StatusTypeDef EP24C_WriteOneByte(uint16_t memAddress, uint8_t byteData);//在任意地址读出一个字节
HAL_StatusTypeDef EP24C_ReadOneByte(uint16_t memAddress, uint8_t *byteData);//连续读取数据,任意地址,任意长度,不受页的限制
HAL_StatusTypeDef EP24C_ReadBytes(uint16_t memAddress, uint8_t *pBuffer, uint16_t bufferLen);/*限定在一个页内写入连续数据,最多8字节。任意起始地址,*但是起始地址+数据长度不能超过页边界,即不能超过地址8*N-1 */
HAL_StatusTypeDef EP24C_WriteInOnePage(uint16_t memAddress, uint8_t *pBuffer, uint16_t bufferLen);//写任意长的数据,可以超过8字节,但数据地址必须从页首开始,即 8*N
HAL_StatusTypeDef EP24C_WriteLongData(uint16_t memAddress, uint8_t *pBuffer, uint16_t bufferLen);#endif

3、main.c

/* USER CODE BEGIN Includes */
#include "keyled.h"
#include "24cxx.h"
#include <stdio.h>
/* USER CODE END Includes */
/* USER CODE BEGIN 2 */printf("Demo17_1:I2C Interface\r\n");printf("24C02:EEPROM, 256 bytes\r\n");printf("8 bytes/page, 32 pages\r\n");printf("I2C Device Address=0xA0\r\n");if (EP24C_IsDeviceReady() == HAL_OK)printf("Device is ready.\r\n");//显示菜单printf("[S2]KeyUp   = Write a number\r\n");printf("[S3]KeyDown = Read the number\r\n");printf("[S4]KeyLeft = Write a string\r\n");printf("[S5]KeyRight= Read the string\r\n");// MCU output low level LED light is onLED1_OFF();LED2_OFF();LED3_OFF();LED4_OFF();/* USER CODE END 2 */
  /* USER CODE BEGIN WHILE */uint8_t num1 = 107,num2;uint16_t addr_any = 4;	//任意地址, 0-255uint16_t addr_page = 2*8;	//Page2起始地址//uint8_t infoStr[50];	//用于生成显示信息字符��?while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */KEYS curKey = ScanPressedKey(KEY_WAIT_ALWAYS);switch(curKey){case KEY_UP:{if (EP24C_WriteOneByte(addr_any,num1) == HAL_OK)printf("Write %d at Address %d.\r\n",num1,addr_any);LED1_ON();LED2_OFF();LED3_OFF();LED4_OFF();}break;case KEY_DOWN:{if (EP24C_ReadOneByte(addr_any,&num2) == HAL_OK)printf("Read out %d at Address %d.\r\n",num2,addr_any);LED1_OFF();LED2_ON();LED3_OFF();LED4_OFF();}break;case KEY_LEFT:{uint8_t strIn[] = "University of Petroleum";	//自动加'\0'if (EP24C_WriteLongData(addr_page,strIn,sizeof(strIn)) == HAL_OK)printf("Write string from Page2:%s\r\n",strIn);LED1_OFF();LED2_OFF();LED3_ON();LED4_OFF();}break;case KEY_RIGHT:{uint8_t strOut[50];if (EP24C_ReadBytes(addr_page,strOut,50) == HAL_OK)printf("Read string from Page2:%s\r\n",strOut);LED1_OFF();LED2_OFF();LED3_OFF();LED4_ON();}break;case KEY_NONE:{LED1_OFF();LED2_OFF();LED3_OFF();LED4_OFF();}break;default:break;}printf("** Reselect menu or reset **\r\n");HAL_Delay(500);	//延时500,消除按键后抖动}/* USER CODE END 3 */
}

        上述程序中有一个I2C_HandleTypeDef类型的结构体变量hi2c2,这是表示I2C2接口的外设对象变量,24C02的驱动程序文件24cxx.c中就使用这个外设对象变量访问I2C2接口。函数MX_I2C2_Init()中对hi2c2的各成员变量赋值,各赋值语句与STM32CubeIDE里的设置是对应的。完成hi2c2的赋值后,执行HAL_I2C_Init(&hi2c2)对I2C2接口进行初始化。

        HAL_I2C_MspInit()是I2C接口的MSP初始化函数,在函数HAL_I2C_Init()里被调用。函数HAL_I2C_MspInit()的主要功能是对I2C2接口的复用引脚PF0和PF1进行GPIO引脚配置。

         由STM32CubeIDE自动生成的代码,这里省略。

/* USER CODE BEGIN 4 *///串口打印
int __io_putchar(int ch)
{HAL_UART_Transmit(&huart6,(uint8_t*)&ch,1,0xFFFF);return ch;
}
/* USER CODE END 4 */

四、下载与运行

        下载,运行。依次按下开发板上的S2、S3、S4、S5按键,执行写入1字节,读出1字节、写入页字符串,读出页字符串。按下S6键,执行复位。

相关文章:

细说STM32F407单片机通过IIC读写EEPROM 24C02

目录 一、操作说明 二、工程配置 1、时钟、DEBUG、GPIO、USART6、NVIC、Code Generator 2、 IIC2 &#xff08;1&#xff09;Master Features组&#xff0c;主设备参数 &#xff08;2&#xff09;Slave Features组&#xff0c;从设备参数 三、软件设计 1、KELED 2、E…...

【AimRT】现代机器人通信中间件 AimRT

目录 一、什么是AimRT二、AimRT与ROS22.1 定位与设计2.2 组成与通信方式对比 三、AimRT基本概念3.1 Node、Pkg 和 Module3.2 Protocol、Channel、Rpc 和 Filter3.3 App模式 和 Pkg模式3.4 Executor3.5 Plugin 一、什么是AimRT AimRT 是智元机器人公司自主研发的一款机器人通信…...

Unity 读Excel,读取xlsx文件解决方案

Unity读取表格数据 效果&#xff1a; 思路&#xff1a; Unity可以解析Json&#xff0c;但是读取Excel需要插件的帮助&#xff0c;那就把这个功能分离开&#xff0c;读表插件就只管读表转Json&#xff0c;Unity就只管Json解析&#xff0c;中间需要一个存储空间&#xff0c;使用…...

R基于贝叶斯加法回归树BART、MCMC的DLNM分布滞后非线性模型分析母婴PM2.5暴露与出生体重数据及GAM模型对比、关键窗口识别

全文链接&#xff1a;https://tecdat.cn/?p38667 摘要&#xff1a;在母婴暴露于空气污染对儿童健康影响的研究中&#xff0c;常需对孕期暴露情况与健康结果进行回归分析。分布滞后非线性模型&#xff08;DLNM&#xff09;是一种常用于估计暴露 - 时间 - 响应函数的统计方法&am…...

【信息系统项目管理师】高分论文:论信息系统项目的沟通管理(信息管理服务一体化平台)

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论文一、事预则立,规划沟通管理二、提升支持,管理沟通三、观察偏差,监督沟通论文 2022年2月,我公司承建某省退役军人信息管理服务一体化平台项目,由于本人具有较丰富的项目管理经验,同时也是一名退伍军人…...

物联网工厂可视化监控平台:为智能制造打造的可视化大屏

01行业背景 随着技术的不断进步&#xff0c;物联网&#xff08;IoT&#xff09;已经成为推动数字化转型的核心力量。物联网通过连接各种设备和传感器&#xff0c;实现数据的实时收集、传输和分析&#xff0c;为各行各业带来了革命性的变化。随着5G、云计算、大数据等技术的成熟…...

3、redis的高可用

主从复制 主从复制&#xff1a;这是redis高可用的基础。哨兵模式和集群都是建立在此基础之上。 主从模式和数据库的主从模式是一样的&#xff0c;主负责写入&#xff0c;然后把写入的数据同步到从&#xff0c;从节点只能读不能写。read only。 不能做高可用的切换&#xff…...

数据结构--顺序表(详解)

欢迎大家来到我的博客~欢迎大家对我的博客提出指导&#xff0c;有错误的地方会改进的哦~点击这里了解更多内容 目录 一、线性表二、顺序表 一、线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结…...

Day62 图论part11

Floyd 算法精讲 Floyd 算法代码很简单&#xff0c;但真正理解起原理 还是需要花点功夫&#xff0c;大家在看代码的时候&#xff0c;会发现 Floyd 的代码很简单&#xff0c;甚至看一眼就背下来了&#xff0c;但我为了讲清楚原理&#xff0c;本篇还是花了大篇幅来讲解。 代码随想…...

git clone 超时

git clone 超时 参考 https://blog.csdn.net/qq_45906972/article/details/142214187?utm_mediumdistribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-142214187-blog-137158358.235v43pc_blog_bottom_relevance_base8&spm1001.2101.3001.…...

WPF编程excel表格操作

WPF编程excel表格操作 摘要NPOI安装封装代码测试代码 摘要 Excel操作几种方式 使用开源库NPOI(常用&#xff0c;操作丰富)使用Microsoft.Office.Interop.Excel COM组件(兼容性问题)使用OpenXml(效率高)使用OleDb(过时) NPOI安装 封装代码 using System; using System.IO; u…...

Day10补代码随想录 理论基础|232.用栈实现队列|225.用队列实现栈|20.有效的括号|1047.删除字符串中的所有相邻重复项

栈和队列理论基础 抽象认识 栈是先进后出(FIFO)&#xff0c;队列是先进先出(LIFO) 队首(先进))队尾(后进)栈顶(后进)栈底(先进) 栈(Stack) 只在一端进行进出操作(只在一端进一端出)像个篮球框&#xff0c;取用篮球从一端进出。 /进栈 int a[1000];//足够大的栈空间 int top-1…...

【Devops】什么是Devops?(Development+Operations)和运维的区别?

DevOps&#xff08;Development Operations&#xff09;是一种将开发&#xff08;Development&#xff09;和运维&#xff08;Operations&#xff09;团队结合在一起的文化和实践&#xff0c;目的是通过自动化、协作和持续反馈来加快软件的开发、部署和运维的周期&#xff0c;…...

基于NodeMCU的物联网电灯控制系统设计

最终效果 基于NodeMCU的物联网电灯控制系统设计 小程序关灯 上图展现了小程序关灯过程的数据传输过程&#xff1a;用户下达关灯指令→小程序下发关灯指令→MQTT服务器接收关灯指令→下位机接收与处理关灯指令。 项目介绍 该项目是“物联网实验室监测控制系统设计&#xff08;…...

Linux驱动开发 IIC I2C驱动 编写APP访问EEPROM AT24C02

在嵌入式开发中&#xff0c;I2C&#xff08;Inter-Integrated Circuit&#xff09;是一种常用的串行通信协议&#xff0c;广泛应用于与外设&#xff08;如 EEPROM、传感器、显示屏等&#xff09;进行数据交换。AT24C02 是一种常见的 I2C EEPROM 存储器&#xff0c;它提供 2Kbit…...

Linux应用软件编程-多任务处理(线程)

线程&#xff1a;轻量级的进程&#xff0c;线程的栈区独立&#xff08;8M&#xff09;&#xff0c;与同一进程中的其他线程共用进程的堆区&#xff0c;数据区&#xff0c;文本区。 进程是操作系统资源分配的最小单位&#xff1b;线程是cpu任务调度的最小单位。 1. 线程的创建…...

VITUREMEIG | AR眼镜 算力增程

根据IDC发布的《2024年第三季度美国AR/VR市场报告》显示&#xff0c;美国市场AR/VR总出货量增长10.3%。其中&#xff0c;成立于2021年的VITURE增长速度令人惊艳&#xff0c;同比暴涨452.6%&#xff0c;成为历史上增长最快的AR/VR品牌。并在美国AR领域占据了超过50%的市场份额&a…...

Jenkins管理多版本python环境

场景&#xff1a;项目有用到python3.8和3.9&#xff0c;python环境直接安装在jenkins容器内。 1、进入jenkins容器 docker exec -it jenkins /bin/bash 2、安装前置编译环境 # 提前安装&#xff0c;以便接下来的配置操作 apt-get -y install gcc automake autoconf libtool ma…...

Flutter富文本实现学习

Flutter 代码如何实现一个带有富文本显示和交互的页面。 前置知识点学习 RealRichText RealRichText 和 ImageSpan 不是 Flutter 框架中内置的组件&#xff0c;而是自定义的组件或来自第三方库。这些组件的实现可以提供比标准 RichText 更丰富的功能&#xff0c;比如在富文本…...

如何解决 OpenAI API 连接问题:降级 urllib3 版本

如何解决 OpenAI API 连接问题&#xff1a;降级 urllib3 版本 在使用 OpenAI API 时&#xff0c;很多开发者可能会遇到连接问题&#xff0c;特别是在使用 Python 代码与 OpenAI 进行交互时。常见的错误包括 ProxyError、SSLError 和 MaxRetryError&#xff0c;它们通常表示在通…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...