STM32F4系列单片机GPIO概述和寄存器分析
第2章 STM32-GPIO口
2.1 GPIO口概述
通用输入/输出口
2.1.1 GPIO口作用
GPIO是单片机与外界进行数据交流的窗口。
2.1.2 STM32的GPIO口
在51单片机中,IO口,以数字进行分组(P0~P3),每一组里面又有8个IO口。
在STM32里面,GPIO口,以英文字母进行分组,针对M4系列最多可以分为AI组,而在我们现在使用的stm32f407zgt6这款芯片一共分成AG组。每一组里面有16个IO口(以0~15进行编号),所以我们这款芯片一共有112个GPIO口。
并不是所以的管脚都是GPIO口
每一个GPIO口都是多功能的,在使用之前需要先配置好特定的一个功能,需要用什么功能就要配置成什么功能。
对GPIO的配置就是学习如何使用GPIO口。
对GPIO口操作其实就是操作GPIO对应的寄存器。
寄存器其实就是一段内存空间。芯片内部有很多模块,系统会给每一个模块都分配一段特定的内存空间,这些内存空间的地址其实就是这些模块的寄存器地址。每个寄存器都有自己特定的一些功能,我们往寄存器里面读写的数据也都是有一定意义的,不是随意的。如果我们想要操作一个模块做某些事情,就需要找到这个模块对应有这个功能的寄存器,往这个寄存器里面写入特定的指令数据,系统就会根据你的操作对这个模块进行控制。
补充:
变量:声明变量其实就是在内存中申请了一段内存空间,我们可以在这个内存空间进行读写操作。这个内存空间的地址是随机。
寄存器:寄存器其实也是一段内存空间,同样可以往里面进行读写操作,但是寄存器的地址是固定的,是已知的,是芯片厂家出厂时就已经固化了,不可更改的。
从上图可以知道GPIO模块寄存器边界地址和所在的总线(AHB1)
相邻两组GPIO之间的偏移量是0x0400,换句话说每组GPIO的空间大小为1024字节。
总结:
相邻GPIO组之间的偏移量为1K字节,每一组GPIO相邻寄存器之间的偏移量为0x04.
2.1.3 STM32的GPIO口特征
每个通用 I/O 端口包括 4 个 32 位配置寄存器(GPIOx_MODER、 GPIOx_OTYPER、GPIOx_OSPEEDR 和 GPIOx_PUPDR)、 2 个 32 位数据寄存器(GPIOx_IDR 和GPIOx_ODR)、 1 个 32 位置位/复位寄存器 (GPIOx_BSRR)、 1 个 32 位锁定寄存器(GPIOx_LCKR) 和 2 个 32 位复用功能选择寄存器(GPIOx_AFRH 和 GPIOx_AFRL)。
● 受控 I/O 多达 16 个
● 输出状态:推挽或开漏 + 上拉/下拉
● 从输出数据寄存器 (GPIOx_ODR) 或外设(复用功能输出)输出数据
● 可为每个 I/O 选择不同的速度
● 输入状态:浮空、上拉/下拉、模拟
● 将数据输入到输入数据寄存器 (GPIOx_IDR) 或外设(复用功能输入)
● 置位和复位寄存器 (GPIOx_BSRR),对 GPIOx_ODR 具有按位写权限
● 锁定机制 (GPIOx_LCKR),可冻结 I/O 配置
● 模拟功能
● 复用功能输入/输出选择寄存器(一个 I/O 最多可具有 16 个复用功能)
● 快速翻转,每次翻转最快只需要两个时钟周期
● 引脚复用非常灵活,允许将 I/O 引脚用作 GPIO 或多种外设功能中的一种
2.1.4 STM32的GPIO功能
根据数据手册中列出的每个 I/O 端口的特性,可通过软件将通用 I/O (GPIO) 端口的各个端口
位分别配置为多种模式:
● 输入浮空
● 输入上拉
● 输入下拉
● 模拟功能----用在模数转换/数模转换上
● 具有上拉或下拉功能的开漏输出
● 具有上拉或下拉功能的推挽输出
● 具有上拉或下拉功能的复用功能推挽
● 具有上拉或下拉功能的复用功能开漏
每个 I/O 端口位均可自由编程,但 I/O 端口寄存器必须按 32 位字、半字或字节进行访问。
GPIOx_BSRR 寄存器旨在实现对 GPIO ODR 寄存器进行原子读取/修改访问。这样便可确保
在读取和修改访问之间发生中断请求也不会有问题。
2.2 STM32的GPIO口框架(重点)
输入电路和输出电路是独立的。
2.2.1 输出配置框架分析
对 I/O 端口进行编程作为输出时:
● 输出缓冲器被打开:
— 开漏模式:输出寄存器中的“0”可激活 N-MOS,而输出寄存器中的“1”会使端
口保持高组态 (Hi-Z)(P-MOS 始终不激活)。
— 推挽模式:输出寄存器中的“0”可激活 N-MOS,而输出寄存器中的“1”可激活
P-MOS。
● 施密特触发器输入被打开
● 根据 GPIOx_PUPDR 寄存器中的值决定是否打开弱上拉电阻和下拉电阻
● 输入数据寄存器每隔 1 个 AHB1 时钟周期对 I/O 引脚上的数据进行一次采样
● 对输入数据寄存器的读访问可获取 I/O 状态
● 对输出数据寄存器的读访问可获取最后的写入值
在配置成输出模式时,输入功能并没有被关闭。
推挽输出:当配置成推挽模式时,P-MOS和N-MOS均可以工作(都被打开)
当要输出高电平‘1’时,P-MOS导通,N-MOS不导通,VDD电源正极(高电平)连接到IO引脚
当要输出低电平‘0’时,P-MOS不导通,N-MOS导通,VSS电源负极(低电平)连接到IO引脚
推挽输出即可以输出高电平也可以输出低电平
开漏输出:当配置成开漏模式时,P-MOS被关闭(高阻态),N-MOS被打开
当要输出高电平‘1’时,P-MOS不导通,N-MOS不导通,不能把高电平从输出驱动器输出出去,IO引脚的电平值取决外界环境。
当要输出低电平‘0’时,P-MOS不导通,N-MOS导通,VSS电源负极(低电平)连接到IO引脚
开漏输出只具有输出低电平的能力,不具有输出高电平的能力。
如果仍然想输出高电平‘1’,那么需要在外部电路中接一个上拉电阻
上拉电阻:电阻的一端接着电源正极,在IO口没有电流流过时,保证电阻另外一端有一个稳定高电平
下拉电阻:电阻的一端接着电源负极(GND),在IO口没有电流流过时,保证电阻另外一端有一个稳定低电平
芯片内部上拉电阻和下拉电阻都是弱上拉和弱下拉,驱动能力比较弱
2.2.2 输入配置框架分析
对 I/O 端口进行编程作为输入时:
● 输出缓冲器被关闭
● 施密特触发器输入被打开
● 根据 GPIOx_PUPDR 寄存器中的值决定是否打开上拉和下拉电阻
● 输入数据寄存器每隔 1 个 AHB1 时钟周期对 I/O 引脚上的数据进行一次采样
● 对输入数据寄存器的读访问可获取 I/O 状态
变换一下如下图:
这种情况下,配置成输入浮空(不上拉也不下拉)
这种情况下可以配置成输入上拉
这种情况下可以配置成输入下拉
2.2.3 模拟功能框架分析
对 I/O 端口进行编程作为模拟配置时:
● 输出缓冲器被禁止。
● 施密特触发器输入停用, I/O 引脚的每个模拟输入的功耗变为零。施密特触发器的输出被
强制处理为恒定值 (0)。
● 弱上拉和下拉电阻被关闭。
● 对输入数据寄存器的读访问值为“0”。
2.2.4 复用功能框架分析
对 I/O 端口进行编程作为复用功能时:
● 可将输出缓冲器配置为开漏或推挽
● 输出缓冲器由来自外设的信号驱动(发送器使能和数据)
● 施密特触发器输入被打开
● 根据 GPIOx_PUPDR 寄存器中的值决定是否打开弱上拉电阻和下拉电阻
● 输入数据寄存器每隔 1 个 AHB1 时钟周期对 I/O 引脚上的数据进行一次采样
● 对输入数据寄存器的读访问可获取 I/O 状态
2.3 STM32的GPIO口相关寄存器
2.3.1 GPIO 端口模式寄存器 (GPIOx_MODER) (x = A…I)
偏移地址: 0x00
复位值:(默认值)
● 0xA800 0000(端口 A)
● 0x0000 0280(端口 B)
● 0x0000 0000(其它端口)
位 2y:2y+1 MODERy[1:0]: 端口 x 配置位 (Port x configuration bits) (y = 0…15)
这些位通过软件写入,用于配置 I/O 方向模式。
00:输入(复位状态)
01:通用输出模式
10:复用功能模式
11:模拟模式
2.3.2 GPIO 端口输出类型寄存器 (GPIOx_OTYPER) (x = A…I)
偏移地址: 0x04
复位值: 0x0000 0000
位 31:16 保留,必须保持复位值。
位 15:0 OTy[1:0]: 端口 x 配置位 (Port x configuration bits) (y = 0…15)
这些位通过软件写入,用于配置 I/O 端口的输出类型。
0:输出推挽(复位状态)
1:输出开漏
2.3.3 GPIO 端口输出速度寄存器 (GPIOx_OSPEEDR) (x = A…I/)
偏移地址: 0x08
复位值:
● 0x0000 00C0(端口 B)
● 0x0000 0000(其它端口)
位 2y:2y+1 OSPEEDRy[1:0]: 端口 x 配置位 (Port x configuration bits) (y = 0…15)
这些位通过软件写入,用于配置 I/O 输出速度。
00: 2 MHz(低速)
01: 25 MHz(中速)
10: 50 MHz(快速)
11: 30 pF 时为 100 MHz(高速)(15 pF 时为 80 MHz 输出(最大速度))
2.3.4 GPIO 端口上拉/下拉寄存器 (GPIOx_PUPDR) (x = A…I/)
偏移地址: 0x0C
复位值:
● 0x6400 0000(端口 A)
● 0x0000 0100(端口 B)
● 0x0000 0000(其它端口)
位 2y:2y+1 PUPDRy[1:0]: 端口 x 配置位 (Port x configuration bits) (y = 0…15)
这些位通过软件写入,用于配置 I/O 上拉或下拉。
00:无上拉或下拉(浮空)
01:上拉
10:下拉
11:保留
2.3.5 GPIO 端口输入数据寄存器 (GPIOx_IDR) (x = A…I)
偏移地址: 0x10
复位值: 0x0000 XXXX(其中 X 表示未定义)
位 31:16 保留,必须保持复位值。
位 15:0 IDRy[15:0]: 端口输入数据 (Port input data) (y = 0…15)
这些位为只读形式,只能在字模式下访问。它们包含相应 I/O 端口的输入值。
2.3.6 GPIO 端口输出数据寄存器 (GPIOx_ODR) (x = A…I)
偏移地址: 0x14
复位值: 0x0000 0000
位 31:16 保留,必须保持复位值。
位 15:0 ODRy[15:0]: 端口输出数据 (Port output data) (y = 0…15)
这些位可通过软件读取和写入。
注意: 对于原子置位/复位,通过写入 GPIOx_BSRR 寄存器,可分别对 ODR 位进行置位和复
位 (x = A…I/)。
2.4 寄存器访问方法
操作GPIOA_MODE,写入data值
第一种:
*(unsigned int *)0x4002 0000=data;
第二种:
#define GPIOA_MODE *(unsigned int *)0x4002 0000
GPIOA_MODE=data;
第三种:
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE)#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE)#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE)#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE)#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE)#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE)#define GPIOH ((GPIO_TypeDef *) GPIOH_BASE)#define GPIOI ((GPIO_TypeDef ) GPIOI_BASE) typedef struct{ __IO uint32_t MODER; /!< GPIO port mode register, Address offset: 0x00 / __IO uint32_t OTYPER; /!< GPIO port output type register, Address offset: 0x04 / __IO uint32_t OSPEEDR; /!< GPIO port output speed register, Address offset: 0x08 / __IO uint32_t PUPDR; /!< GPIO port pull-up/pull-down register, Address offset: 0x0C / __IO uint32_t IDR; /!< GPIO port input data register, Address offset: 0x10 / __IO uint32_t ODR; /!< GPIO port output data register, Address offset: 0x14 / __IO uint16_t BSRRL; /!< GPIO port bit set/reset low register, Address offset: 0x18 / __IO uint16_t BSRRH; /!< GPIO port bit set/reset high register, Address offset: 0x1A / __IO uint32_t LCKR; /!< GPIO port configuration lock register, Address offset: 0x1C / __IO uint32_t AFR[2]; /!< GPIO alternate function registers, Address offset: 0x20-0x24 /} GPIO_TypeDef; 说明:GPIO_TypeDef :结构体 GPIO_TypeDef:结构体指针 #define GPIOA_BASE (AHB1PERIPH_BASE + 0x0000)#define GPIOB_BASE (AHB1PERIPH_BASE + 0x0400)#define GPIOC_BASE (AHB1PERIPH_BASE + 0x0800)#define GPIOD_BASE (AHB1PERIPH_BASE + 0x0C00)#define GPIOE_BASE (AHB1PERIPH_BASE + 0x1000)#define GPIOF_BASE (AHB1PERIPH_BASE + 0x1400)#define GPIOG_BASE (AHB1PERIPH_BASE + 0x1800)#define GPIOH_BASE (AHB1PERIPH_BASE + 0x1C00)#define GPIOI_BASE (AHB1PERIPH_BASE + 0x2000)//---------------------------------------------------------------------------------------#define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000)//---------------------------------------------------------------------------------------#define PERIPH_BASE ((uint32_t)0x40000000) 分析:#define GPIOA_BASE (AHB1PERIPH_BASE + 0x0000) ((PERIPH_BASE + 0x00020000)+0x0000) ((((uint32_t)0x40000000)+ 0x00020000)+0x0000) ((uint32_t)0x40020000) #define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)#define GPIOA ((GPIO_TypeDef *) (uint32_t)0x40020000)GPIOA—结构体常量指针 操作寄存器方法:GPIOA->MODE=data;
2.5 STM32的GPIO口相关实验
2.5.1 通用输出功能实验
通过GPIO口点亮LED灯
LED其实是发光二极管,当给阳极高电平,给阴极低电平,会让二极管正向导通,LED点亮
2.5.1.1 硬件设计
2.5.1.2 软件设计
点亮LED1,把PF6配置成普通功能推挽输出
配置流程:
\1. 配置模式寄存器(把GPIOF的MODER寄存器的第13和12位分配成01)—输出模式
\2. 配置输出类型寄存器(把GPIOF的OTYPER寄存器的第6位分配成0)—输出推挽
\3. 配置输出速度寄存器(把GPIOF的OSPEEDR寄存器的第13和12位分配成00)–低速2Mhz
\4. 配置上/下拉寄存器(把GPIOF的PUPDR寄存器的第13和12位分配成00)–浮空
点亮LED1----往GPIOF的ODR寄存器的第6位写入0
熄灭LED1----往GPIOF的ODR寄存器的第6位写入1
操作寄存器的原则:操作你要操作的相关位,而不能影响到其他位的值。
2 软件设计
点亮LED1,把PF6配置成普通功能推挽输出
配置流程:
\1. 配置模式寄存器(把GPIOF的MODER寄存器的第13和12位分配成01)—输出模式
\2. 配置输出类型寄存器(把GPIOF的OTYPER寄存器的第6位分配成0)—输出推挽
\3. 配置输出速度寄存器(把GPIOF的OSPEEDR寄存器的第13和12位分配成00)–低速2Mhz
\4. 配置上/下拉寄存器(把GPIOF的PUPDR寄存器的第13和12位分配成00)–浮空
点亮LED1----往GPIOF的ODR寄存器的第6位写入0
熄灭LED1----往GPIOF的ODR寄存器的第6位写入1
操作寄存器的原则:操作你要操作的相关位,而不能影响到其他位的值。
相关文章:

STM32F4系列单片机GPIO概述和寄存器分析
第2章 STM32-GPIO口 2.1 GPIO口概述 通用输入/输出口 2.1.1 GPIO口作用 GPIO是单片机与外界进行数据交流的窗口。 2.1.2 STM32的GPIO口 在51单片机中,IO口,以数字进行分组(P0~P3),每一组里面又有8个IO口。 在ST…...

【LeetCode刷题】--9.回文数
9.回文数 class Solution {public boolean isPalindrome(int x) {if(x < 0){return false;}int tmp x, sum 0;boolean flag false;while(x ! 0){sum sum * 10 x % 10;x / 10;}if(sum tmp){flag true;}return flag;} }...

大数据-之LibrA数据库系统告警处理(ALM-12057 元数据未配置周期备份到第三方服务器的任务)
告警解释 系统安装完成后会检查元数据是否有周期备份到第三方服务器的任务,然后每1小时会检查一次。如果元数据未配置周期备份到第三方服务器的任务,将发送严重告警。 在用户创建元数据周期备份到第三方服务器的任务后,告警消除。 告警属性…...

毅速丨嫁接打印在模具制造中应用广泛
在模具行业中,3D打印随形水路已经被广泛认可,它可以提高冷却效率,从而提高产品良率。然而,全打印模具制造的成本相对较高,因为需要使用金属3D打印机和专用材料。为了节省打印成本,同时利用3D打印的优势&…...

『亚马逊云科技产品测评』活动征文|基于next.js搭建一个企业官网
『亚马逊云科技产品测评』活动征文|基于next.js搭建一个企业官网 授权声明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 Developer Centre, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方…...

C# Winform围棋棋盘
C# Winform简单的围棋棋盘vs2008winform小游戏C#vs2010winform棋盘C#窗体小游戏 这是一个简单的围棋棋盘小游戏,使用C# Winform编写棋盘界面,玩家可以在空白的交叉点上下棋子 项目获取: 项目获取:typora: typora/img (gitee.co…...
vue使用本地图片设置为默认图
一、引用 import imgSrc /assets/common/image/xxx.png 二、赋值给变量 defaultImg:imgSrc, 三、将变量给img标签 <img :src"defaultImg:imgSrc" alt"icon"> 注意:这里直接使用路径给变量是无法实现的哟...

day17-高速缓冲区的管理机制
1.目的 用户与磁盘进行文件交互时的流程 磁盘与高速缓冲区的关系 加深块设备驱动的理解 hash 循环链表 单链表的使用方法 2.高速缓冲区的工作流程 高速缓冲区中存储这对应的块设备驱动的数据 当从块设备中读取数据的时候,OS首先会从高速缓冲区中进行检索࿰…...

文心一言 VS 讯飞星火 VS chatgpt (139)-- 算法导论11.4 3题
三、用go语言,考虑一个采用均匀散列的开放寻址散列表。当装载因子为 3/4 和 7/8 时,试分别给出一次不成功查找和一次成功查找的探查期望数上界。 文心一言: 在开放寻址法中,当散列表的装载因子超过其阈值时,会触发重…...

Java 解压文件
maven库: <!--FileUtil、ZipUtil 依赖--> <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.3.1</version> </dependency><!--IOUtils 依赖--> <depen…...

SASS/SCSS精华干货教程
目录 介绍 基本说明 特点 sass语法格式sass的语法格式一共有两种,一种是以".scss"作为拓展名,一种是以".sass"作为拓展名,这里我们只讲拓展名: 编译环境安装 Vscode安装编译插件 简单使用 sass语法扩张…...

8.jib-maven-plugin构建springboot项目镜像,docker部署配置
目录 1.构建、推送镜像 1.1 执行脚本 2.2 pom.xml配置 2.部署镜像服务 2.1 执行脚本 2.2 compose文件 3.docker stack常用命令 介绍:使用goole jib插件构建镜像,docker stack启动部署服务; 通过执行两个脚本既可以实现构建镜像、部…...

海康威视综合安防管理平台任意文件上传
系统介绍 HIKVISION iSecure Center综合安防管理平台是一套“集成化”、“智能化”的平台,通过接入视频监控、一卡通、停车场、报警检测等系统的设备,获取边缘节点数据,实现安防信息化集成与联动,公众号:web安全工具库…...

Linux环境下C++ 接入OpenSSL
接上一篇:Windows环境下C 安装OpenSSL库 源码编译及使用(VS2019)_vs2019安装openssl_肥宝Fable的博客-CSDN博客 解决完本地windows环境,想赶紧在外网环境看看是否也正常。毕竟现在只是HelloWorld级别的,等东西多了&am…...
美国网站服务器SSL证书介绍
美国网站服务器的SSL证书也是一种数字证书,由权威数字证书机构CA验证网站的身份后所颁发,可实现浏览器与网站主机之间的数据传输加密。美国网站服务器搭建的网站在安装SSL证书后会在浏览器显示安全锁标志,数据传输协议则从HTTP传统协议升级为…...

JSP命令标签 静态包含/动态包含
好 下面我们聊聊JSP中的指令标签 这边 我们来说两个 分别是 静态包含 和 动态包含 我们可以将重用性代码包含起来 更好的使用 比如 我们界面上中下 分别有三个导航栏 那么 如果你写三份 就会出现很多重复代码 而且 改起来 也很不方便 要一次改三份 口说无凭 我们来做一个小案…...

Cesium点位弹窗
1.弹窗没法向加入点位一样加入到地图内部,entity没法实现 2.使用绝对定位,将地图组件通过定位加入到地图上,注意弹窗层级一定在地图上 3.通过判断点击位置是否是点位来获取entity信息,将信息显示在弹窗 4.将点击处点位的经纬度转为…...

基于单片机16路抢答器仿真系统
**单片机设计介绍, 基于单片机16路抢答器仿真系统 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的16路抢答器仿真系统是一种用于模拟和实现抢答竞赛的系统。该系统由硬件和软件两部分组成。 硬件方面&am…...
Linux常用命令亲测总结
在实际开发中,经常会进行下位机的搭建,在搭建过程中,对于常用的LInux命令进行总结,方便自己使用 1.rm -rf 删除对应文件(字节小的) 2、ln -s 文件关联(长的关联短的。三个则关联两次࿰…...

二百零六、Flume——Flume1.9.0单机版部署脚本(附截图)
一、目的 在实际项目部署时,要实现易部署易维护,需要把安装步骤变成安装脚本实现快速部署 二、部署脚本在Linux中文件位置 文件夹中只有脚本文件flume-install.sh和tar包apache-flume-1.9.0-bin.tar.gz 三、Flume安装脚本 #!/bin/bash #获取服务器名…...
UDP:简洁高效的报文结构解析与关键注意事项
UDP(User Datagram Protocol)以其无连接、低开销的特性,成为实时应用(如视频、游戏、DNS)的首选传输协议。深入理解其报文结构和注意事项,是高效利用UDP的基础。 一、UDP报文结构:简洁的四段式 …...

做题笔记(ctfshow)
一。ctfshow web13 文件扫描 存在upload.php.bak <?php header("content-type:text/html;charsetutf-8");$filename $_FILES[file][name];$temp_name $_FILES[file][tmp_name];$size $_FILES[file][size];$error $_FILES[file][error];$arr pathinfo($fi…...

理解世界如淦泽,穿透黑幕需老谋
理解世界如淦泽,穿透黑幕需老谋 卡西莫多 2025年06月07日 安徽 极少主动跟别人提及恩师的名字,生怕自己比孙猴子不成器但又比它更能惹事的德行,使得老师跟着被拖累而脸上无光。不过老师没有象菩提祖师训诫孙猴子那样不能说出师傅的名字&a…...

ESP12E/F 参数对比
模式GPIO0GPIO2GPIO15描述正常启动高高低从闪存运行固件闪光模式低高低启用固件刷写 PinNameFunction1RSTReset (Active Low)2ADC (A0)Analog Input (0–1V)3EN (CH_PD)Chip Enable (Pull High for Normal Operation)4GPIO16Wake from Deep Sleep, General Purpose I/O5GPIO14S…...

智能网卡之hinic3 WQE(Work Queue Element)结构梳理
hinic3 WQE(Work Queue Element)结构详解 本文基于 hinic3 驱动源码,对 WQE(Work Queue Element)做详细讲解。如需查阅完整源码和结构体定义可参考hinic3_nic_qp.h等文件。 1. WQE 的作用 WQE(Work Queue…...
综述论文解读:Editing Large Language Models: Problems, Methods, and Opportunities
论文为大语言模型知识编辑综述,发表于自然语言处理顶会ACL(原文链接)。由于目前存在广泛的模型编辑技术,但一个统一全面的分析评估方法,所以本文: 1、对LLM的编辑方法进行了详尽、公平的实证分析,探讨了它们各自的优势…...

源码级拆解:如何搭建高并发「数字药店+医保购药」一体化平台?
在全民“掌上看病、线上购药”已成常态的今天,数字药店平台正在以惊人的速度扩张。而将数字药店与医保系统打通,实现线上医保购药,更是未来互联网医疗的关键拼图。 那么,如何从技术底层搭建一个 支持高并发、可扩展、安全合规的数…...

Codeforces Round 509 (Div. 2) C. Coffee Break
题目大意: 给你n、m、d n为元素个数,m为数列长度,d为每个元素之间的最短间隔 问最少需要多少个数列可以使得元素都能装进数列,并且满足每个元素之间的间隔大于等于d 核心思想 使用贪心的思想,将元素的大小进行排序,问题出在必…...
使用 Unstructured 开源库快速入门指南
引言 本文将介绍如何使用 Unstructured 开源库(GitHub,PyPI)和 Python,在本地开发环境中将 PDF 文件拆分为标准的 Unstructured 文档元素和元数据。这些元素和元数据可用于 RAG(检索增强生成)应用、AI 代理…...
QuickJS 如何发送一封邮件 ?
参阅:bellard.org : QuickJS 如何使用 qjs 执行 js 脚本 在 QuickJS 中发送邮件需要依赖外部库或调用系统命令,因为 QuickJS 本身不包含 SMTP 功能。以下是两种实现方法: 方法 1:调用系统命令(推荐) 使…...