【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, 完全重新编译整个工程

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/74396.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

动态规划~01背包问题

01背包问题 经典的0 - 1背包问题的解决方案。 二维数组的版本 代码功能概述 0 - 1背包问题指的是有 n 个物品和一个容量为 m 的背包&#xff0c;每个物品有对应的体积 v[i] 和价值 w[i]&#xff0c;需要从这些物品里挑选若干个放入背包&#xff0c;让背包内物品的总价值达到最…

深入理解Java享元模式及其线程安全实践

引言 在软件系统中&#xff0c;当需要处理海量细粒度对象时&#xff0c;直接创建大量实例可能会导致内存消耗激增和性能下降。享元模式&#xff08;Flyweight Pattern&#xff09;通过共享对象内部状态&#xff0c;成为解决这类问题的经典方案。然而在多线程环境下&#xff0c…

1、mysql基础篇--概述

关系型数据库&#xff08;RDBMS&#xff09; 概念特点&#xff1a;数据模型&#xff1a; 概念 建立在关系模型基础上&#xff0c;有多张表相互连接的二维表组成的数据库 特点&#xff1a; 1、使用表存储&#xff0c;格式统一&#xff0c;便于维护 2、使用sql语言操作&#…

如何提升库存系统的高并发和稳定性:算法与设计模式

库存系统是企业运营的核心模块&#xff0c;尤其是在电商、零售和供应链管理中&#xff0c;系统的高并发和稳定性直接影响订单处理的准确性和效率。面对海量订单、复杂的库存管理需求&#xff0c;如何在高并发环境下确保库存数据的准确性和系统的稳定性&#xff1f;本文将从架构…

【多线程】synchronized底层实现的方式

前言 在java 开发中对于锁的应用非常的常见&#xff0c;如果对于什么时候该用什么锁&#xff0c;以及锁实现的原理有所不知道的&#xff0c;或者面试过程中面试官问你不知道怎么回答的&#xff0c;欢迎来看下面的文章 1、synchronized和ReentrantLock的区别 2、synchronized的…

Pytorch中Tensorboard的学习

1、Tensorboard介绍 TensorBoard 是 TensorFlow 开发的一个可视化工具&#xff0c;用于帮助用户理解和调试机器学习模型的训练过程。尽管它最初是为 TensorFlow 设计的&#xff0c;但通过 PyTorch 的 torch.utils.tensorboard 模块&#xff0c;PyTorch 用户也可以方便地使用 Te…

ETL 自动化:提升数据处理效率与准确性的核心驱动力

在数字化转型的浪潮中&#xff0c;数据已成为企业战略资产&#xff0c;高效处理数据的能力直接关系到企业的竞争力。ETL&#xff08;Extract, Transform, Load&#xff09;自动化作为数据处理领域的关键技术&#xff0c;正逐渐成为企业在数据时代脱颖而出、实现高效运营与精准决…

std::endl为什么C++ 智能提示是函数?

在使用vscode 的C智能提示后&#xff0c;输入endl 后&#xff0c;提示的却是std::endl(basic_ostream<CharT, Traits> &os), 感觉比较奇怪&#xff0c;各种代码里都是直接用的std::endl 啊&#xff0c; 这里怎么变成函数了呢&#xff1f; 在 C 中&#xff0c;std::en…

简洁、实用、无插件和更安全为特点的WordPress主题

简站WordPress主题是一款以简洁、实用、无插件和更安全为特点的WordPress主题&#xff0c;自2013年创立以来&#xff0c;凭借其设计理念和功能优势&#xff0c;深受用户喜爱。以下是对简站WordPress主题的详细介绍&#xff1a; 1. 设计理念 简站WordPress主题的核心理念是“崇…

数据结构篇:空间复杂度和时间复杂度

目录 1.前言&#xff1a; 1.1 学习感悟 1.2 数据结构的学习之路(初阶) 2.什么是数据结构和算法 2.1 数据结构和算法的关系 2.2 算法的重要性 2.3 如何衡量算法的好坏 3.时间复杂度 3.1 时间复杂度的概念 3.2 大O的渐进表示法 O() 4.空间复杂度 5. 常见的时间复杂度和…

node-ddk,electron,截屏封装(js-web-screen-shot)

node-ddk 截屏封装(js-web-screen-shot) https://blog.csdn.net/eli960/article/details/146207062 也可以下载demo直接演示 http://linuxmail.cn/go#node-ddk 感谢/第三方 本截屏工具, 使用的是: js-web-screen-shot https://www.npmjs.com/package/vue-web-screen-shot…

泰坦军团携手顺网旗下电竞连锁品牌树呆熊 共创电竞新纪元

在电竞行业的浪潮中&#xff0c;品牌之间的战略合作愈发成为推动市场前行的重要动力。最近&#xff0c;电竞显示器领域领军品牌泰坦军团高层领导出席顺网旗下电竞连锁品牌树呆熊十周年盛典。会议现场&#xff0c;双方高层领导宣布泰坦军团与树呆熊正式达成战略合作伙伴关系。 在…

HandyJSON原理

HandyJSON 的优势 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式, 应用广泛. 在 App 的使用过程中, 服务端给移动端发送的大部分都是 JSON 数据, 移动端需要解析数据才能做进一步的处理. 在解析JSON数据这一块, 目前 Swift 中流行的框架基本上是 SwiftyJSON, …

信号的产生和保存

信号的产生 信号就是操作系统对用户操作做出的反应&#xff0c;但它的本质就是往操作系统写入信号&#xff0c;这是由操作系统的结构决定的。通过修改比特位来告诉操作系统接收信号和传了几号信号。 也正是因为我们身为用户无法亲自修改内核数据&#xff0c;所以我们需要通过操…

在C++ Qt中集成Halcon窗口并实现跨平台兼容和大图加载

目录 1. Halcon窗口嵌入Qt Widget 2. 处理大图加载 3. 多线程优化显示 4. 跨平台兼容性 1. Halcon窗口嵌入Qt Widget 将Halcon的HWindow控件嵌入到Qt的QWidget容器中,利用系统原生句柄实现跨平台。 #include <HalconCpp.h> #include <QWidget>class HalconWi…

深度学习技术与应用的未来展望:从基础理论到实际实现

深度学习作为人工智能领域的核心技术之一&#xff0c;近年来引起了极大的关注。它不仅在学术界带来了革命性的进展&#xff0c;也在工业界展现出了广泛的应用前景。从图像识别到自然语言处理&#xff0c;再到强化学习和生成对抗网络&#xff08;GAN&#xff09;&#xff0c;深度…

蓝光三维扫描技术:汽车零部件检测的精准高效之选

——汽车方向盘配件、保险杠塑料件、钣金件检测项目 汽车制造工业的蓬勃发展&#xff0c;离不开强大的零部件制造体系作支撑。汽车零部件作为汽车工业的基础&#xff0c;其设计水平、制造工艺、质量控制手段逐渐与国际标准接轨&#xff0c;对于零部件面差、孔位、圆角、特征线…

数据库联表Sql语句建一个新表(MySQL,Postgresql,SQL server)

数据库联表Sql语句建一个新表(MySQL,Postgresql,SQL server) 如果你想基于 SELECT USERS.ID,USERS.NAME,USERS.EMAIL,USERS.ID_CARD,USERS.V_CARD,USERS.ADDRESS,v_card.type,v_card.amount FROM USERS JOIN v_card on USERS.V_CARDv_card.v_card 这个查询结果创建一个新表&am…

六十天前端强化训练之第三十天之深入解析Vue3电商项目:TechStore全栈实践(文结尾附有源代码)

欢迎来到编程星辰海的博客讲解 看完可以给一个免费的三连吗&#xff0c;谢谢大佬&#xff01; 目录 深入解析Vue3电商项目&#xff1a;TechStore全栈实践 一、项目架构设计 二、核心功能实现 三、组合式API深度实践 四、性能优化实践 五、项目扩展方向 六、开发经验总结…

【人工智能】机器学习中的评价指标

机器学习中的评价指标 在机器学习中&#xff0c;评估指标&#xff08;Evaluation Metrics&#xff09;是衡量模型性能的工具。选择合适的评估指标能够帮助我们更好地理解模型的效果以及它在实际应用中的表现。 一般来说&#xff0c;评估指标主要分为三大类&#xff1a;分类、…