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

【STM32】第一个工程的创建

目录

    • 1、获取 KEIL5 安装包
    • 2、开始安装 KEIL5
      • 2.1、 激活
      • 2.2、安装`DFP`库
    • 3、工程创建
    • 4、搭建框架
    • 5、开始编写代码

1、获取 KEIL5 安装包

要想获得 KEIL5 的安装包,在百度里面搜索“KEIL5 下载”即可找到很多网友提供的下载文件,或者到 KEIL 的官网下载:下载官网,一大堆注册非常麻烦。建议使用最新或者靠近最新版本都可以。
在这里插入图片描述

2、开始安装 KEIL5

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
选择安装路径,路径不能带中文,next
提示: Pack 目录下后续可能会安装以后会用到的各种芯片的芯片包容易占空间,建议 C 盘剩余空间不多的用户可以直接在框中编辑改路径,把 C 改为 D(或其他盘,直接改第一个字符就行,注意不要删错后面符号)
在这里插入图片描述
安装ok即可
无需等待, 直接关闭整个软件

2.1、 激活

  • 右键已经安装好的Keil MDK图标, 选择以管理员方式打开

  • 点开File菜单栏, 选择License Management, 在打开的窗口中复制右上角的Computer ID值, 比如CA2RX-GUTUC

  • 右键安装软件\Keil_MDK_ARM_5.35\keygen\keygen.exe, 选择以管理员方式打开, 这是Keil MDK的盗版激活器

  • 将之前复制的CID值拷贝到激活器CID输入框, Target选择ARM, 点击Generate按钮, 会生成一长串激活码

  • 复制激活码, 填回到Keil MDK界面的New License ID Code(LIC)中, 随后点击Add Lic

  • 显示如下LIC Added Sucessfully说明激活成功
    在这里插入图片描述

2.2、安装DFP

  • 安装安装软件\Keil.STM32F1xx_DFP.2.4.1.pack
  • 官网链接

在这里插入图片描述

3、工程创建

在这里插入图片描述

  • D:\workspace-stm32某个硬盘路径中创建第一个工程的文件结构, 只需要创建前四个文件夹, 其他工程相关文件和文件夹稍后由Keil创建

    └─prj1_demo├─app(我们的应用层代码)├─driver(我们自行编写或其他人编写的第三方驱动)├─library(ARM和ST提供的官方库)├─doc(文档类)└─keil(存放keil工程文件)
    
  • 拷贝标准库的文件到我们的工程文件中

    • 拷贝标准库Libraries下的CMSISSTM32F10x_StdPeriph_Driver两个文件夹到工程的library
    • 拷贝标准库Project\STM32F10x_StdPeriph_Examples\GPIO\IOToggle下的main.c stm32f10x_conf.h stm32f10x_it.c stm32f10x_it.h四个文件到工程的app中(不要拷贝system_stm32f10x.c)

    对比c语言阶段的学习:

    app相当于我们编写的代码, 通常统一以main.c的文件作为入口

    lib相当于标准库或者qt库, 早期嵌入式习惯将一个工程相关的库都放在工程内, 之后的则使用共享库(不要改), 其中cmsis是内核相关的操作库, 其他则是厂家的库

    prj相当于makefile, xxx.pro等项目相关文件, keil/iar等都有自己对应的工程文件, keil的名叫<项目名>.uvprjx

    drivers相当于libmsc.so等放置的位置

    doc一般放置自述文件readme.txt/readme.md和项目

    标准库的开发方式更像是移植, 而不是创建

4、搭建框架

  • Keil 创建新工程, 工程文件保存在keil文件夹路径下, 命名stm32prj

    通常情况下, 工程名应该与整个工程文件夹的名字一样, 也就是prj1_demo

    考虑到之后的工程都是从这个工程直接复制, 因此使用一个更通用的工程名

  • 选择设备型号f103ve

  • 不添加任何库(不勾选任何选项, 并确定)

    我们使用keil仅仅为了帮我们管理工程, 以及使用keil的工具链来编译/下载/调试

在这里插入图片描述

  • project-manage-project items中, Groups按如下分组和添加文件(工程中的group不能有二级组, 所以lib部分需要拆分成三部分)

    Groups组名说明添加的文件
    app用户代码apps/main.c
    apps/stm32f10x_it.c
    driver第三方驱动[留空]
    cmsis内核库libraries/CMSIS/CM3/DeviceSupport/STM32F10x/system_stm32f10x.c
    stdLib标准库libraries/STM32F10x_StdPeriph_Driver/src/xxx.c
    startup启动文件libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_hd.s
    • main()函数是C语言部分代码的入库, 在进入c代码之前, 芯片需要先执行startup启动文件才能启动, 随后才进入c语言部分, 并且这个启动文件使用的是汇编语言

    • 选择 startup_stm32f10x_hd.s 这个文件,因为hd 代表 High Density(高密度),用于区分 STM32F10x 系列不同的 Flash 和 RAM 规格。

    分类后缀Flash 容量典型芯片
    低密度(Low Density)ld16KB ~ 32KBSTM32F101C4, STM32F103C6
    中密度(Medium Density)md64KB ~ 128KBSTM32F103RB, STM32F101R8
    高密度(High Density)hd256KB ~ 512KBSTM32F103RE, STM32F103ZC
    超高密度(XL Density)xl512KB ~ 1MBSTM32F103ZG, STM32F103VH
    • 标准库选择了全部文件, 实际上如果使用了什么外设, 就只需要包含对应文件即可, 提高编译速度
  • 打开Options for Target, 对这个项目进行一些额外配置

    • Target中设置ARM CompilerUse default compiler version 5

      此处为设置编译器, 可选GCCARMCC, 新版keil默认为ARMCC v6, 标准库是按照ARMCC v5编写的
      在这里插入图片描述

    • Output中勾选Create HEX File

      keil默认生成axf文件, 而大多数编程器都使用hex格式的文件进行烧录

      这些文件其实就是最终生成的二进制文件

      在这里插入图片描述

    • C/C++中设置Define

      • STM32F10X_HD USE_STDPERIPH_DRIVER

        注意这里是两个词, 中间用空格隔开, 相当于全局增加了两句话:

        #define STM32F10X_HD 
        #define USE_STDPERIPH_DRIVER
        
    • C/C++中设置Include Paths(使用右边的...按钮, 选择文件夹, keil会自动识别为相对路径)

      • ..\app
      • ..\driver
      • ..\library\CMSIS\CM3\CoreSupport
      • ..\library\CMSIS\CM3\DeviceSupport\ST\STM32F10x
      • ..\library\STM32F10x_StdPeriph_Driver\inc
    • Debug中选择右边的UseCMSIS-DAP Debugger

      教程使用的开发板是野火F103, 配套仿真器为CMSIS-DAP标准的仿真器, 所以选择此项

    • 再点开Settings

      • Debug标签页的Max Clock设置为5MHz

      • Flash Download标签页勾选Reset and Run

        1. 调低烧录速度更稳定
        2. keil默认烧录完毕后系统不会自动开始运行, 需要手动按一下开发板上的reset按键, 而勾选此Reset and Run选项, 烧录完立刻运行, 不用手动重启
  • edit-configuration-Editor中设置Encoding为第二个选项(utf-8)

    Keil默认使用ANSI编码 不支持中文

    改为更通用的UTF-8编码

5、开始编写代码

在这里插入图片描述

注意代码需要以空行结尾

  • 编译, 使用到的编译选项为:

    • Traslate(ctrl+F7), 相当于gcc -c xxx.c, 编译当前打开的一个文件为xxx.o文件
    • Build(F7), 相当于make, 编译整个工程, 只会编译有变动的文件
    • Rebuild, 相当于make clean && make, 完全重新编译整个工程

在这里插入图片描述

相关文章:

【STM32】第一个工程的创建

目录 1、获取 KEIL5 安装包2、开始安装 KEIL52.1、 激活2.2、安装DFP库 3、工程创建4、搭建框架5、开始编写代码 1、获取 KEIL5 安装包 要想获得 KEIL5 的安装包&#xff0c;在百度里面搜索“KEIL5 下载”即可找到很多网友提供的下载文件&#xff0c;或者到 KEIL 的官网下载&a…...

SpringBoot+策略模式+枚举类,优雅消除if-else

需求分析 公司做物联网系统的&#xff0c;使用nettry进行设备连接&#xff0c;对设备进行数据采集&#xff0c;根据设备的协议对数据进行解析&#xff0c;解析完成之后存放数据库&#xff0c;但是不同厂家的设备协议不同。公司系统使用了使用了函数式编程的去写了一个解析类&am…...

前端框架学习路径与注意事项

学习前端框架是一个系统化的过程&#xff0c;需要结合理论、实践和工具链的综合掌握。以下是学习路径的关键方面和注意事项&#xff1a; 一、学习路径的核心方面 1. 基础概念与核心思想 组件化开发&#xff1a;理解组件的作用&#xff08;复用性、隔离性&#xff09;、组件通信…...

kubeval结合kube-score实现k8s yaml文件校验

一、工具定位与互补性 工具核心能力检查范围kubeval校验 YAML 语法和 API 版本兼容性确保资源配置符合 Kubernetes 版本规范kube-score检查安全配置与最佳实践识别资源限制缺失、权限过高等问题 协同作用&#xff1a; kubeval 确保配置文件的语法正确性&#xff0c;避免低级错…...

Linux驱动开发-①platform平台②MISC字符驱动框架③input框架

Linux驱动开发-①platform平台②MISC字符驱动框架③input框架 一&#xff0c;platform1.1 platform框架&#xff08;设备树下&#xff09;1.2 platform框架&#xff08;配置设备函数&#xff09; 二&#xff0c;MISC字符驱动框架三&#xff0c;input框架 一&#xff0c;platfor…...

【mysql】唯一性约束unique

文章目录 唯一性约束 1. 作用2. 关键字3. 特点4. 添加唯一约束5. 关于复合唯一约束 唯一性约束 1. 作用 用来限制某个字段/某列的值不能重复。 2. 关键字 UNIQUE3. 特点 同一个表可以有多个唯一约束。唯一约束可以是某一个列的值唯一&#xff0c;也可以多个列组合的值唯…...

pytest的测试报告allure

1、安装jdk,安装allure、下载allure,配置环境变量 1.1、下载地址:https://repo.maven.apache.org/maven2/io/qameta/allure/allurecommandline 找到最新版本下载即可 【下载zip包】解压到任意目录,建议目录不要在C盘 不要太深 最好不要有中文;进入allure解压后的目录,找到…...

常见中间件漏洞:Jboss篇

CVE-2015-7501 环境搭建 cd vulhub-master/jboss/JMXInvokerServlet-deserialization docker-compose up -d 过程 访问网址&#xff0c;存在页面说明接口存在且存在反序列化漏洞 http://8.130.17.222:8080/invoker/JMXInvokerServlet 2.下载 ysoserial ⼯具进⾏漏洞利⽤…...

2025年优化算法:龙卷风优化算法(Tornado optimizer with Coriolis force,TOC)

龙卷风优化算法&#xff08;Tornado optimizer with Coriolis force&#xff09;是发表在中科院二区期刊“ARTIFICIAL INTELLIGENCE REVIEW”&#xff08;IF&#xff1a;11.7&#xff09;的2025年智能优化算法 01.引言 当自然界的狂暴之力&#xff0c;化身数字世界的智慧引擎&…...

3.24-3 接口测试断言

一.postman 断言 1.断言再test中 #状态码是否等于200 tests["Status code is 200"] responseCode.code 200; #断言响应时间小于200ms tests["Response time is less than 200ms"] responseTime < 200; #断言响应体包含内容 tests["Body…...

DeepSeek面试——模型架构和主要创新点

本文将介绍DeepSeek的模型架构多头潜在注意力&#xff08;MLA&#xff09;技术&#xff0c;混合专家&#xff08;MoE&#xff09;架构&#xff0c; 无辅助损失负载均衡技术&#xff0c;多Token 预测&#xff08;MTP&#xff09;策略。 一、模型架构 DeepSeek-R1的基本架构沿用…...

【PostgreSQL】pg各版本选用取舍逻辑与docker安装postgres:15

企业常用 PostgreSQL 版本推荐 1. PostgreSQL 14&#xff08;最常见&#xff0c;稳定&#xff09; 目前许多企业仍在使用 PostgreSQL 14&#xff0c;因为它在性能、并发处理、JSON 支持等方面做了较多优化&#xff0c;同时又非常稳定。官方支持时间&#xff1a;2026 年 11 月…...

Python----计算机视觉处理(Opencv:图像亮度变换)

一、图像亮度变换 亮度调整&#xff1a;图像像素强度整体变高或者变低。 对比度调整&#xff1a;图像暗处像素强度变低&#xff0c;图像亮处像素强度变高&#xff0c;从而拉大中间某个区域范围的显示精 度。 A&#xff1a;原图 …...

无人机动平衡-如何在螺旋桨上添加或移除材料

平衡无人机螺旋桨是一项精细的工作&#xff0c;直接影响飞行稳定性和组件寿命。不同的方法适用于不同的情况&#xff0c;螺旋桨的材料和尺寸以及所需调整的幅度都会影响选择的方法。 本文将深入探讨添加如胶水和胶带等材料的方法&#xff0c;以及通过打磨和修剪来移除质量的方…...

基于python的租房网站-房屋出租租赁系统(python+django+vue)源码+运行步骤

该项目是基于python/django/vue开发的房屋租赁系统/租房平台&#xff0c;作为本学期的课程作业作品。欢迎大家提出宝贵建议。给师弟开发的课程作业&#xff0c;技术学习可以留言哦 功能介绍 平台采用B/S结构&#xff0c;后端采用主流的PythonDjango进行开发&#xff0c;前端采…...

C++ 的 if-constexpr

1 if-constexpr 语法 1.1 基本语法 ​ if-constexpr 语法是 C 17 引入的新语法特性&#xff0c;也被称为常量 if 表达式或静态 if&#xff08;static if&#xff09;。引入这个语言特性的目的是将 C 在编译期计算和求值的能力进一步扩展&#xff0c;更方便地实现编译期的分支…...

涨薪技术|k8s设计原理

01k8s介绍 Kubernetes 是一个可移植、可扩展的开源平台&#xff0c;用于管理容器化 工作负载和服务&#xff0c;有助于实现声明性配置和自动化。它有一个庞大、快速增长的生态系统。Kubernetes 服务、支持和工具广泛可用。Kubernetes 这个名字起源于希腊语&#xff0c;意思是舵…...

基于FPGA的16QAM+帧同步系统verilog开发,包含testbench,高斯信道,误码统计,可设置SNR

目录 1.算法仿真效果 2.算法涉及理论知识概要 2.1 16QAM调制解调原理 2.2 帧同步 3.Verilog核心程序 4.完整算法代码文件获得 1.算法仿真效果 vivado2019.2仿真结果如下&#xff08;完整代码运行后无水印&#xff09;&#xff1a; 设置SNR12db 将FPGA数据导入到MATLAB显…...

QuecPython 外设接口之GPIO应用指南

基础知识 了解GPIO基础知识更有益于我们使用它。 框图 GPIO&#xff08;通用输入输出&#xff09;是指一种通用的数字输入/输出接口&#xff0c;用于与外部电子元件或设备进行通信。它通常存在于微处理器、微控制器和其他嵌入式系统中。 物理电路结构如下图所示&#xff1a…...

Spring Boot 整合 Nacos 注册中心终极指南

在微服务架构中&#xff0c;配置管理和动态路由是核心需求。Nacos 作为阿里巴巴开源的动态服务发现、配置管理和服务管理平台&#xff0c;能够帮助开发者实现配置热更新、多环境共享配置以及动态路由管理。本文将结合 Spring Boot 和 Spring Cloud Gateway&#xff0c;手把手教…...

清晰易懂的 Maven 彻底卸载与清理教程

一、Windows 系统卸载 Maven 步骤 1&#xff1a;删除 Maven 安装目录 找到 Maven 的安装路径&#xff08;默认可能为 C:\Program Files\apache-maven-3.x.x 或自定义路径&#xff09;。直接删除整个 Maven 文件夹&#xff08;如 apache-maven-3.x.x&#xff09;。 步骤 2&am…...

光流 | 基于KLT算法的人脸检测与跟踪原理及公式,算法改进,matlab代码

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 人脸检测与跟踪 一、KLT算法原理与分析1. 核心思想2. 数学模型二、人脸…...

Spring MVC请求与响应全解析:从参数绑定到异常处理

文章目录 一、请求映射的艺术&#xff1a;RequestMapping深度解析1. 多级路径配置2. 六大核心属性3. RESTful风格实践 二、参数绑定黑科技1. 智能绑定机制基础类型绑定对象嵌套绑定集合类型绑定 2. 参数处理三剑客 三、响应处理全攻略1. 视图跳转三种模式2. JSON交互实践 四、文…...

用免费的github的key调用gpt实现一个简单的rag自动打分评测系统,不用任何框架

1.环境准备 !pip install pymupdf numpy openai 2.导入依赖 import fitz import os import numpy as np import json from openai import OpenAI 3.pdf提取文本 def extract_text_from_pdf(pdf_path):"""从 PDF 文件中提取文本内容。参数:pdf_path (str): …...

SQLServer列转行操作及union all用法

1.创建测试表及数据sql如下 create table ScoresTable( Name varchar(50), ChineseScore int, MathScore int ) insert into ScoresTable values(小张,90,95) insert into ScoresTable values(小王,98,99) 2.表中查询结果如下 3.现需列转行显示&#xff0c;每行显示 姓名…...

深度学习框架PyTorch——从入门到精通(6.2)自动微分机制

本节自动微分机制是上一节自动微分的扩展内容 自动微分是如何记录运算历史的保存张量 非可微函数的梯度在本地设置禁用梯度计算设置requires_grad梯度模式&#xff08;Grad Modes&#xff09;默认模式&#xff08;梯度模式&#xff09;无梯度模式推理模式评估模式&#xff08;n…...

Java面试10个“隐藏考点”

1. Java模块化系统&#xff08;JPMS&#xff09;的requires transitive作用 问题&#xff1a;如何在模块化项目中传递依赖&#xff1f; 解析&#xff1a; ​**requires transitive**&#xff1a;声明模块的依赖可被下游模块隐式继承。​示例&#xff1a;模块A依赖模块B并添加…...

【GL010】C++

1.C中的const关键字有哪些用法&#xff1f; 1.修饰变量&#xff1a;表示变量的值不可修改。 const int a 10; 2.修饰指针&#xff1a; const int* p&#xff1a; // 指针指向的内容不可修改。 int* const p&#xff1a; // 指针本身不可修改。 const int* const…...

(Arxiv-2025)MagicDistillation:用于大规模人像少步合成的弱到强视频蒸馏

MagicDistillation&#xff1a;用于大规模人像少步合成的弱到强视频蒸馏 paper是HKUST发布在Arxiv 2025的工作 paper title&#xff1a;MagicDistillation: Weak-to-Strong Video Distillation for Large-Scale Portrait Few-Step Synthesis Project page&#xff1a;地址 Abst…...

Linux paste命令

目录 一. 简介二. 基本语法三. 小案例 一. 简介 paste 命令用于合并多个文件的行&#xff0c;按列方式输出&#xff0c;默认以制表符&#xff08;Tab&#xff09;分隔。 ⏹基本语法 paste [选项] 文件1 文件2 ...二. 基本语法 <()的方式模拟文件流paste命令将2个文件流粘…...