【正点原子STM32连载】 第七章 Geehy标准库版本MDK工程创建 摘自【正点原子】APM32F407最小系统板使用指南
1)实验平台:正点原子stm32f103战舰开发板V4
2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html#
第七章 Geehy标准库版本MDK工程创建
在上一章的内容中简单介绍了Geehy标准库,本章将详细讲解使用Geehy标准库创建MDK工程的步骤,本章创建好的MDK工程存放路径为A盘4,程序源码标准例程实验0 基础入门实验实验0-3 新建工程实验-标准库版本,读者在创建工程时若遇到问题,可打开该工程进行对比。
本章分为如下几个小节:
7.1 Geehy标准库版本MDK工程创建
7.2 下载验证
7.1 Geehy标准库版本MDK工程创建
在开始进行工程创建前,要求读者提前做好如下准备:
①:获取到Geehy提供的APM32F4xx_SDK(参考第六章)
②:搭建好开发环境(参考第三章)
Geehy标准库版本MDK工程的创建可分为四个步骤,如下:
①:构建工程文件夹
②:添加文件到工程目录
③:创建MDK工程
④:配置MDK工程
7.1.1 构建工程文件夹
构建工程文件夹前需要先确定工程文件夹结构,建议初学者使用本书配套实验例程工程的文件夹结构,该工程文件夹结构也是正点原子所有实验例程的工程文件夹结构,读者可任意打开一个本书配到的实验例程根目录,如下图所示:
图7.1.1.1 工程文件夹结构
该工程文件夹结构清晰,其中各个子文件夹的作用如下表所示:
表7.1.1.1 工程子文件夹介绍
接下来,就按照上面介绍的工程文件夹结构构件工程文件夹,如下图所示:
图7.1.1.2 构建工程文件夹
上图中还另外添加了keilkill.bat的脚本文件和readme.txt文本文件,其中keilkill.bat脚本文件用于清除工程文件夹中编译工程产生的中间文件,方便工程的存档和传输,readme.txt文本文件主要是对该工程的描述,包括工程功能、使用的硬件资源等信息。
7.1.2 添加文件到工程目录
在该步骤中,涉及了五个文件夹,如下:
①:Drivers文件夹
Drivers文件夹用于存放与硬件相关的驱动文件,如下表所示:
表7.1.2.1 Drivers文件夹介绍
其中CMSIS、Device和APM32F4xx_StdPeriphDriver都可以从APM32F4xx_SDK中获取;而SYSTEM文件夹是正点原子提供的系统级核心驱动代码,主要提供了系统时钟初始化、延时、串口收发等基础功能,读者可在本书配套的任意一个实验例程中获取到该文件夹;BSP文件夹为开发板板级支持包驱动代码,在初次创建工程时留空即可,在后续的实验中会逐渐完善BSP文件夹。
添加好文件的Drivers文件夹,如下图所示:
图7.1.2.1 Drivers文件夹
②:Middlewares文件夹
Middlewares文件夹用于存放正点原子提供的中间组件(USMART、MALLOC等)和第三方中间组件(FatFs、FreeRTOS等)在初次创建工程时,并不会用到这些中间组件,因此留空即可。
③:Output文件夹
Output文件夹用户存放MDK工程编译后产生的二进制文件和编译过程文件等,这些文件均由MDK软件在进行工程编译的时候产生,留空即可。
④:Projects文件夹
Projects文件夹主要用于存放MDK的工程文件,在Projects文件夹中创建一个MDK-ARM的空文件夹,用于下文创建MDK工程时,存放MDK的工程文件,如以下图所示:
图7.1.2.2 Projects文件夹
⑤:User文件夹
User文件夹用于存放用户编写的应用代码,例如main.c等,main.c文件中提供了main()函数(必须有该函数),对于初次创建的工程,可以从“实验0-3 新建工程实验-标准库版本”的工程中复制。另外,在该文件夹下还会存放apm32f4xx_int.c和apm32f4xx_int.h这两个文件,这两个文件主要是用于管理程序中的中断服务函数,这两个文件直接从“实验0-3 新建工程实验-标准库版本”的工程中复制即可。
添加好文件的User文件夹,如下图所示:
图7.1.2.3 User文件夹
7.1.3 创建MDK工程
在完成了以上两大步骤后,接下来可以开始创建MDK工程了,首先打开MDK软件,依次点击菜单栏中的ProjectNew uVision Project,如下图所示:
图7.1.3.1 新建MDK工程
随后在弹出的窗口中选择工程文件的保存路径和工程文件名,如下图所示:
图7.1.3.2 保存工程文件
点击保存后,会弹出选择设备的窗口,其实就是选择所使用的MCU型号,这里选择GeehyAPM32F4 SeriesAPM32F407APM32F407ZG,如下图所示:
图7.1.3.3 选择MCU型号
正确选择MCU型号并点击“OK”按钮后,会弹出RTE(Run Time Environment,运行时环境,由MDK提供)的管理窗口,本文配套的所有实验例程均不使用RTE,点击窗口下方的“Cancel”按钮关闭窗口即可。
至此,就能看到MDK工程的一个雏形了,如下图所示:
图7.1.3.4 MDK工程雏形
7.1.4 配置MDK工程
配置MDK工程主要就是为工程添加一些源码文件,以及对MDK工程进行一些配置等。
在添加源码文件之前,先创建一些分组,使工程的结构更加清晰明了。点击工具栏上的按钮打开工程项目管理窗口,在工程项目管理窗口中可以管理工程目标名和项目分组,按照下图所示,需改工程目标名并创建几个项目分组,如下图所示:
图7.1.4.1 工程项目管理窗口
上图中共创建了五个项目分组,但还未向分组中添加项目文件,接下来分别介绍各个项目分组中应该添加那些项目文件。
①:Startup项目分组
Startup用于存放启动文件,对于APM32F407ZG型号的MCU,其启动文件的路径为DriversDeviceGeehyAPM32F4xxSourcearmstartup_apm32f40x.s,添加项目文件后的Startup项目分组,如下图所示:
图7.1.4.2 Startup项目分组
②:User项目分组
User主要用于存放用户的应用代码及其相关的文件,如下图所示:
图7.1.4.3 User项目分组
main.c文件的路径为Usermain.c;
apm32f4xx_int.c文件的路径为Userapm32f4xx_int.c;
system_apm32f4xx.c文件的路径为DriversDeviceGeehyAPM32F4xxSourcesystem_apm32f4xx.c。
③:Drivers/SYSTEM项目分组
Drivers/SYSTEM用于存放SYSTEM文件夹中的C源文件,如下图所示:
图7.1.4.4 Drivers/SYSTEM项目分组
sys.c、delay.c和usart.c文件的路径均在Drivers/SYSTEM文件夹中。
④:Drivers/APM32F4xx_StdPeriphDriver项目分组
Drivers/APM32F4xx_StdPeriphDriver用于存放Geehy标准库中的C源文件,如下图所示:
图7.1.4.5 Drivers/APM32F4xx_StdPeriphDriver项目分组
这部分的文件可以按需添加,以减少工程的编译时间,但对Geehy标准库还不太了解的读者,全部添加即可。Geehy标准库C源文件的路径为Drivers/APM32F4xx_StdPeriphDriver/src。
⑤:Readme项目分组
Readme用于存放工程根目录下的readme.txt文本文件,如下图所示:
图7.1.4.6 Readme项目分组
至此,项目文件基本添加完毕,后续读者应根据实际需求再往工程中添加所需的项目文件。
接下来点击工具栏上的按钮,打开Options for Target窗口,首先可以看到Target选项卡中的ARM Compiler默认选择了“Use default compiler version 6”即AC6,由于APM32F4xx_SDK并不支持AC6,因此要将该选项修改为“Use default compiler version 5”即AC5,如下图所示:
图7.1.4.7 Target选项卡
接着是Output选项卡,点击“Select Folder for Objects…”按钮指定编译输出的文件保存路径为工程根目录下的Output文件夹中,再勾选“Create HEX File”使工程成功编译后生成Hex文件,方便后续通过串口烧录程序,如下图所示:
图7.1.4.8 Output选项卡
接着是Listing选项卡,点击“Select Folder for Listing…”按钮指定map等文件的输出目录为根文件夹下的Output文件夹,如下图所示:
图7.1.4.9 Listing选项卡
接着是User选项卡,默认情况下,MDK软件会在工程成功编译后自动进入调试模式,若想禁用该功能,则取消勾选Start Debugging复选框即可,如下图所示:
图7.1.4.10 User选项卡
接着是C/C++选项卡,为了正常使用Geehy标准库在Define编辑框中添加“APM32F40X”的全局共定义,再接着就是通过在Include Paths中添加头文件路径,如下图所示:
图7.1.4.11 C/C++选项卡
图7.1.4.12 添加头文件路径
再接着就是与调试相关的配置,若读者需使用仿真器进行调试,请参考第4.3小节使用DAP烧录及调试程序。
至此,一个最基础的基于Geehy标准库的MDK工程就创建好了,读者可以打开main.c文件查看本工程实现的功能,如下图所示:
图7.1.4.13 main.c文件
可以看到,在main()函数中先进行了一些基本的初始化工作(主要是初始化系统时钟、延时功能和串口),接着在一个while循环中重复通过串口输出“Hello, APM32F407\r\n”字符串。
接下来点击工具栏中的按钮尝试编译工程,若编译无误,则说明工程创建成功了,若有错误,建议读者仔细根据本小节的内容再好好检查一下创建的工程。
7.2 下载验证
在前面的章节中,介绍了通过串口(4.2 使用串口烧录程序)和仿真器(4.3.1 使用DAP烧录程序)的方式烧录程序,两种方式烧录程序的结果都是一样的,但仿真器使用起来更加方便,且还具有调试功能,因此从本小节开始,都将使用仿真器进行程序烧录。
点击MDK软件上方工具栏上的按钮进行程序烧录,程序烧录成功后,按照3.4小节的描述将开发板的USB_UART接口通过USB数据线与PC进行连接,随后打开PC端的串口调试助手(推荐使用ATK-XCOM,该软件可在A盘6,软件资料1,软件串口调试助手软件(ATK-XOMC)下找到),选择对应的COM口并按下图配置好串口参数后点击“打开串口”按钮,随后便能看到串口调试助手不断输出“Hello, APM32F407”字符串,如下图所示:
图7.2.1 串口输出结果
相关文章:

【正点原子STM32连载】 第七章 Geehy标准库版本MDK工程创建 摘自【正点原子】APM32F407最小系统板使用指南
1)实验平台:正点原子stm32f103战舰开发板V4 2)平台购买地址:https://detail.tmall.com/item.htm?id609294757420 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html# 第七…...
SQL中count()的不同用法
1.count(*):统计所有列的行数,包括均为null值的行; 2.count(1):统计所有列的行数,包括均为null值的行; 3.count(列名):统计指定列的行数,不包括null值; 实例:…...
go_细节注意
go细节 一、使用指针接受者和不使用指针接受者1,不使用指针接受者:2,使用指针接受者3,区别与优劣势 一、使用指针接受者和不使用指针接受者 1,不使用指针接受者: func (d dog) move() {fmt.Println("…...
屏蔽恶意域名的DNS查询
因为有一些恶意域名, 已经在防火墙上做了封禁了, 但是如果收到中毒主机的请求, 还是要去做一次DNS查询, 因此被上级单位通告, 因此想把恶意域名的DNS查询封禁做到防火墙下联的AC上面, 一方面因为防火墙的策略优先级DNS代理比较靠后, 另一方面也是为了减小防火墙压力, 简化配置:…...

SQL-每日一题【1251. 平均售价】
题目 Table: Prices Table: UnitsSold 编写SQL查询以查找每种产品的平均售价。average_price 应该四舍五入到小数点后两位。 查询结果格式如下例所示: 解题思路 1.题目要求查询每种产品的平均售价。给出了两个表,我们用聚合查询来解决此问题。 2.首先我…...

Win11中使用pip或者Cython报错 —— error: Microsoft Visual C++ 14.0 is required.
第一步:下载Visual Studio 2019 下载地址: https://learn.microsoft.com/zh-cn/visualstudio/releases/2019/release-notes 第二步:安装组件 选择单个组件,勾选以下两个组件 其他错误: 无法打开文件“python37.li…...
Spring学习笔记之Bean的“出生入死”
文章目录 什么是Bean的生命周期为什么要知道Bean的生命周期Bean的生命周期之五个阶段Bean生命周期之七个阶段Bean生命周期的十个阶段Bean的作用域不同,管理方式不同自己new的对象如何让Spring管理 什么是Bean的生命周期 Spring其实就是一个管理Bean对象的工厂。它负…...

hbase 报错 Master passed us a different hostname to use; was=
原因 wsl2的 /etc/hosts 配置的不兼容,我这里是ubuntu22 命令行输入hostname 看输出什么,比如输出 aaa 那么替换/etc/hosts 127.0.0.1 aaa...

Aspera替代方案:探索这些安全且可靠的文件传输工具
科技的发展日新月异,文件的传输方式也在不断地更新换代。传统的邮件附件、FTP等方式已经难以满足人们对于传输速度和安全性的需求了。近年来,一些新兴的文件传输工具受到了人们的关注,其中除了知名的Aspera之外,还有许多可靠安全的…...

你真的了解数据结构与算法吗?
数据结构与算法,是理论和实践必须紧密结合的一门学科,有关数据结构和算法同类的课程或书籍,有些只是名为“数据结构”,而非“数据结构与算法”,它们在内容上并无很大区别。 实际上,数据结构和算法…...
kafka使用心得(一)
kafka入门 一种分布式的、基于发布/订阅的消息系统,scala编写,具备快速、可扩展、可持久化的特点。 基本概念 topic 主题 partition 分区,一个topic下可以有多个partition,消息是分散到多个partition里存储的,part…...
Django图书商城系统实战开发-实现商品管理
Django图书商城系统实战开发 - 实现商品管理 在本教程中,我们将使用Django框架来实现一个简单的图书商城系统,并重点讨论如何实现商品管理功能。此外,我们还将介绍如何使用Markdown格式来写博客,并将其集成到我们的图书商城系统中…...

走出象牙塔:李郓梁的区块链实践之路丨对话MVP
如何从科研走向实践?李郓梁在社区找到了答案。 作为西安工业大学的硕士研究生,李郓梁从学校的实验室接触区块链技术。通过研读大量论文,李郓梁为区块链多中心化、不可篡改等前沿理论深深着迷,并选择将区块链作为主要研究方向&…...

【hive】hive分桶表的学习
hive分桶表的学习 前言: 每一个表或者分区,hive都可以进一步组织成桶,桶是更细粒度的数据划分,他本质不会改变表或分区的目录组织方式,他会改变数据在文件中的分布方式。 分桶规则: 对分桶字段值进行哈…...

ReactDOM模块react-dom/client没有默认导出报错解决办法
import ReactDOM 模块“"E:/Dpandata/Shbank/rt-pro/node_modules/.pnpm/registry.npmmirror.comtypesreact-dom18.2.7/node_modules/types/react-dom/client"”没有默认导出。 解决办法 只需要在tsconfig.json里面添加配置 "esModuleInterop": true 即…...
TiDB数据库的安装配置
一、 TiDB 软件和硬件环境建议配置 Linux 操作系统版本要求 Linux 操作系统 版本 Red Hat Enterprise Linux 7.3 及以上的 7.x 版本 CentOS 7.3 及以上的 7.x 版本 Oracle Enterprise Linux 7.3 及以上的 7.x 版本 Amazon Linux 2 Ubuntu LTS 16.04 及以上的版本 …...

Unity智慧园区夜景制作
近期使用Unity做了一个智慧园区场景的demo,初步了解了3D开发的一些步骤和知识,以下为制作的步骤,比较简略,备忘: 1. 制作前的设计分析: 1. 分析日光角度,阴影长度,效果 2. 分析冷暖…...

Linux MQTT智能家居项目(LED界面的布局设置)
文章目录 前言一、LED界面布局准备工作二、LED界面布局三、逻辑实现总结 前言 上篇文章我们完成了主界面的布局设置那么这篇文章我们就来完成各个界面的布局设置吧。 一、LED界面布局准备工作 首先添加LED灯光控制的图标。 将选择好的LED图标添加进来: 图标可以…...

LeetCode 160.相交链表
文章目录 💡题目分析💡解题思路🚩步骤一:找尾节点🚩步骤二:判断尾节点是否相等🚩步骤三:找交点🍄思路1🍄思路2 🔔接口源码 题目链接👉…...
【深度学习_TensorFlow】调用keras高层API重写手写数字识别项目
写在前面 上一阶段我们完成了手写数字识别项目的构建,了解了网络构建、训练、测试的基本流程,但是对于一些常见的操作,因其使用过于频繁,实际上并无必要手动实现,而早已被封装为函数了。 这篇文章我们将了解keras高层…...
柔性数组(C语言)
也许你从来没有听说过柔性数组( flexible array )这个概念,但是它确实是存在的。 C99 中,结构中的最后一个元素允许是未知大小的数组,这就叫做柔性数组成员,但结 构中的柔性数组成员前面必须至少一个其他…...

判断推理 -- 图形推理 -- 属性规律
中心对称:取一个点,穿过中心能找到另一个对称点。把轴对称 中心对称标出来。五角星不是中心对称。 BD对称轴方向相同,但135自带对称轴,24没带,所以6应该不带对称轴。 百分号不是轴对称。 白色对称轴 平行 或者 夹角…...

【注解使用】使用@Autowired后提示:Field injection is not recommended(Spring团队不推荐使用Field注入)
问题发生场景: 在使用 IDEA 开发 SpringBoot 项目时,在 Controller 类中使用注解 Autowired 注入一个依赖出现了警告提示,查看其他使用该注解的地方同样出现了警告提示。这是怎么回事?由于先去使用了SpringBoot并没有对Spring进行…...
Rust语法: 枚举,泛型,trait
这是我学习Rust的笔记,本文适合于有一定高级语言基础的开发者看不适合刚入门编程的人,对于一些概念像枚举,泛型等,不会再做解释,只写在Rust中怎么用。 文章目录 枚举枚举的定义与赋值枚举绑定方法和函数match匹配枚举…...
hivesql-dayofweek 函数
返回日期或时间戳的星期几。 此函数是 extract(DAYOFWEEK FROM expr) 的同义函数。 语法 dayofweek(expr) 参数 expr:一个 DATE 或 TIMESTAMP 表达式。 返回 一个 INTEGER,其中 1 Sunday 和 7 Saturday。 示例 > SELECT dayofweek(2009-07-30)…...

DIP:《Deep Image Prior》经典文献阅读总结与实现
文章目录 Deep Image Prior1. 方法原理1.1 研究动机1.2 方法 2. 实验验证2.1 去噪2.2 超分辨率2.3 图像修复2.4 消融实验 3. 总结 Deep Image Prior 1. 方法原理 1.1 研究动机 动机 深度神经网络在图像复原和生成领域有非常好的表现一般归功于神经网络学习到了图像的先验信息…...

LAXCUS如何通过技术创新管理数千台服务器
随着互联网技术的不断发展,服务器已经成为企业和个人获取信息、进行计算和存储的重要工具。然而,随着服务器数量的不断增加,传统的服务器管理和运维方式已经无法满足现代企业的需求。LAXCUS做为专注服务器集群的【数存算管】一体化平台&#…...

【Java】BF算法(串模式匹配算法)
☀️ 什么是BF算法 BF算法,即暴力算法,是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个与模式串T的第一个字符串进行匹配,若相等,则继续比较S的第二个字符和T的第二个字符;若不相等,则…...
Vue:使用Promise.all()方法并行执行多个请求
在Vue中,可以使用Promise.all()方法来并行执行多个请求。当需要同时执行多个异步请求时,可以将这些请求封装为Promise对象并使用Promise.all()方法来执行它们。 示例1: 以下是一个示例代码,展示了如何通过Promise.all()方法并行…...

21.0 CSS 介绍
1. CSS层叠样式表 1.1 CSS简介 CSS(层叠样式表): 是一种用于描述网页上元素外观和布局的样式标记语言. 它可以与HTML结合使用, 通过为HTML元素添加样式来改变其外观. CSS使用选择器来选择需要应用样式的元素, 并使用属性-值对来定义这些样式.1.2 CSS版本 CSS有多个版本, 每个…...