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

Keil 5 环境下STM32F4 HAL库版本MDK工程创建详细步骤(适合小白,附工程源码)

一、前期准备

1.安装好keil

Keil(MDK) 5 软件安装教程-CSDN博客https://blog.csdn.net/qq_42748213/article/details/90485750

2.安装好STM32F4的芯片包

Keil5中STM32F4xx芯片包下载安装_stm32f4芯片包-CSDN博客https://blog.csdn.net/weixin_45783141/article/details/131829485

3.下载好STM32CubeF4固件包(本文STM32Cube_FW_F4_V1.28.0)

STM32CubeMX——固件库下载以及安装_stm32固件库下载及安装-CSDN博客https://blog.csdn.net/qq_54784198/article/details/126732377

二、工程文件移植

1.建立初步的工程文件夹

        以STM32F429芯片、STM32Cube_FW_F4_V1.28.0固件包为例:

        新建一个“STM32F429_HAL_V1.28.0_Project_20250312”的文件夹,进入文件夹,分别新建如下文件夹:

        每个文件夹名称及其作用如表所示:

名称作用
Drivers存放与硬件相关的驱动层文件
Middlewares存放正点原子提供的中间层组件文件和第三方中间层文件
Output存放工程编译输出文件
Projects存放 MDK 工程文件
User存放 HAL 库用户配置文件、 main.

        工程根文件目录下还有一个名为 keilkill.bat 的可执行文件,双击便可执行。其作用是删除编译器编译后的无关文件,减少工程占用的内存,方便打包。
 

2. 建立和拷贝工程相关文件

2.1 Drivers文件夹详解

        下面是已经移植好的Drivers文件夹,其中前3个是直接在STM32CubeF4固件包里面拷贝过来的,最后一个“SYSTEM”文件夹是另外新建的,用于存放系统级核心驱动代码,如 sys.c、 delay.c 和 usart.c。

         该文件夹用于存放与硬件相关的驱动层文件,每个文件夹名称及其作用如表所示:

文件夹名称作用
BSP存放开发板板级支持包驱动代码,如各种外设驱动
CMSIS存放 CMSIS 底层代码,如启动文件(.s 文件)、 stm32f4xx.h 等
STM32F4xx_HAL_Driver存放 HAL 库驱动代码源文件
SYSTEM存放正点原子系统级核心驱动代码,如 sys.c、 delay.c 和 usart.c

        找到我们刚才下载好的STM32CubeF4固件包,解压并打开我们发现里面也有一个Drivers文件夹:

        打开Drivers文件夹,里面就是我们移植所需要的核心文件:

         为方便,我们先把上面这些STM32Cube文件夹全部拷贝到我们新建的STM32F429_HAL_V1.28.0_Project_20250312工程文件夹里面的Drivers文件夹下,便得到了一个初步移植好的Drivers文件夹:

 2.2 CMSIS文件夹移植和裁剪

        进入到我们拷贝好的CMSIS文件夹下,对CMSIS文件夹进行裁剪,只保留 Device 和 Include 2个文件夹:

        进入裁剪后留下的Include文件夹,对Include里面的头文件进行裁剪,只保留以下6个必要的头文件:

        进入我们工程的CMSIS文件夹下的Device 文件夹,一直进入文件夹,直到打开STM32F4xx文件夹,对STM32F4xx文件夹进行裁剪,只保留 Include 和 Source 文件夹:

        裁剪完STM32F4xx文件夹后,进一步进入STM32F4xx文件夹下的Include 文件夹,根据自己实际使用到的芯片进行裁剪头文件,我使用的是STM32F429,所以我保留以下3个头文件

备注:第一个和第三个头文件是F4必要的,第二个头文件是根据你使用的芯片具体选择

        进入STM32F4xx文件夹下的 Source 文件夹,一直进去,直到进入到 Templates 文件夹,保留以下2个文件: 

        进入到 Templates 文件夹下保留的 arm 文件夹,里面是STM32的启动文件,我们根据自己的芯片选择保留对应的文件即可,我使用的是STM32F429,所以我保留startup_stm32f429xx.s:

2.3 STM32F4xx_HAL_Driver 驱动代码移植裁剪

        进入我们新建的工程里面拷贝好的的Drivers文件夹下的STM32F4xx_HAL_Driver文件夹,对其进行裁剪,只保留 Inc 和 Src 文件夹:

2.4 SYSTEM文件夹系统级核心驱动代码移植(可以先跳过该步骤)

        这里我们便要致敬一下正点原子的杰出贡献:STM32 HAL 库 的 sys、 delay 和usart驱动代码:

明天更新下文件:

sys.h

sys.c

delay.h

delay.c

usart.h

usart.c

2.5 User文件夹驱动代码移植

        User 文件夹用于存放 HAL 库用户配置文件、 main.c 文件以及中断处理文件,这些文件我们可以在我们下载的STM32Cube_FW_F4_V1.28.0 HAL固件包里面拷贝,打开STM32Cube_FW_F4_V1.28.0\Projects\STM32F429I-Discovery\Templates,里面就有Inc 和 Src 2个文件夹:

        直接把这 Inc 和 Src 2个文件夹拷贝到到我们自己新建的工程的 User 文件夹里:

三、建立STM32F4 的Keil工程

1.建立keil工程框架

        首先,打开 MDK 软件。然后点击 Project→New uVision Project 如图:

        然后弹出工程命名和保存的操作窗口,我们将工程文件保存路径设置在上一节 工程文件移植 步骤中新建的工程文件夹的Projects文件夹内,并取名:STM32F429IGT6 ,然后保存。

        之后,弹出器件选择对话框,如图所示。

        因为我使用的STM32 型 号 为 STM32F429IGT6,所 以 我 选 择 : STMicroelectronics→STM32F4 Series→STM32F429→STM32F429IGTx 

        备注:如果使用的是其他系列的芯片,选择相应的型号就可以了,特别注意: 一定要安装对应的器件 pack 才会显示这些内容哦!!(文章第一章里面的芯片包安装)

        点击 OK, MDK 会弹出 Manage Run-Time Environment 对话框,直接关闭即可:


2.清理keil工程框架自动生成的个别文件夹

         我们打开我们的工程里面的Projects文件夹,会看到 MDK 在该文件夹下自动创建了 3 个文件夹(DebugConfig、 Listings 和 Objects),如图所示:

这三个文件夹的作用如表所示:

文件夹作用
DebugConfig用于存放调试设置信息文件(.dbgconf),不可删除!
Listings用于存放编译过程产生的链接列表等文件
Objects用于存放编译过程产生的调试信息、 .hex、预览、 .lib 文件等

        编译过程产生的链接列表、调试信息、预览、 lib 等文件,统称为中间文件。为了统一管理,方便使用,我们会把输出在 Listings 和 Objects 文件夹的内容,统一改为输出到 Output 文件夹(通过魔术棒设置),我们先把 MDK 自动生成的这两个文件夹(Listings 和 Objects)删除。

        至此,我们还只是建了一个框架,还有好几个步骤要做,比如添加文件、魔术棒设置、编写 main.c 等。

3.添加必要文件到keil工程框架

3.1 设置工程名和分组名

        在 Project→Target 上右键,选择 Manage Project Items…(方法一)或在菜单栏点击品字形红绿白图标(方法二)进入工程管理界面,如图所示:

        在工程管理界面,我们可以执行设置工程名字(Project Targets)、分组名字(Groups)以及添加每个分组的文件( Files)等操作。我们设置工程名字为: Template,并设置四个分组: Startup(存放启动文件)、 User(存放 main.c等用户代码)、 Drivers/SYSTEM(存放系统级驱动代码)、 Drivers /STM32F4xx_HAL_Driver(存放 HAL 库代码)、 Doc(存放工程说明文件),如图 所示:


        设置好之后,我们点击 OK,回到 MDK 主界面,可以看到我们设置的工程名和分组名如图所示:

        注意:为了让工程结构清晰,我们会尽量让 MDK 的工程分组和我们前面新建的工程文件夹对应起来,由于 MDK 分组不支持多级目录,因此我们将路径也带入分组命名里面,以便区分。如: User分组对应 User文件夹里面的源码, Drivers/SYSTEM分组,对应 Drivers/SYSTEM文件夹里面的源码, Drivers/BSP 分组对应 Drivers/BSP 文件夹里面的源码等。

3.2 添加启动文件

        启动文件(.s 文件)包含 STM32 的启动代码,其主要作用包括: 1、堆栈(SP)的初始化; 2、初始化程序计数器(PC); 3、设置向量表异常事件的入口地址; 4、调用 main 函数等,是每个工程必不可少的一个文件。启动文件由 ST 官方提供, 存放在 STM32CubeF4 软件包的: Drivers→CMSIS→Device →ST→STM32F4xx→Source→Templates→arm 文 件 夹 下 。 因 为我使用的是STM32F429IGT6,对应的启动文件为: startup_stm32f429xx.s,为了节省空间,在精简版 CMSIS文件夹里面我们把其他启动文件都删了。

方法一:

        上图中,我们也可以点击 Add 按钮进行文件添加。添加完后,点击 Close,完成启动文件添加,得到工程分组如图所示:

3.3 添加STM32F4xx_HAL_Driver里面的HAL库文件

        接下来我们往 Drivers/STM32F4xx_HAL_Driver 分组里添加文件。点击: 按钮,进入工程管理界面,选中 Drivers/STM32F4xx_HAL_Driver 分组,然后点击: Add Files,进入文件添加 对 话 框 , 依 次 添 加 stm32f4xx_hal.c 、 stm32f4xx_hal_cortex.c 、 stm32f4xx_hal_dma.c 、stm32f4xx_hal_gpio.c、 stm32f4xx_hal_pwr.c、 stm32f4xx_hal_pwr_ex.c、stm32f4xx_hal_rcc.c、stm32f4xx_hal_rcc_ex.c 、 stm32f4xx_hal_uart.c 和stm32f4xx_hal_usart.c 到该分组下,如图:

方法二:

添加完成后,如图所示:

3.4 添加SYSTEM系统级核心文件(可以先跳过该步骤)

        这些文件由正点原子提供,文章前面提到过的,依葫芦画瓢把些文件添加到SYSTEM组:

3.5 添加User用户文件

        打开工程文件夹里面的User文件夹,之前已经拷贝好了对应的头文件Inc和源码Src文件:

        进入Src文件夹,只保留下面2个文件:main.c 和 stm32f4xx_it.c 

        依葫芦画瓢按照前面的方法,把这2个文件添加到User组:

        最后,还有一个system_stm32f4xx.c文件需要添加到User组,该文件在我们移植好的工程里面的Drivers\CMSIS\Device\ST\STM32F4xx\Source\Templates路径下:

到此,main.c、stm32f4xx_it.c 和 stm32f4xx_it.c 3个文件已添加到User组:

4.Keil工程魔术棒设置

        为避免编写代码和编译报错,我们需要通过魔术棒对 MDK 工程进行相关设置。在 MDK主界面,点击: (魔术棒图标,即 Options for Target 按钮),进入工程设置对话框,我们将进行如下几个选项卡的设置。

4.1 选择AC5编译器

        由于 AC5 对中文支持比较好,且兼容性相对好一点, 为了避免不必要的麻烦,我们推荐大家使用 AC5 编译器。

4.2 设置 Output 选项卡

        在魔术棒→Output 选项卡里面,进行如图 设置:

        注意,我们勾选: Browse Information,用于输出浏览信息,这样就可以使用 go to definition 查看函数/变量的定义,对我们后续调试代码比较有帮助,如果不需要调试代码,则可以去掉这个勾选,以提高编译速度。

4.3 设置 Listing 选项卡

        在魔术棒→Listing 选项卡里面,进行如图设置:

        经过 Output 和 Listing 这两步设置,原来存储在 Objects 和 Listings 文件夹的内容(中间文件)就都改为输出到 Output 文件夹了。


4.4 设置 C/C++选项卡

        在魔术棒→C/C++选项卡里面,进行如图所示设置:

        备注:关于芯片宏的获取,我们可以查看stm32f4xx_hal.h ,您需要根据自己选用的芯片查看获取对应的宏:

        上图中我们设置了 5 个头文件包含路径,其中 4 个在 Drivers 文件夹下,一个在 User 文件夹下。为避免频繁设置头文件包含路径,正点原子最新源码的 include 全部使用相对路径,也就是我们只需要在头文件包含路径里面指定一个文件夹,那么该文件夹下的其他文件夹里面的源码,如果全部是使用相对路径,则无需再设置头文件包含路径了,直接在 include 里面就指明了头文件所在。

4.5 设置 Debug 选项卡

        根据你使用的下载器选择,我使用的是ST-LINK:

四、编译验证工程

        点击编译,编译完成如果是 0 Error(s), 0 Warning(s)  ,那工程就是就是移植成功了!

相关文章:

Keil 5 环境下STM32F4 HAL库版本MDK工程创建详细步骤(适合小白,附工程源码)

一、前期准备 1.安装好keil Keil(MDK) 5 软件安装教程-CSDN博客https://blog.csdn.net/qq_42748213/article/details/90485750 2.安装好STM32F4的芯片包 Keil5中STM32F4xx芯片包下载安装_stm32f4芯片包-CSDN博客https://blog.csdn.net/weixin_45783141/article/details/131…...

【微服务】Nacos 配置动态刷新(简易版)(附配置)

文章目录 1、实现方法2、配置依赖 yaml3、验证效果 1、实现方法 环境&#xff1a;Nacos、Java、SpringBoot等 主要是在boostrap.yaml中的data-id属性下配置refresh:true来实现动态更新 2、配置依赖 yaml 具体的版本参考官方的说明&#xff1a;官方版本说明 <!--读取boo…...

LabVIEW cRIO中CSV文件的读取

在LabVIEW cRIO中读取CSV文件&#xff0c;需通过文件传输、路径配置、数据解析等步骤实现。本文详细说明如何通过代码读取本地存储的CSV文件&#xff0c;并探讨直接通过对话框选择文件的可行性及替代方案。 一、CSV文件传输至cRIO本地存储 1. 使用NI MAX文件管理 步骤&#xf…...

双周报Vol.67: 模式匹配支持守卫、LLVM 后端发布、支持 Attribute 语法...多项核心技术更新!

2025-03-10 语言更新 模式匹配支持守卫&#xff08;Pattern Guard&#xff09; 模式守卫可以通过在模式后追加 if ... 的语法结构来指定。有模式守卫的分支只有在被模式匹配的值满足对应模式&#xff0c;并且模式守卫为真的情况下才会执行。如果模式守卫为假&#xff0c;则会…...

从青铜到王者:六大排序算法实战解析

前言 在编程的世界里,排序算法如同一颗璀璨的明珠,闪耀着智慧的光芒。它不仅是计算机科学的基础知识点,更是每一位程序员必备的技能。今天,就让我们一同走进排序算法的世界,深入探究冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序这六大经典算法的精髓所在,…...

011-base64

base64 编码 以下是C实现的Base64字符串加密算法及其原理说明&#xff0c;综合了多个技术文档的核心要点&#xff1a; 一、Base64编码原理 Base64是一种将二进制数据转换为ASCII字符的编码方式&#xff0c;核心原理基于 3字节转4字符 的转换规则&#xff1a; 分组规则&…...

汽车NVH诊断案例 | 纯电车急加速过大弯底盘异响

引言 失去发动机的掩蔽效应后&#xff0c;新能源电车的NVH问题&#xff0c;成为了困扰维修技师新难点。风噪、胎噪、电机高频啸叫等问题更容易车主识别&#xff0c;根源却难以被有效分辨。如何更精准且高效地识别电车NVH问题根源&#xff1f;今天分享的这个案例&#xff0c;内…...

springcloud gateway通过数据库获取路由信息

在 Spring Cloud Gateway 中结合 MyBatis 动态从数据库加载路由配置&#xff0c;可以实现灵活的路由管理。以下是详细实现步骤&#xff1a; 1. 数据库表设计 创建路由配置表 gateway_route&#xff1a; CREATE TABLE gateway_route (id varchar(50) NOT NULL COMMENT 路由唯一…...

QtDataVisualization使用

Qt Data Visualization 是一个开源的第三方库&#xff0c;它为Qt框架提供了高级的数据可视化功能。这个库允许开发者创建复杂的3D和2D图表&#xff0c;包括但不限于散点图、曲面图、条形图等。它基于Qt 3D模块&#xff0c;因此可以充分利用Qt 3D引擎的强大功能来呈现三维数据。…...

【Go每日一练】实现简单的控制台计算器

&#x1f47b;创作者&#xff1a;丶重明 &#x1f47b;创作时间&#xff1a;2025年3月7日 &#x1f47b;擅长领域&#xff1a;运维 目录 1.&#x1f636;‍&#x1f32b;️题目&#xff1a;简单的控制台计算器2.&#x1f636;‍&#x1f32b;️代码输出3.&#x1f636;‍&#…...

TDengine 数据对接 EXCEL

简介 通过配置使用 ODBC 连接器&#xff0c;Excel 可以快速访问 TDengine 的数据。用户可以将标签数据、原始时序数据或按时间聚合后的时序数据从 TDengine 导入到 Excel&#xff0c;用以制作报表整个过程不需要任何代码编写过程。 前置条件 准备以下环境&#xff1a; TDen…...

1.8 双指针专题:四数之和

1.题目链接 18. 四数之和 - 力扣&#xff08;LeetCode&#xff09;18. 四数之和 - 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元…...

基于用户标签和协同过滤混合算法的商城推荐系统设计与实现

一、研究背景 随着电子商务的快速发展&#xff0c;用户面对海量商品时往往面临“信息过载”问题。传统的推荐算法&#xff08;如协同过滤&#xff09;在用户行为数据稀疏或新用户场景下存在冷启动、推荐多样性不足等缺陷。 现状与挑战&#xff1a; 协同过滤&#xff1a;依赖用…...

软件版本号设计

软件版本号的设计是软件开发中的重要环节&#xff0c;它不仅帮助开发团队管理代码&#xff0c;还能让用户清楚地了解软件的更新状态。以下是常见的版本号设计方法和最佳实践&#xff0c;供你参考&#xff1a; 1. 常见的版本号设计规范 语义化版本控制&#xff08;Semantic Ver…...

ESMFold对决AlphaFold:蛋白质-肽相互作用预测的新进展

今天向大家介绍的这篇文章题目为&#xff1a;“Protein−Peptide Docking with ESMFold Language Model”&#xff0c;近期发表在JCTC上。 本文主要研究 ESMFold 语言模型在蛋白质-肽对接中的应用。通过探索多种对接策略&#xff0c;评估其在预测蛋白质-肽相互作用方面的性能&a…...

【项目】负载均衡式在线OJ

负载均衡式在线OJ 目录 负载均衡式在线OJ 1.项目介绍&#xff1a; 2.comm 2.1 log.hpp 日志等级 开放式日志 时间戳工具 2.2 util.hpp TimeUtil类 PathUtil类 FileUtil类 StringUtil类 3.Compile_server 3.1compile_run.hpp RemoveTempFile CodeToDesc Start 3.…...

Android启动速度优化

Android启动速度优化 一、应用启动基础知识 1.1 启动类型 Android应用的启动类型主要分为三种: 冷启动(Cold Start):应用进程不存在,系统需要创建新的进程,加载并启动应用。这是最耗时的启动方式。 温启动(Warm Start):应用进程存在,但Activity可能被销毁,需要重新创…...

python爬虫碰到IP被封的情况,如何解决?

在数据抓取和爬虫开发的实践中&#xff0c;Python作为一种功能强大且易于上手的编程语言&#xff0c;被广泛应用于网络数据的采集。然而&#xff0c;随着网络环境的日益复杂&#xff0c;爬虫活动也面临着越来越多的挑战&#xff0c;其中IP被封便是常见且棘手的问题。IP被封不仅…...

Web网页制作(静态网页):千年之恋

一、是用的PyCharm来写的代码 二、代码中所用到的知识点&#xff08;无 js&#xff09; 这段HTML代码展示了一个简单的注册页面&#xff0c;包含了多个HTML元素和CSS样式的应用。 这段HTML代码展示了一个典型的注册页面&#xff0c;包含了常见的HTML元素和表单控件。通过CSS样…...

mac安装mysql之后报错zsh: command not found: mysql !

在Mac上安装MySQL后&#xff0c;如果终端中找不到mysql命令&#xff0c;通常是 因为MySQL的命令行工具&#xff08;如mysql客户端&#xff09;没有被正确地添加到你的环境变量中。 检查 MySQL 是否已安装 ps -ef|grep mysql查看到路径在 /usr/local/mysql/bin 查看 .bash_pro…...

Spring Boot 启动失败:Failed to start bean ‘documentationPluginsBootstrapper’ 解决方案

文章目录 1. 问题描述 &#x1f3af;2. 可能原因分析 &#x1f50d;原因 1&#xff1a;SpringFox 版本与 Spring Boot 版本不兼容 ❌✅ 解决方案&#xff1a;添加兼容性配置&#xff08;首选&#xff01;&#xff01;&#xff01;&#xff01;&#xff09; 原因 2&#xff1a;S…...

Python Cookbook-3.16 查看汇率

任务 想周期性地(用 crontab 或者 Windows计划任务来运行某 Python 脚本)从 Web 获取数据&#xff0c;监视某两种货币之间的兑换比例&#xff0c;并在两者之间的汇率达到某个值时发送提醒邮件。 解决方案 这个任务和一系列的从 Web 获取数据的监控任务很类似&#xff0c;它们…...

Manus(一种AI代理或自动化工具)与DeepSeek(一种强大的语言模型或AI能力)结合使用任务自动化和智能决策

一、Manus与DeepSeek差异 十分好奇DeepSeek和Manus究竟谁更厉害些&#xff0c;DeepSeek是知识型大脑&#xff0c;Manus则是全能型执行者。即DeepSeek专注于语言处理、知识整合与专业文本生成。其核心优势在于海量参数支持的深度学习和知识推理能力&#xff0c;例如撰写论文、润…...

Redis存数据就像存钱:RDB定期存款 vs AOF实时记账

Redis持久化 ◆ 核心概念1. ◆ 持久化全景图2. ◆ 生产环境黄金法则 ◆ RDB深度优化1. ◆ 生产配置精要2. ◆ 高级触发场景3. ◆ 故障应急方案 ◆ AOF深度解析1. ◆ 7.0版本革命性改进2. ◆ 同步策略深度测试3. ◆ 重写过程优化 ◆ 混合持久化实战1. ◆ 配置示例2. ◆ 数据恢复…...

【从零开始学习计算机科学】编译原理(一)编译过程概述

【从零开始学习计算机科学】编译原理(一)编译过程概述 绪论编译过程概述词法分析语法分析代码优化代码生成其他功能编译器的前端和后端绪论 什么叫编译程序?为什么我们需要编译程序?编译程序就是一个程序,将便于人编写、阅读、维护的高级计算机语言所写作的源代码程序,翻…...

第十八:go 并发 goroutine

channel 可以让多个goroutine 之间实现通信 Add方法调用时机&#xff1a;必须在goroutine 启动之前调用Add方法来增加计数器的值。 如果在goroutine已经启动之后再调用Add&#xff0c;可能会导致Wait方法提前返回&#xff0c;因为计数器没有正确反映正在运行的goroutine的数量…...

基于QGIS的二次开发(四):矢量编辑与属性表操作

一、实验目的 本次实验续接上一次的实验内容&#xff0c;旨在通过设计与开发地理信息系统的过程&#xff0c;加深学生对地理信息系统的理解&#xff0c;并掌握相关的设计与开发技能&#xff0c;包括熟悉地理信息系统的设计与开发流程&#xff0c;加强对 MVC 软件设计模式的理解…...

AI日报 - 2025年3月13日

&#x1f31f; 今日概览&#xff08;60秒速览&#xff09; ▎&#x1f916; AGI突破 | Reka开源21B参数推理模型Flash 3&#xff0c;推出企业智能平台Nexus &#x1f52c; 模型采用RLOO方法结合模型与规则基础奖励&#xff0c;实现高效推理 ▎&#x1f4bc; 商业动向 | Waymo在…...

lua C语言api学习1 编译第一个程序

本文开始进行lua C语言api的学习 1 简介 lua语言与C语言使用还是很紧密,以前我只是学习lua语言比较多,C语言api部分了解比较少,最近在学习tcc编译器的使用进一步学习一下lua C语言api的使用。 2 配置编译环境 首先需配置好tcc编译器环境[参考],再配置好lua源码路径[参考],新…...

【物联网-WIFI】

物联网-WIFI ■ ESP32-C3-模块简介■ ESP32-C3-■ ESP32-C3-■ WIFI-模组■ WIFI-■ WIFI- ■ ESP32-C3-模块简介 ■ ESP32-C3- ■ ESP32-C3- ■ WIFI-模组 ■ WIFI- ■ WIFI-...

在MATLAB中实现PID控制仿真

在MATLAB中实现PID控制仿真可以通过代码编程或Simulink图形化建模两种方式完成。以下是两种方法的详细操作步骤和示例&#xff1a; 方法1&#xff1a;使用MATLAB脚本编程&#xff08;基于控制系统工具箱&#xff09; 步骤1&#xff1a;定义被控对象的数学模型 假设被控对象是…...

C#实现本地Deepseek模型及其他模型的对话v1.4

前言 系 统&#xff1a;Window11 开发工具&#xff1a;Visual Studio 2022 相关技术&#xff1a;C# 、WPF .Net 8.0 1、C#实现本地AI聊天功能 WPFOllamaSharpe实现本地聊天功能,可以选择使用Deepseek 及其他模型。 新增根据聊天记录回复的功能。 优化了部分ViewModel&#xff…...

用sphinx-doc整理文档#2

上一篇博客&#xff1a;用sphinx-doc整理文档 回头看&#xff0c;上一篇博客已经是18年的事情了。最近我又开始维护起18年的项目了。最近策划同事提了一些需求。我又改进了一波&#xff0c;所以有本文。 sphinx支持导出pdf sphinx本身是支持导出pdf的&#xff0c;命令如下&am…...

DBeaver部分操作指南(数据库连接,构造ERD图,格式化SQL)

详细步骤指导如何使用DBeaver来连接到数据库&#xff1a; 步骤 1: 下载并安装 DBeaver 如果还没有安装DBeaver&#xff0c;请访问DBeaver官网下载适合操作系统的版本&#xff0c;并按照指示完成安装。 步骤 2: 启动 DBeaver 安装完成后&#xff0c;启动DBeaver应用程序。 …...

十种处理权重矩阵的方法及数学公式

1. 权重归一化&#xff08;Weight Normalization&#xff09; 目的&#xff1a;通过分离权重向量的范数和方向来加速训练。公式&#xff1a;对于权重向量 w \mathbf{w} w&#xff0c;归一化后的权重 w ′ \mathbf{w} w′ 为&#xff1a; w ′ w ∥ w ∥ \mathbf{w} \frac{…...

姚安娜新剧瘦了一圈,《仁心俱乐部》急诊医生顾诗宜在线上岗

《仁心俱乐部》在芒果 TV 播出&#xff0c;湖南卫视金鹰独播剧场也随之播出&#xff0c;这一剧集受到了不少观众的关注。姚安娜在剧中饰演的急诊科医生顾诗宜&#xff0c;她为患者检查身体时动作娴熟&#xff0c;与患者沟通时展现出的耐心和专注&#xff0c;都展现出很高的专业…...

postgresql源码安装

步骤 1: 安装依赖 在开始之前&#xff0c;请确保您的系统上安装了编译 PostgreSQL 所需的依赖包。使用以下命令安装必要的软件包&#xff1a; 对于 Debian/Ubuntu 系统&#xff1a; sudo apt update sudo apt install build-essential libreadline-dev zlib1g-dev flex biso…...

【51单片机】程序实验15.DS18B20温度传感器

主要参考学习资料&#xff1a;B站【普中官方】51单片机手把手教学视频 开发资料下载链接&#xff1a;http://www.prechin.cn/gongsixinwen/208.html 单片机套装&#xff1a;普中STC51单片机开发板A4标准版套餐7 目录 DS18B20介绍主要特性内部结构控制时序初始化时序写时序读时序…...

Java 集合框架:数据管理的强大工具

Java集合框架&#xff1a;数据管理的强大工具 目录 Java集合框架&#xff1a;数据管理的强大工具引言一、Set集合1. 定义与特点2. 常用实现类 - HashSet创建方式常用方法遍历方式 二、Map集合1. 定义与特点2. 常用实现类 - HashMap创建方式常用方法遍历方式 三、List集合1. 定义…...

AIM-T500绝缘监测仪:实时监测,确保IT系统绝缘安全-安科瑞 蒋静

在现代工业生产中&#xff0c;电力系统的稳定性和安全性至关重要。电力系统的绝缘状况直接关系到设备的正常运行和人员的安全。为了确保IT配电系统&#xff08;不接地系统&#xff09;的绝缘状况始终处于好的状态&#xff0c;安科瑞电气股份有限公司推出了AIM-T500绝缘监测仪&a…...

css3-学习

css 特性 选择器 基础选择器 标签选择器 ID 选择器 类选择器 CSS 的优先级是什么&#xff1f; !important > 内联样式(style“”) > ID 选择器 > 类选择器 属性选择器 伪类 > 标签选择器 伪元素选择器。 层级选择器 foo bar 后代选择器&#xff0c;元素的…...

neo4j图数据库

neo4j图数据库 学习neo4j图数据库的使用 文章目录 neo4j图数据库[toc]1-核心知识点2-思路整理3-参考网址4-上手实操1-安装neo4j-docker2-要学习CQL语句3-解决cmake问题1-可能的原因及解决办法1. cmake 未正确安装或者版本不兼容2. 依赖库缺失3. 环境变量配置问题4. 网络问题 2-…...

go下的Prototype学习笔记

本博文讲解prototype的学习笔记&#xff0c;内容包含了syntax、option go_package、message、service进行讲解&#xff0c;举例了常见写法。 文章目录 1.syntax 声明语法版本2.package 给当前的proto分配包名称3.option4.message4.1 切片数组4.2 map4.3 类型嵌套 5. 消息定义 …...

[高阶技术了解]WebRPC详解

“webrpc详解”&#xff0c;我需要根据我搜索到的资料来回答这个问题。首先&#xff0c;得弄清楚webrpc到底是什么。根据&#xff0c;Webrpc是一个模式驱动的后端服务开发工具&#xff0c;允许通过RIDL或JSON模式文件生成代码&#xff0c;支持多种语言如Go、TypeScript等。它类…...

地基注解@Controller和@RestController区别

前记&#xff1a;基础啊&#xff0c;区别点重点理解&#xff1b; 在Spring和Spring Boot框架中&#xff0c;Controller和RestController都用于处理HTTP请求&#xff0c;但它们在设计目的和用法上有显著区别。以下是它们的核心区别及示例说明&#xff1a; ​1. 核心区别 特性C…...

UI自动化:seldom框架和Selenium

以下是关于 seldom框架 和 Selenium 的对比解析及结合使用的详细说明&#xff0c;帮助理解二者的定位、功能差异和应用场景&#xff1a; 1. 核心定位 工具定位Selenium浏览器自动化工具库&#xff0c;提供直接操控浏览器的底层API&#xff08;如点击、输入、获取元素等&#x…...

机器学习项目实战——信用评分与贷款风险评估(主页有源码)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ ​​​ 1. 领域介绍 信用评分与贷款风险评估是金融领域中的一个重要应用场景。随着金融科技的快速发展&#xff0c;银行、信用卡公司、P2P…...

使用 OptiSLang 和 MotorCAD 构建一个强大的电机优化元模型

介绍 在本文中&#xff0c;我们将检查这些敏感性分析的结果&#xff0c;并构建一个健壮的元模型&#xff0c;作为优化过程的基础。 本文涵盖&#xff1a; 解释敏感性分析结果了解元模型及其在优化中的重要性构建和完善最佳预后模型 &#xff08;MOP&#xff09;使用预后系数…...

【科研绘图系列】python绘制分组点图(grouped dot plot)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据函数`generateRectBoxDF` 函数主要作用参数解释逻辑流程`nmfDotPlot` 函数主要作用参数解释逻辑流程画图1画图2画图3画图4介绍 【科研绘图系列】python绘制…...

【Android】adb shell基本使用教程

adb shell 是 Android Debug Bridge (ADB) 工具中的一个命令&#xff0c;用于在连接的 Android 设备或模拟器上执行 shell 命令。通过 adb shell&#xff0c;你可以直接与设备的 Linux 内核交互&#xff0c;执行各种操作。 基本用法 启动 adb shell&#xff1a; 在终端或命令提…...