【07】STM32·HAL库开发-新建寄存器版本MDK工程 |下载STM32Cube固件包 | 新建MDK工程步骤

目录

  • 1.新建工程前的准备工作(了解)
    • 1.1下载相关STM32Cube 官方固件包(F1/F4/F7/H7)
  • 2.新建寄存器版本MDK工程步骤(熟悉)
    • 2.1新建工程文件夹
      • 2.1.1Drivers文件夹
      • 2.1.2Middlewares文件夹
      • 2.1.3Output文件夹
      • 2.1.4Projects文件夹
      • 2.1.4User文件夹
    • 2.2新建一个工程框架
      • 2.2.1新建并保存工程
      • 2.2.2选择主控型号
      • 2.2.3删除文件夹
    • 2.3添加文件
    • 2.3.1设置工程名和分组名
    • 2.3.2添加启动文件
    • 2.3.3添加SYSTEM源码
    • 2.4添加Readme分组文件
    • 2.4魔术棒设置
      • 2.4.1Target 选项卡
      • 2.4.2Output 选项卡
      • 2.4.3Listing 选项卡
      • 2.4.4C/C++ 选项卡
      • 2.4.5Debug 选项卡
      • 2.4.6Utilities 选项卡
      • 2.4.7Linker 选项卡(可选)
    • 2.5添加 main.c,并编写代码
  • 3.下载验证(了解)
  • 4.总结(了解)

1.新建工程前的准备工作(了解)

1.1下载相关STM32Cube 官方固件包(F1/F4/F7/H7)

获取方式一:ST官网搜索STM32Cube+回车
在这里插入图片描述
  这里以F1系列为例,点击【STM32CubeF1】
在这里插入图片描述
  点击【Get Software】即可进行下载,首次下载需要注册邮箱,是免费的
在这里插入图片描述
  这里下载最新的1.8.5版本为例进行后期章节编写。
在这里插入图片描述

获取方式二:正点原子开发板A盘资料:A 盘→8,STM32 参考资料→1,STM32CubeXX固件包。
  固件包可以理解为一个软件包,里面包含了.h、.c、.s等文件封装了芯片内部设备,如果想开发或学习此款芯片,必须下载这些固件包才能去开发芯片,而ST公司将其芯片分为不同系列,比如MCU分为F1/F4/F7/H7等,不同的的系列,ST公司将软件资料封装为不同的软件包。

2.新建寄存器版本MDK工程步骤(熟悉)

2.1新建工程文件夹

1.新建工程文件夹:D/M/O/P/U文件夹,5个文件夹。
在这里插入图片描述
  在桌面新建一个工程根目录文件夹,并在该文件夹里新建D/M/O/P/U文件夹:
在这里插入图片描述
  拷贝/新建工程相关文件:在Drivers文件中创建三个文件夹,如果用到了SPI外设就可以在BSP中创建SPI文件夹,如果用到IIC、LED、LCD就可以创建IIC、LED、LCD文件夹。CMSIS、SYSTEM文件夹相对固定,CMSIS存放STMCube固件包中的代码。在这里插入图片描述
  BSP是新建的;SYSTEM文件夹是拷贝正点原子F1系列开发板的【标准例程-寄存器版本】实验1跑马灯中的SYSTEM文件夹,当然也可以复制其他工程的;CMSIS是从下载的固件包中复制。

2.1.1Drivers文件夹

  固件库中主要用到【Device】和【include】两个文件夹,两个文件夹中的内容也不是全部用到,将以下两个文件复制到工程文件中【Drivers】->【CMSIS】,并选择保留用到的文件。
在这里插入图片描述
  include文件夹保留以下内容:
在这里插入图片描述

  在下图示目录下保留相关文件,选择启动文件时,f103是型号,而xe是Flash内存大小,代表大容量F103(256KB≤Flash≤512KB),还有f103x6代表小容量F103(Flash≤32KB)、f103xb代表中容量F103(64KB≤Flash≤128KB)、f103xg代表超大容量f103(768KB≤Flash≤1024KB)。自己使用的板子为F103RCT6的FLASH内存是256KB所以选该型号。
在这里插入图片描述
  对应的头文件目录中保留以下文件:
在这里插入图片描述

2.1.2Middlewares文件夹

  该文件夹用于存放正点原子和其他第三方提供的中间层代码(组件/Lib 等),如: USMART、MALLOC、 TEXT、 FATFS、 USB、 LWIP、各种 OS、各种 GUI 等。(新建工程暂时留空,后续增加功能再往该文件夹中添加)。

2.1.3Output文件夹

  该文件夹用于存放编译器编译工程输出的中间文件,比如: .hex、 .bin、 .o 文件等。

2.1.4Projects文件夹

  该文件夹用于存放编译器(MDK、 IAR 等)工程文件,我们主要用 MDK,为了方便区分,我们在该文件夹下新建: MDK-ARM 文件夹,用于存放 MDK 的工程文件。
在这里插入图片描述

2.1.4User文件夹

  该文件夹用于存放用户编写的代码,如: main.c 等。(后续步骤添加main.c

2.2新建一个工程框架

2.2.1新建并保存工程

  打开Keil5,【Project】->【New uVision Project】->选择保留到新创建的MDK-ARM文件夹中,并命名。

2.2.2选择主控型号

  在跳出的窗口中选择自己芯片的型号。
在这里插入图片描述

  此页面不需要配置,点击Cancel。
在这里插入图片描述
  在保存路径中生成了2个文件夹,具体功能如下(保存工程只生成两个文件夹,没有DebugConfig和MDK的版本有关。):
  

2.2.3删除文件夹

  在保存路径中删除以下文件:
在这里插入图片描述

2.3添加文件

2.3.1设置工程名和分组名

在这里插入图片描述
或者右击“Target1”。
在这里插入图片描述
工程名:Template;分组名:Startup,User,Drivers/SYSTEM,Readme
在这里插入图片描述

2.3.2添加启动文件

  添加文件有两种方式,1是在设置工程名和组名页面直接添加
在这里插入图片描述
  2是直接双击分组名。
在这里插入图片描述
  选择启动文件所在目录,文件类型选择All files。分组名前有“+”,证明添加成功。

在这里插入图片描述
  需要修改启动文件2个地方,1是用不到编译器的内存管理函数,为了节省内存,将Heap_Size改成0(如果不能对启动文件进行修改,需要修改文件属性,把【只读】选项前面的勾去掉)。

Stack_Size      EQU     0x00000000

在这里插入图片描述

  2是寄存器代码不需要SystemInit函数,因此修改Reset_Handler函数,去掉SystemInit调用,用分号“;”注释掉3行内容:

Reset_Handler   PROC
                EXPORT  Reset_Handler             [WEAK]
                IMPORT  __main
                ;IMPORT  SystemInit
                ;LDR     R0, =SystemInit
                ;BLX     R0               
                LDR     R0, =__main
                BX      R0
                ENDP

2.3.3添加SYSTEM源码

  由于分组名没有下一级,所以用斜杠来代表所属。
在这里插入图片描述

2.4添加Readme分组文件

  可以在工厂根目录下创建Readme.txt工程的说明文件,然后加入到工程中。
在这里插入图片描述
在这里插入图片描述

2.4魔术棒设置

2.4.1Target 选项卡

  外部高速晶振频率为8MHz(需要查看自己具体的板子),设置使用的编译器版本(新版MDK不需要修改,旧版设置为AC5)。
在这里插入图片描述

2.4.2Output 选项卡

  设置Objects输出文件夹为工程中的Output文件夹,勾选【Creat HEX File】生成.hex文件、输出浏览信息。
在这里插入图片描述
  删除工程文件夹中以下两个文件夹:
在这里插入图片描述

2.4.3Listing 选项卡

  设置Listing输出文件夹为工程中Output文件夹。
在这里插入图片描述

2.4.4C/C++ 选项卡

  设置全局宏定义为STM32F103xE(其他型号芯片需要根据型号具体修改)、优化等级设置为Level0(默认等级为Level0,选择default和Level0是相同的作用,等级0可以达到最好的调试效果,否则会将没有用到的变量给优化掉,在调试时使用等级0,如果是为了提升代码性能、降低代码量、减少使用内存,可以设置等级1-3,数字越大效果越容易出现问题。)、勾选C99 Mode、设置头文件包含路径。
在这里插入图片描述
  此处的头文件路径时是设置的相对路径,后期不用再进行修改。

绝对路径是指目录下的绝对位置,直接到达目标位置,通常是从盘符开始的路径(比如说从E盘开始);相对路径就是指由某个文件所在的路径引起的跟其它文件(或文件夹)的路径关系。

1,默认路径就是指 MDK 工程所在的路径,即.uvprojx 文件所在路径(文件夹)(相对路径也就是相对于以下路径
在这里插入图片描述

2,“./”表示当前目录(相对当前路径,也可以写做“.\”)
3,“…/”表示当前目录的上一层目录(也可以写做“…\”)

2.4.5Debug 选项卡

  设置使用的仿真器类型(这里我使用ST-Link的下载方式)、勾选相关选项、选择的下载接口为SW模式并将时钟设置为最大。
在这里插入图片描述

2.4.6Utilities 选项卡

  设置下载功能勾选【Use Debug Driver】并在Setting中勾选【Reset and Run】。
在这里插入图片描述
  下载算法(默认已经添加好,如果不见了可以点击【Add】进行添加),下载算法起始地址和大小(默认即可)。
在这里插入图片描述

2.4.7Linker 选项卡(可选)

  添加分散加载文件(北极星/MiniPro H750)。这里以添加MiniPro H750为例,取消勾选【Use Memory Layout from Target Dialog】,并且在【disable Warning】栏屏蔽6314和6329警告,填写“6314,6329”,点击三个点选择分类加载文件,在正点原子例程中,该文件放置在User\SCRIPT文件夹中,查看分类加载文件就点击Edit,正点原子的分类加载文件是AC5和AC6兼容的,关键看文件第一行是什么,如果是#! armcc - E那就就是兼容AC5,如果改为兼容AC6,需要把第二行提到第一行,不能用分号“;”注释第一行再启用第二行。
在这里插入图片描述

2.5添加 main.c,并编写代码

  创建main.c文件并保存到工程User文件夹中。
在这里插入图片描述
  添加到User分组,然后并拷贝代码到main.c中。
在这里插入图片描述

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"

int main(void)
{
    uint8_t t = 0;
    sys_stm32_clock_init(9);    /* 设置时钟, 72Mhz */
    delay_init(72);             /* 延时初始化 */
    usart_init(72, 115200);     /* 串口初始化 */

    while (1)
    {
        printf("t:%d\r\n", t);
        delay_ms(500);
        t++;
    }
}

3.下载验证(了解)

  将程序下载到开发板,用串口助手打开相应串口,点击开发板的复位按钮即可出现,每隔500ms打印一次变量t的值,t最大为255。
在这里插入图片描述

4.总结(了解)

  正点原子工程中的keilkill.bat文件会将Output文件夹中没用到的文件进行删除。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringMvc学习——在idea中新建springWeb项目 浏览器请求 和 服务器响应 SpringMvc文件相关

目录 引出基础知识:三层架构和MVC1. 三层架构2.MVC模型 springWeb项目IDEA搭建1.新建一个普通的maven项目2.导入包,pom.xml文件3.写主启动类Main.java文件SpringBootApplication4.写application.yml文件spring的配置文件5.启动,运行main.java…

Spark大数据处理学习笔记(3.8.3) Spark RDD典型案例-利用RDD实现分组排行榜

该文章主要为完成实训任务,详细实现过程及结果见【http://t.csdn.cn/Twpwe】 文章目录 一、任务目标二、准备工作2.1 在本地创建成绩文件2.2 将成绩文件上传到HDFS上指定目录 三、完成任务3.1 在Spark Shell里完成任务3.1.1 读取成绩文件得到RDD3.1.2 利用映射算子生…

Spring Cloud Alibaba Seata(一)

目录 一、Seata 1、分布式事务简介 1.1、分布式事务理论 1.2、分布式事务解决方案 2、Seata简介 3、Seata安装 一、Seata 1、分布式事务简介 基础概念:事务ACID A(Atomic):原子性,构成事务的所有操作&#xf…

27-2BP_Adaboost强分类器公司财务预管建模——强分类器和弱分类器(附matlab程序)

1.简述 Adaboost算法的思想是合并多个“弱”分类器的输出以产生有效分类。其主要步骤为:首先给出弱学习算法和样本空间(x,y),从样本空间中找出m组训练数据,每组训练数据的权重都是1/m。然后用弱学习算法迭代运算T次&am…

爬虫小白应该如何学习爬虫

什么是Python3网络爬虫? 定义: 网络爬虫(Web Spider),又被称为网页蜘蛛,是一种按照一定的规则,自动地抓取网站信息的程序或者脚本。爬虫其实是通过编写程序,模拟浏览器上网&#x…

Flutter 库:强大的工具及扩展——nb_utils

Flutter 库:强大的工具及扩展——nb_utils 文章目录 Flutter 库:强大的工具及扩展——nb_utils一、概述1、简介2、功能3、官方资料 二、基本使用1、安装2、基本使用第一步:在 main.dart 中初始化第二步:在您的 MaterialApp 或 Cup…

SpringBoot中@ControllerAdvice的三种使用场景

一、全局异常处理 代码示例如下: /*** author qinxun* date 2023-06-14* Descripion: 业务层异常枚举*/ public enum ServiceExceptionEnum {SUCCESS(0, "成功"),ERROR(1, "失败"),SYS_ERROR(1000, "服务端发生异常"),MISSING_REQUEST_PARAM_E…

微信小程序自定义模块

自定义wxs并引入 新建一个tools.wxs 创建一些function,并使用moule.exports {}导出 使用 <wxs>标签 并填写正确src 书写module名称 之后在其他标签内&#xff0c;使用 {{自定的module名称.自定义的一个function并传入对应参数}}就可以实现参数在自定义function中的导入…

用docker搭建selenium grid分布式环境实践

目录 前言&#xff1a; selenium jar包直接启动节点 用docker命令直接启动 docker-compose 启动 Hub和node在一台机器上 Hub和node不在一台机器上 遗留问题 总结 前言&#xff1a; Selenium是一个流行的自动化测试工具&#xff0c;支持多种编程语言和多种浏览器。Sele…

SpringCloudAlibaba之Sentinel源码分析--protoc-3.17.3-win64

Sentinel源码分析 文章目录 Sentinel源码分析1.Sentinel的基本概念1.1.ProcessorSlotChain1.2.Node1.3.Entry1.3.1.自定义资源1.3.2.基于注解标记资源 1.4.Context1.4.1.什么是Context1.4.2.Context的初始化1.4.2.1.自动装配1.4.2.2.AbstractSentinelInterceptor1.4.2.3.Contex…

【linux kernel】linux media子系统分析之media控制器设备

文章目录 一、抽象媒体设备模型二、抽象媒体设备三、Entity四、Interfaces五、Pad六、Link七、Media图遍历八、使用计数和电源处理九、link设置十、Pipeline和Media流十一、链接验证十二、媒体控制器设备的分配器API 本文基于linux内核 4.19.4&#xff0c;抽象媒体设备模型框架…

chatgpt赋能python:Python如何查找特定名称文件

Python如何查找特定名称文件 在计算机文件管理和互联网网络应用程序中&#xff0c;查找特定文件往往是一项必要的任务。在使用Python编程时&#xff0c;我们可以使用Python内置的os模块来查找特定名称的文件。本文将介绍如何使用Python查找特定名称的文件&#xff0c;并提供实…

013:解决vue中不能加载.geojson的问题

第013个 查看专栏目录: VUE — element UI 本文章目录 问题状态造成这个结果的原因&#xff1a;解决办法Vue Loader 其他特性&#xff1a;专栏目标 问题状态 在做vue项目的时候&#xff0c;碰到这样一个问题&#xff0c;vue页面中引用一个.geojson文件&#xff0c;提示如下错误…

【C++篇】字符串:标准库string类

友情链接&#xff1a;C/C系列系统学习目录 知识总结顺序参考C Primer Plus&#xff08;第六版&#xff09;和谭浩强老师的C程序设计&#xff08;第五版&#xff09;等&#xff0c;内容以书中为标准&#xff0c;同时参考其它各类书籍以及优质文章&#xff0c;以至减少知识点上的…

面试篇:Java基础

目录 一、HashMap 的底层结构和原理 1、JDK7 2、JDK8 3、扩容问题 二、讲一下你对动态代理的理解 1、JDK动态代理 2、CGLIB动态代理 三、Java 集合体系的划分、List、Set、Map 的区别 四、ArrayList 和 LinkedList 的区别 1、数据结构实现&#xff1a; 2、随机访问&a…

Python-Selenium-定位详解

目录 前言&#xff1a; 一、id定位 二、name定位 三、class_name定位 四、xpath定位 五、css_selector定位 六、tag_name定位 七、link_text 定位 八、Xpath&Css定位方法速查表 九、By定位 十、elements复数定位 十一、JS的定位 前言&#xff1a; Python是一种…

pikachu靶场-PHP反序列化

在理解这个漏洞前,你需要先搞清楚php中serialize()&#xff0c;unserialize()这两个函数。 序列化serialize() 序列化说通俗点就是把一个对象变成可以传输的字符串,比如下面是一个对象: class S{public $test"pikachu";}$snew S(); //创建一个对象serialize($s); //…

eclipse中创建一个maven父工程和几个模块(子工程)

示例&#xff1a;创建一个父工程和几个模块&#xff08;子工程&#xff09; 1&#xff09;、先创建一个父工程 注意&#xff1a;下面的Packaging选择pom&#xff1a; 点击Finish&#xff0c;父工程就创建好了&#xff1a; 2&#xff09;、再创建模块&#xff08;module&am…

RuntimeError: launcher ‘pdsh‘ not installed解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

麒麟系统在线安装docker(x86/arm)

文章目录 一、查看系统版本&#xff0c;确认版本二、查看系统架构三、下载安装docker-ceX86架构安装aarch64架构 一、查看系统版本&#xff0c;确认版本 [rootlocalhost ~]# cat /etc/kylin-release Kylin Linux Advanced Server release V10 (Sword)二、查看系统架构 [root…