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

STM32新建不同工程的方式

新建工程的方式

  • 1. 安装开发工具 MDK5 / keil5
  • 2. CMSIS 标准
  • 3. 新建工程
    • 3.1 寄存器版工程
    • 3.2 标准库版工程
    • 3.3 HAL/LL库版工程
    • 3.4 HAL库、LL库、标准库和寄存器对比
    • 3.5 库开发和寄存器的关系
  • 4. STM32CubeMX工具的作用

1. 安装开发工具 MDK5 / keil5

MDK5 由两个部分组成:MDK Core 和 Software Packs。其中,Software Packs 可以独立于工具链进行新芯片支持和中间库的升级。

在这里插入图片描述

  • MDK Core 分为四个部分:uVision IDE with Editor(编辑器)ARM C/C++ Compiler(编译器)Pack Installer(包安装器)uVision Debugger with Trace(调试跟踪器)。Pack Installer 用于下载、安装、更新和管理 Software Packs。
  • Software Packs(软件包) 分为三个部分:Device(芯片支持)CMSIS(微控制器软件接口标准)Mdidleware(中间库)

特性MDK5Keil5
定位完整的开发套件集成开发环境(IDE)
包含内容IDE、编译器、调试器、中间件、设备支持包仅包含 IDE
适用场景ARM Cortex-M 微控制器开发嵌入式开发(尤其是 ARM Cortex-M)
功能范围更广泛,包含完整的开发工具链专注于代码编辑、编译和调试
适用项目规模开发复杂的嵌入式系统,或者需要使用丰富的中间件只需要一个 IDE 来编写和调试代码,或者项目规模较小

2. CMSIS 标准

因为基于 Cortex 系列芯片采用的内核都是相同的,区别主要为核外的片上外设的差异,这些差异却导致软件在同内核,不同外设的芯片上移植困难。为了解决不同的芯片厂商生产的 Cortex 微控制器软件的兼容性问题,ARM 与芯片厂商建立了 CMSIS 标准(微控制器软件接口标准)。所有芯片厂家的官方库(包括ST官方库)都是根据这套标准设计的。
在这里插入图片描述

  从图中可以看出,CMSIS 层在整个系统中是处于中间层,向下负责与内核和各个外设直接打交道,向上提供实时操作系统用户程序调用的函数接口。如果没有 CMSIS 标准,那么各个芯片公司就会设计自己喜欢的风格的库函数,而 CMSIS 标准就是要强制规定,芯片生产公司设计的库函数必须按照 CMSIS 这套规范来设计。

  其实不用讲这么复杂的,举一个简单的例子,我们在使用 STM32 芯片的时候首先要进行系统初始化,CMSIS 规范就规定,系统初始化函数名字必须为 SystemInit,所以各个芯片公司写自己的库函数的时候就必须用 SystemInit 对系统进行初始化。CMSIS 还对各个外设驱动文件的文件名字规范化,以及函数名字规范化等等一系列规定。例如函数GPIO_ResetBits 这个函数名字也是不能随便定义的,是要遵循 CMSIS 规范的。


CMSIS 分为 3 个基本功能层:

  • 核内外设访问层:用于访问内核寄存器的名称、地址定义以及功能函数,ARM 公司提供
  • 中间件访问层:用于访问中间件的通用 API,ARM 公司提供
  • 外设访问层:提供片上的核外外设的地址和中断定义以及外设的访问函数,芯片生产商提供

3. 新建工程

3.1 寄存器版工程

必备文件描述位置
stm32f4xx.h标准外设库头文件,包含寄存器定义、外设地址映射、位域定义等内容。ST官方提供STM32Cube_FW_F4_V1.26.0\Drivers\
CMSIS\Device\ST\STM32F4xx\Include
startup_stm32f407xx.s汇编语言启动文件,主要进行初始化堆栈,定义中断向量表以及跳转到主程序main()。ST官方提供STM32Cube_FW_F4_V1.26.0\Drivers\
CMSIS\Device\ST\STM32F4xx\Source\
Templates\arm

3.2 标准库版工程

  标准外设库 是对 STM32 芯片的一个完整的封装,包括所有标准器件外设的器件驱动器,是 ST 最早推出的针对 STM 系列主控的库函数。标准外设库仍然接近于寄存器操作,主要就是将一些基本的寄存器操作封装成了 C 函数。开发者仍需要关注所使用的外设是在哪个总线之上,具体寄存器的配置等底层信息。
  ST 为各系列提供的标准外设库稍微有些区别。例如,STM32F1x 的库和 STM32F4x 的库在文件结构上就有些不同,此外,在内部的实现上也稍微有些区别,这个在具体使用(移植)时,需要注意一下!但是,不同系列之间的差别并不是很大,而且在设计上是相同的。
  STM32 的标准外设库涵盖以下 3 个抽象级别:

  • 包含位,位域和寄存器在内的完整的寄存器地址映射
  • 涵盖所有外围功能(具有公共 API 的驱动器)的例程和数据结构的集合。
  • 一组包含所有可用外设的示例,其中包含最常用的开发工具的模板项目。

在这里插入图片描述


在这里插入图片描述

上图黄色部分为新建工程所必须的内容,接下来介绍这些文件的作用

文件名作用类别是否必须
stm32f4xx_conf.h1.用户配置文件,启用或禁用外设驱动: 通过条件编译控制是否包含特定外设的头文件 用户层
stm32f4xx_it.c
stm32f4xx_it.h
1.用户定义和处理与内核外设相关的中断事件,不一定放到这个文件,可删除 用户层
stm32f4xx.h1.定义所有外设寄存器及其位于 (寄存器定义)
2.使用结构体组织相关寄存器 (外设结构体)
3.定义外设寄存器的基地址和偏移量 (地址映射)
4.定义中断向量号和中断处理 (中断定义)
5.定义一些常用宏,用于位操作、寄存器配置等 (常用宏)
6.定义标准数据类型,如 uinit32_t (类型定义)
7.包含外设的配置选项和默认设置 (外设配置)
CMSIS
核心层
system_stm32f4xx.c
system_stm32f4xx.h
1.实现SystemInit()函数,负责在系统启动时初始化关键硬件模块 (系统初始化)
2.实现SystemCoreClockUpdate()函数,用于更新全局变量SystemCoreClock的值 (系统时钟更新)
3.定义全局变量SystemCoreClock,用于存储系统核心时钟频率 (全局变量定义)
4.定义默认的时钟配置,确保系统以正确的频率运行 (默认时钟配置)
5.在启动文件中,SystemInit()函数会在 main() 函数执行之前被调用,确保系统在进入用户代码之前完成初始化 (与启动文件配合)
CMSIS
核心层
startup_stm32f40xx.s1.定义中断向量表
2.初始化堆栈指针
3.在复位后初始化 .data 和 .bss 段
4.调用系统初始化函数SystemInit()
5.跳转到用户的主程序main()
6.提供默认的中断处理函数
CMSIS
核心层
core_cm4.h1.定义内核的寄存器结构体和地址映射,包括NVIC、SCB、SysTick、MPU、FPU (定义内核寄存器)
2.提供一系列内联函数,用于方便地访问内核的功能 (提供内联函数)
3.定义特殊功能寄存器(如xPSR、CONTROL、PRIMASK 等),用于控制处理器的运行状态 (定义特殊功能寄存器)
4.定义FPU相关的寄存器和函数,用于配置和控制 FPU (支持 FPU)
5.提供 CMSIS 标准接口
6.与标准外设库stm32f4xx.h配合使用,提供对内核功能的访问 (与标准外设库配合)
CMSIS
核心层
core_cmFunc.h1.提供内联函数访问内核的特殊功能寄存器(如xPSR、CONTROL、PRIMASK 等
2.支持特权和非特权模式的切换
3.提供中断控制函数(如全局中断的使能和禁用)
4.支持浮点单元(FPU)操作(如果可用)
CMSIS
核心层
core_cmInstr.h1.定义内联函数,用于封装内核的汇编指令(如WFI、WFE、SEV、NOP 等
2.提供同步指令(如 ISB、DSB、DMB
3.支持低功耗模式指令(如WFI 和 WFE
CMSIS
核心层
core_cmSimd.h1.定义 SIMD 指令的访问函数
2.提供对 DSP 扩展指令的支持
CMSIS
核心层
stm32f4xx_ppp.c
stm32f4xx_ppp.h
1.提供操作外设的 API 函数
2.定义外设的寄存器结构体、函数声明和宏定义
设备
驱动层


标准外设库各文件间的关系:
在这里插入图片描述

3.3 HAL/LL库版工程

  LL 库(Low Layer)目前与 HAL 库捆绑发布,它设计为比 HAL 库更接近于硬件底层的操作,代码更轻量级,代码执行效率更高的库函数组件,可以完全独立于 HAL 库来使用,但 LL库不匹配复杂的外设,如 USB 等。所以 LL 库并不是每个外设都有对应的完整驱动配置程序。使用 LL 库需要对芯片的功能有一定的认知和了解,它可以:

  • 独立使用,该库完全独立实现,可以完全抛开 HAL 库,只用 LL 库编程完成。
  • 混合使用,和 HAL 库结合使用。

 HAL 库和 LL 库设计为彼此独立的分支,但又同属于 HAL 库体系。标准库和 HAL 库、LL 库完全相互独立,HAL 库更倾向于外设通用化,扩展组件中解决芯片差异操作部分;LL倾向于最简单的寄存器操作,ST 在未来还将重点维护和建设 HAL 库,标准库已经部分停止更新。HAL 库和 LL 库的应用将是未来的一个趋势。

  HAL 即硬件抽象层。HAL 库是 ST 公司提供的外设驱动代码的驱动库,用户只需要调用库的 API 函数,便可间接配置寄存器。我们要写程序控制 STM32 芯片,其实最终就是控制它的寄存器,使之工作在我们需要得模式下,HAL 库将大部分寄存器的操作封装成了函数,我们只需要学习和掌握 HAL 库函数的结构和用法,就能方便地驱动 STM32 工作,以节省开发时间。

  HAL 库开发,指的是利用 HAL 库里面封装好的 C 语言编写的驱动文件,来实现对 STM32 内部和外部电器元件的控制过程。但只有 HAL 库还不能直接驱动一个 STM32 的芯片,其他的组件已经由 ARM 与众多芯片硬件、软件厂商指定的通用的软件开发标准 CMSIS 实现了。

  STM32Cube 是 ST 提供的一套性能强大的免费开发工具和嵌入式软件模块,它包含两个关键部分:

  1. 允许用户通过图形配置工具STM32CubeMX来生成 C 语言工程。可以通过 STM32CubeMX 实现方便地下载各种软件或开发固件包。
  2. 嵌入式软件包(STM32Cube 库)包含完整的 HAL 库(硬件抽象层 API),配套的中间件(包括 RTOS、USB、FAT文件系统、图形、TCP/IP 、以太网),以及一系列完整的例程。

在这里插入图片描述

在这里插入图片描述


上图黄色部分为新建工程所必须的内容,接下来介绍这些文件的作用

文件名作用类别是否
必须
stm32f4xx_it.c
stm32f4xx_it.h
标准外设库一样 用户层
stm32f4xx_hal_conf.h标准外设库stm32f4xx_conf.h 作用一样 用户层
stm32f4xx_hal_msp.c回调函数存放文件,已删除 用户层
stm32f407xx.h标准外设库stm32f4xx.h 作用一样 CMSIS
核心层
system_stm32f4xx.c
system_stm32f4xx.h
标准外设库一样 CMSIS
核心层
startup_stm32f407xx.s标准外设库一样 CMSIS
核心层
stm32f4xx.h是所有 STM32F4 系列的顶层头文件,并且可以选择性包含某一特定的
STM32F4 系列芯片的头文件(比如包含:F407头文件 stm32f407xx.h
CMSIS
核心层
core_cm4.h标准外设库一样 CMSIS
核心层
cmsis_armcc.h
cmsis_armclang.h
cmsis_compiler.h
cmsis_version.h
mpu_armv7.h
内核头文件,一般都不需要去了解 CMSIS
核心层
sm32f4xx_hal.c
stm32f4xx_hal.h
HAL 库的初始化、系统滴答,HAL 库延时函数等功能 设备
驱动层
stm32f4xx_hal_def.h通用 HAL 库资源定义 设备
驱动层
stm32f4xx_hal_ppp.c
stm32f4xx_hal_ppp.h
外设的操作 API 函数文件 设备
驱动层
stm32f4xx_hal_ppp_ex.c
stm32f4xx_hal_ppp_ex.h
拓展外设特性的 API 函数文件 设备
驱动层
stm32f4xx_II_ppp.c
stm32f4xx_II_ppp.h
LL 库文件,在一些复杂外设中实现底层功能 设备
驱动层


HAL库各文件间的关系:
在这里插入图片描述

3.4 HAL库、LL库、标准库和寄存器对比

HAL库标准库LL库寄存器
使用频率最高逐渐减少逐渐增加较低
优点开发效率高代码简洁,代码效率较高代码效率高,高于标准库代码效率最高
缺点代码体积大,执行效率低已停止维护开发效率略低于HAL库开发难度大,可移植性差
使用场景快速开发、跨平台移植老项目、简单应用性能与开发效率平衡的场景高性能需求、底层开发
开发效率最高较高中等最低
代码性能较低中等较高最高

3.5 库开发和寄存器的关系

  寄存器(Register)是单片机内部一种特殊的内存,它可以实现对单片机各个功能的控制,简单的来说可以把寄存器当成一些控制开关,控制包括内核及外设的各种状态。所以无论是 51单片机还是 STM32,都需要用寄存器来实现各种控制,以完成不同的功能。
  由于寄存器资源非常宝贵,一般都是一个位或者几个位控制一个功能,对于 STM32 来说,其寄存器是 32 位的,一个 32 位的寄存器,可能会有 32 个控制功能,相当于 32 个开关,由于STM32 的复杂性,它内部有几百个寄存器,所以整体来说 STM32 的寄存器还是比较复杂的。不过,我们不要被其吓到了,实际上 STM32 是由于内部有很多外设,所以导致寄存器很多,实际上我们把它分好类,每个外设也就那么几个或者几十个寄存器,学起来就不难了。
  从大方向来区分,STM32 寄存器分为两类,如表所示:
在这里插入图片描述
其中,内核寄存器,我们一般只需要关心中断控制寄存器和 SysTick 寄存器即可,其他三大类,我们一般很少直接接触。


对于STM32 来说,以 GPIOB 的 ODR 寄存器为例,其寄存器地址为:0X40010C0C,我们对其赋值 0XFFFF,表示 GPIOB 所有 IO 口(16 个 IO 口)都输出高电平:

(*(unsigned int *))(0X40010C0C) = 0XFFFF;

虽然上面的代码实现了我们需要的功能,但是从实用的角度来说,这么写肯定是不好的,可读性极差,可维护性也很差,所以一般我们使用结构体来访问,比如改写成这样:

GPIOB->ODR = 0XFFFF;

这种方法当然可以,但是这种方法的劣势是你需要去掌握每个寄存器的用法,你才能正确使用STM32,而对于 STM32 这种级别的 MCU,数百个寄存器记起来又是谈何容易。于是 ST(意法半导体)推出了官方固件库,固件库将这些寄存器底层操作都封装起来,提供一整套接口(API)供开发者调用,大多数场合下,你不需要去知道操作的是哪个寄存器,你只需要知道调用哪些函数即可。
比如控制 BSRRL 寄存器实现电平控制,官方 HAL 库封装了一个函数:

void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
{assert_param(IS_GPIO_PIN(GPIO_Pin));assert_param(IS_GPIO_PIN_ACTION(PinState));if(PinState != GPIO_PIN_RESET){GPIOx->BSRR = GPIO_Pin;}else{GPIOx->BSRR = (uint32_t)GPIO_Pin << 16;}
}

  这个时候你不需要再直接去操作BSRRL寄存器了,你只需要知道怎么使用HAL_GPIO_WritePin这个函数就可以了。在你对外设的工作原理有一定的了解之后,你再去看固件库函数,基本上函数名字能告诉你这个函数的功能是什么,该怎么使用,这样开发起来会方便很多。
  任何处理器,不管它有多么的高级,归根结底都是要对处理器的寄存器进行操作。但是固件库不是万能的,如果想要把 STM32 学透,光读 STM32 固件库是远远不够的。你还是要了解一下 STM32 的原理,了解 STM32 各个外设的运行机制。只有了解了这些原理,你在进行固件库开发过程中才可能得心应手游刃有余。只有了解了原理,才能做到“知其然知其所以然”,所以在学习库函数的同时,别忘了要了解一下寄存器大致配置过程。
  标准库函数是对寄存器简单的进行了一次封装。将每个功能都独立的封装成一个函数。每个函数的功能比较单一。而HAL库相当于对寄存器进行了二次或者三次的封装,它将能合并的功能都合并在了一起。减小了写代码的难度。但是库函数本身阅读起来要比标准库要费劲一些。这样就导致,如果程序出错的话调试起来要比标准库难一点。但是HAL写程序却比较简单,函数的名字也更容易理解。更接近于面向对象的思想。没有哪种方式更好,每种都有自己的优缺点,根据实际情况,自己喜欢用哪种就用那种。通过对官方的这两种库的对比,可以看出在产品开发中代码永远都有优化和改进的空间。以后自己在开发项目的时候,也可以用这两种不同的方式对自己的代码进行优化升级。

描述标准外设库HAL / LL库
内核寄存器封装文件core_cm4.hcore_cm4.h
内核寄存器操作文件1.core_cm4.h
2.misc.c / misc.h : 封装NVIC、SysTick等操作
3.system_stm32f4xx.c : 系统初始化和时钟配置函数,涉及对内核寄存器的操作
4.startup_stm32f40xx.s: 底层汇编代码,涉及内核寄存器初始化
1. core_cm4.h
2.stm32f4xx_hal_cortex.c : 封装对内核寄存器的操作
3.system_stm32f4xx.c : 系统初始化和时钟配置函数,涉及对内核寄存器的操作
4.startup_stm32f40xx.s: 底层汇编代码,涉及内核寄存器初始化
5.stm32f4xx_hal.c: 间接操作内核寄存器
外设寄存器封装文件stm32f4xx.hstm32f4xx.h
外设寄存器操作文件stm32f4xx_ppp.c
stm32f4xx_ppp.h
stm32f4xx_hal_ppp.c
stm32f4xx_hal_ppp.h
stm32f4xx_hal_ppp_ex.c
stm32f4xx_hal_ppp_ex.h
stm32f4xx_II_ppp.c
stm32f4xx_II_ppp.h

4. STM32CubeMX工具的作用

STM32CubeMX是一款图形化配置工具,主要用于STM32微控制器的初始化和代码生成。 其主要作用包括:

  1. 引脚配置: 可视化配置引脚功能,如GPIO、外设接口等,避免冲突。
  2. 时钟树配置: 通过图形界面配置系统时钟、外设时钟等,确保时钟设置正确。
  3. 外设配置: 配置外设参数,如UART、SPI、I2C、ADC等,生成初始化代码。
  4. 中间件配置: 配置FreeRTOS、FATFS、USB库等中间件,简化开发。
  5. 功耗配置: 配置低功耗模式,优化功耗管理。
  6. 代码生成: 生成初始化代码,支持多种IDE(如Keil、IAR、STM32CubeIDE等),并提供HAL库和LL库选项。
  7. 项目管理: 创建和管理项目,支持多种开发环境和工具链。
  8. 固件更新: 集成STM32固件更新功能,方便升级。


通过STM32CubeMX工具自动生成驱动代码,让开发者只需专注实现 应用逻辑。

相关文章:

STM32新建不同工程的方式

新建工程的方式 1. 安装开发工具 MDK5 / keil52. CMSIS 标准3. 新建工程3.1 寄存器版工程3.2 标准库版工程3.3 HAL/LL库版工程3.4 HAL库、LL库、标准库和寄存器对比3.5 库开发和寄存器的关系 4. STM32CubeMX工具的作用 1. 安装开发工具 MDK5 / keil5 MDK5 由两个部分组成&#…...

【Rust自学】14.5. cargo工作空间(Workspace)

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 14.4.1. 为什么需要cargo workspace 假如说我们构建了一个二进制crate&#xff0c;里面既有library又有库。随着项目规模不断增长&#…...

全面了解 Web3 AIGC 和 AI Agent 的创新先锋 MelodAI

不管是在传统领域还是 Crypto&#xff0c;AI 都是公认的最有前景的赛道。随着数字内容需求的爆炸式增长和技术的快速迭代&#xff0c;Web3 AIGC&#xff08;AI生成内容&#xff09;和 AI Agent&#xff08;人工智能代理&#xff09;正成为两大关键赛道。 AIGC 通过 AI 技术生成…...

10.3 LangChain实战指南:解锁大模型应用的10大核心场景与架构设计

LangChain实战指南:解锁大模型应用的10大核心场景与架构设计 关键词: LangChain使用场景、LLM应用案例、检索增强生成、智能体开发、知识库问答 一、LangChain场景全景图:从简单到复杂的应用分层 #mermaid-svg-nzjpyXIPLzL0j3PG {font-family:"trebuchet ms",ver…...

Swing使用MVC模型架构

什么是MVC模式? MVC是一组英文的缩写,其全名是Model-View-Controller,也就是“模型-视图-控制器”这三个部分组成。这三个部分任意一个部分发生变化都会引起另外两个发生变化。三者之间的关系示意图如下所示: MVC分为三个部分,所以在MVC模型中将按照此三部分分成三…...

设计新的 Kibana 仪表板布局以支持可折叠部分等

作者&#xff1a;来自 Elastic Teresa Alvarez Soler, Hannah Mudge 及 Nathaniel Reese 在 Kibana 中构建可折叠仪表板部分需要彻底改造嵌入式系统并创建自定义布局引擎。这些更新改进了状态管理、层次结构和性能&#xff0c;同时为新的高级仪表板功能奠定了基础。 我们正在开…...

修改maven的编码格式为utf-8

1.maven默认编码为GBK 注:配好MAVEN_HOME的环境变量后,在运行cmd. 打开cmd 运行mvn -v命令即可. 2.修改UTF-8为默认编码. 设置环境变量 变量名 MAVEN_OPTS 变量值 -Xms256m -Xmx512m -Dfile.encodingUTF-8 3.保存,退出cmd.重新打开cmd 运行mvn -v命令即可. 源码获取&…...

解锁罗技键盘新技能:轻松锁定功能键(罗技K580)

在使用罗技键盘的过程中&#xff0c;你是否曾因 F11、F12 功能键的默认设置与实际需求不符而感到困扰&#xff1f; 别担心&#xff0c;今天就为大家分享一个简单实用的小技巧 —— 锁定罗技键盘的 F11、F12 功能键&#xff0c;让你的操作更加得心应手&#xff01; 通常情况下…...

HTB:Active[RE-WriteUP]

目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 将靶机TCP开放端口号提取并保存 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用nmap对靶机…...

[C语言日寄] 源码、补码、反码介绍

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋&#xff1a;这是一个专注于C语言刷题的专栏&#xff0c;精选题目&#xff0c;搭配详细题解、拓展算法。从基础语法到复杂算法&#xff0c;题目涉及的知识点全面覆盖&#xff0c;助力你系统提升。无论你是初学者&#xff0c;还是…...

安卓逆向之脱壳-认识一下动态加载 双亲委派(一)

安卓逆向和脱壳是安全研究、漏洞挖掘、恶意软件分析等领域的重要环节。脱壳&#xff08;unpacking&#xff09;指的是去除应用程序中加固或保护措施的过程&#xff0c;使得可以访问应用程序的原始代码或者数据。脱壳的重要性&#xff1a; 分析恶意软件&#xff1a;很多恶意软件…...

Nuxt:利用public-ip这个npm包来获取公网IP

目录 一、安装public-ip包1.在Vue组件中使用2.在Nuxt.js插件中使用public-ip 一、安装public-ip包 npm install public-ip1.在Vue组件中使用 你可以在Nuxt.js的任意组件或者插件中使用public-ip来获取公网IP。下面是在一个Vue组件中如何使用它的例子&#xff1a; <template…...

babylon.js-3:了解STL网格模型

网格模型上色 本篇文章主要介绍如何在 BabylonJS 中实现STL网格模型上色。 文章目录 网格模型上色运用场景概要延申正文加载器库的支持认识 OBJ 和 STL 文件GUI 色板选择器网格模型异步加载加载动画网格模型上色官方即将弃用 ImportMesh 而推荐使用 ImportMeshAsync 说明OBJ …...

基于SpringBoot的假期周边游平台的设计与实现(源码+SQL脚本+LW+部署讲解等)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

【MySQL】初始MySQL、库与表的操作

目录 基本使用 使用案例 SQL分类 存储引擎 库的操作 字符集和校验规则 查看系统默认字符集和校验规则 查看数据库支持的字符集 查看数据库支持的字符集校验规则 指定编码常见数据库 校验规则对数据库的影响 操纵数据库 库的备份与恢复 表的操作 创建表 查看表 …...

将DeepSeek接入Word,打造AI办公助手

最近&#xff0c;DeepSeek热度一路高涨&#xff0c;成为AI领域的焦点。通过开放的API&#xff0c;我们可以将DeepSeek接入Word&#xff0c;直接进行AI对话。更进一步&#xff0c;还能利用DeepSeek辅助修改文档&#xff0c;甚至提出一些排版建议。 Word报告工具已经新增“DeepS…...

Coze,Dify,FastGPT,对比

在当今 AI 技术迅速发展的背景下&#xff0c;AI Agent 智能体成为了关键领域&#xff0c;Coze、Dify 和 FastGPT 作为其中的佼佼者&#xff0c;各有千秋。 平台介绍 - FastGPT&#xff1a;由环界云计算公司发起&#xff0c;是基于大语言模型&#xff08;LLM&#xff09;的开源…...

Kafka 日志存储 — 磁盘存储

Kafka 依赖与磁盘来存储和缓存消息&#xff0c;采用文件追加的方式来写入消息。顺序写盘的速度快于随机写内存。 1 磁盘存储 除顺序写入外&#xff0c;Kafka中大量使用了页缓存、零拷贝等技术来进一步提升吞吐性能。 1.1 页缓存 页缓存是操作系统实现的一种磁盘缓存&#x…...

996引擎 - NPC-添加NPC引擎自带形象

996引擎 - NPC-添加NPC引擎自带形象 截图参考添加NPC参考资料截图参考 添加NPC 编辑NPC表:Envir\DATA\cfg_npclist.xls 1.1. 需要临时隐藏NPC时可以在id前加 // 1.2. 如果NPC朝向不对,可以调整dir 列。(按8方向,上是0顺时针数。我这里给的4) 1.3. 形象代码:NPC代码、怪物…...

GL C++显示相机YUV视频数据使用帧缓冲FBO后期处理,实现滤镜功能。

一.前言&#xff1a; GitHub地址&#xff1a;GitHub - wangyongyao1989/WyFFmpeg: 音视频相关基础实现 系列文章&#xff1a; 1. OpenGL Texture C 预览Camera视频&#xff1b; 2. OpenGL Texture C Camera Filter滤镜; 3. OpenGL 自定义SurfaceView Texture C预览Camera视…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...