Keil5 MDK新建项目工程

news2025/1/21 18:46:19

本文重点介绍基于Keil5 MDK实现新建一个完整的工程,第一次新建比较繁琐,建好后续工程可以直接复用

一、新建工程框架

1.新建一个文件夹,命名为Template
在这里插入图片描述
2.点击 MDK 的菜单: Project –>New Uvision Project ,然后将目录定位到刚才建立的文件夹
Template 之下,在这个目录下面建立子文件夹 USER( 我们的代码工程文件都是放在 USER
目录)工程命名为 Template,点击保存。
在这里插入图片描述

3.选择芯片型号(一定要安装对应的器件 pack 才会显示这些内容哦!)
在这里插入图片描述
点击 OK,如若出现其他界面,点击取消即可;MDK 会弹出 Manage Run-Time Environment 对话框,这里我们不做介绍,点击Cancel即可
在这里插入图片描述
得到如下界面,这里我们只做了一个框架,还需要添加启动代码,以及.c 文件等
在这里插入图片描述
此时USER文件夹会是如下图情况(Template.uvprojx 是工程文件,非常关键,不能轻易删除。Listings 和 Objects 文件夹是 MDK 自动生成的文件夹,用于存放编译过程产生的中间文件)我们选择把Listings和Objects这两个文件夹删除,在下一步重新建立文件夹。
在这里插入图片描述

二、在 Template 工程目录下面,新建 3 个文件夹 CORE, OBJ 以及 STM32F10x_FWLib

用来存放核心文件和启动文件,OBJ 是用来存放编译过程文件以及 hex 文件,STM32F10x_FWLib 文件夹顾名思义用来存放 ST 官方提供的库函数源码文件。USER 目录用来放工程文件,以及存放主函数文件 main.c,以及其他包括 system_stm32f10x.c 等等。
在这里插入图片描述

三 、将官方的固件库包里的源码文件复制到我们的工程目录(CORE, OBJ ,STM32F10x_FWLib)文件夹下面

1 STM32F10x_FWLib文件夹

打开官方固件库包,定位到我们之前准备好的固件库包的目录
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver 下面,
将目录下面的 src,inc 文件夹 copy 到我们刚才建立的 STM32F10x_FWLib 文件夹下面。
src 存放的是固件库的 .c 文件, inc 存放的是对应的.h 文件,您不妨打开这两个文件目录过目一
下里面的文件,每个外设对应一个 .c 文件和一个 .h 头文件
在这里插入图片描述

  1. CORE文件夹(启动文件)

(1) 官方固件库包,定位到目录
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport 下面,将文件 core_cm3.c 和文件 core_cm3.h 复制到 CORE 下 面 去 。
(2) 然 后 定 位 到 目 录
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm 下面,将里面 startup_stm32f10x_hd.s 文件复制到 CORE 下面。
现在看看我们的 CORE 文件夹下面的文件:
在这里插入图片描述

3.USER文件夹

(1)
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x 下面
将里面的三个文件 stm32f10x.h,system_stm32f10x.c,system_stm32f10x.h ,复制到我们的 USER 目录之下。

(2)
STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template 下面的 4 个文 件
main.c,stm32f10x_conf.h,stm32f10x_it.c,stm32f10x_it.h 复制到 USER 目录下面。
总共9个,除了自带的两个外,4个.h,3个.c
在这里插入图片描述

四、将这些文件(CORE USER FWILD)加入我们的工程中去

右键点击 Target1,选择 Manage Project Items——> Project Targets 一栏,我们将
(1)Target 名字修改为 Template
(2)删一加三
在 Groups 一栏删掉一个 Source Group1
建立三个 Groups : USER,CORE,FWLIB
然后点击 OK ,可以看到我们的 Target 名字以及 Groups 情况。
在这里插入图片描述
在这里插入图片描述

五 向Group里面添加我们所需要的文件

1.FWLID
右键点击Tempate ,选择选择 Manage Project Itmes ,然后选择需要添加文件的 Group ,这里第一步我
们选择 FWLIB , 然 后 点 击 右 边 的 Add Files, 定 位 到 我 们 刚 才 建 立 的目录STM32F10x_FWLib/src 下面,将里面所有的文件选中( Ctrl+A),然后点击 Add,然后 Close.
可以看到 Files 列表下面包含我们添加的文件。
在这里插入图片描述
2 .CORE
用同样的方法,将 Groups 定位到 CORE 和 USER 下面,添加需要的文件。这里
我们的 CORE 下面需要添加的文件为 core_cm3.c,startup_stm32f10x_hd.s ( 注意,默认添加的
时候文件类型为 .c, 也就是添加 startup_stm32f10x_hd.s 启动文件的时候,你需要选择文件类型
为 All files 才能看得到这个文件 )

在这里插入图片描述
3 .USER
USER 目录下面需要添加的文件为 main.c,stm32f10x_it.c, system_stm32f10x.c.

在这里插入图片描述
这样我们需要添加的文件已经添加到我们的工程中了,最后点击 OK,回到工程主界面。
在这里插入图片描述

六 生成编译文件

点击魔术棒,然后选择“ Output ”选项下面的“ Select folder for objects… ” , 然后选
择目录为我们上面新建的 OBJ 目录。这里大家注意,如果我们不设置 Output 路径,那么
默认的编译中间文件存放目录就是 MDK 自动生成的 Objects 目录和 Listings 目录。
在这里插入图片描述
在这里插入图片描述

七 添加头文件

这里大 家要注意,对于任何一个工程,我们都需要把工程中引用到的所有头文件的路径都包含到
进来。 回到工程主菜单,点击魔术棒 ,出来一个菜单,然后点击 c/c++ 选项 . 然后点击
Include Paths 右边的按钮。弹出一个添加 path 的对话框,然后我们将图上面的 3 个目录添
加进去。记住, keil 只会在一级目录查找,所以如果你的目录下面还有子目录,记得 path
一定要定位到最后一级子目录。然后点击 OK.
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
此外这块要注意依据芯片内存的大小选择对应的“M”或者“H”,这个很关键或者会编译出错,另外注意右下角的“C99”也要勾选上,涉及到C语言编译算法
在这里插入图片描述

八 配置全局宏定义变量

定位到 c/c++ 界面,然后填写 “STM32F10X_HD,USE_STDPERIPH_DRIVER”到 Define 输入框里面 ( 请注意,两个标识符 中间是逗号不是句号,如果您不能确定您输入的是正确的,请直接打开我们光盘任何一个 库函数实例,然后复制过来这串文字即可 ) 。
在这里插入图片描述

九、打开工程 USER 下面的 main.c 文件,在编译之前复制下面覆盖main.c里的程序,记得在最后一行回车(enter),不然编译时有警告。

#include "stm32f10x.h"
void Delay(u32 count)
{
u32 i=0;
 for(;i<count;i++);
}
int main(void)
{
 GPIO_InitTypeDef GPIO_InitStructure;
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|
RCC_APB2Periph_GPIOE, ENABLE); //?? PB,PE ????
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5 ????
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //????
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO ???? 50MHz
 GPIO_Init(GPIOB, &GPIO_InitStructure); //??? GPIOB.5
 GPIO_SetBits(GPIOB,GPIO_Pin_5); //PB.5 ???
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED1-->PE.5 ????
 GPIO_Init(GPIOE, &GPIO_InitStructure); //??? GPIO
 GPIO_SetBits(GPIOE,GPIO_Pin_5); //PE.5 ??? 
 while(1)
{
 GPIO_ResetBits(GPIOB,GPIO_Pin_5);
 GPIO_SetBits(GPIOE,GPIO_Pin_5);
	Delay(3000000);
GPIO_SetBits(GPIOB,GPIO_Pin_5);
GPIO_ResetBits(GPIOE,GPIO_Pin_5);
Delay(3000000); 
} } 

重新编译代码,我们可在OBJ文件夹里看到.hex文件。
在这里插入图片描述
实际上经过前面 的 步骤,我们的工程模板已经建立完成。但是在我们 ALIENTEK 提供
的实验中,每个实验都有一个 SYSTEM 文件夹,下面有 3 个子目录分别为 sys,usart,delay ,
存放的是我们每个实验都要使用到的共用代码,该代码是由我们 ALIENTEK 编写,该代码
的原理在我们第五章会有详细的讲解,我们这里只是引入到工程中,方便后面的实验建立
工程。
首先,找到我们实验光盘, 打开任何一个固件库的实验 ,可以看到下面有一个 SYSTEM 文
件夹,比如我们打开实验 1 的工程目录如下:
在这里插入图片描述
可以看到有一个 SYSTEM 文件夹,进入 SYSTEM 文件夹,里面有三个子文件夹分别为
delay,sys,usart ,每个子文件夹下面都有相应的 .c 文件和 .h 文件。我们接下来要将这三个目录下
面的代码加入到我们工程中去。
用我们之前讲解步骤 13 的办法,在工程中新建一个组,命名为 SYSTEM ,然后加入这三
个文件夹下面的 .c 文件分别为 sys.c ,delay.c,usart.c,如下图:
在这里插入图片描述
接下来我们将对应的三个目录( sys,usart,delay )加入到 PATH 中去,因为每个目录下面都有相
应的 .h 头文件,这请参考步骤 七 即可,加入后的截图是:
在这里插入图片描述
最后点击 OK 。这样我们的工程模板就彻底完成了,这样我们就可以调用 ALIENTEK 提供的
SYSTEM 文件夹里面的函数。

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

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

相关文章

( “树” 之 前中后序遍历) 145. 二叉树的后序遍历 ——【Leetcode每日一题】

基础概念&#xff1a;前中后序遍历 1/ \2 3/ \ \ 4 5 6层次遍历顺序&#xff1a;[1 2 3 4 5 6]前序遍历顺序&#xff1a;[1 2 4 5 3 6]中序遍历顺序&#xff1a;[4 2 5 1 3 6]后序遍历顺序&#xff1a;[4 5 2 6 3 1] 层次遍历使用 BFS 实现&#xff0c;利用的就是 BFS…

Git从远程仓库克隆仓库后推送到指定分支

git克隆到本地仓库 在得到一个git仓库地址后&#xff0c;首先要配置本地仓库&#xff0c;配置远程仓库地址才可以远程拉取项目。 本地配置的一般流程&#xff1a; git init初始化一个空白git仓库 2. 配置在自己额用户名和邮箱 配置个人信息时方便再团队合作时能知道是谁再何…

2023 CCBN广电展顺利召开,ATEN宏正携广电专属系列解决方案亮相

4月19日-4月21日&#xff0c;第二十九届中国国际广播电视信息网络展览会(CCBN2023)于北京市石景山区首钢会展中心盛大开幕。本届CCBN广电展以“大视听向未来”为主题&#xff0c;内容涵盖广播电视、网络视听、电影、信息化视听、视听消费电子、通信、IT等多个领域创新科技和行业…

MySQL高级第十三篇:MySQL事物日志(redo日志-undo日志执行流程)

MySQL高级第十三篇&#xff1a;MySQL事物日志&#xff08;redo日志-undo日志执行流程&#xff09; 一、概述二、redo 日志1. 为什么需要 redo日志&#xff1f;2. redo 日志的特点3. redo log 整体流程4. redo log 的刷盘策略&#xff1f; 三、undo 日志1. 什么是 undo 日志&…

1026. 节点与其祖先之间的最大差值(4-19日

题目&#xff1a;给定二叉树的根节点 root&#xff0c;找出存在于 不同 节点 A 和 B 之间的最大值 V&#xff0c;其中 V |A.val - B.val|&#xff0c;且 A 是 B 的祖先。 &#xff08;如果 A 的任何子节点之一为 B&#xff0c;或者 A 的任何子节点是 B 的祖先&#xff0c;那么…

context 浅析

在缺少直接调用关系的两个函数之间传递数据&#xff0c;一般都会考虑使用 context&#xff0c;而 context 也被用来存储整个请求链路的公参信息&#xff0c;用户 uid、链路 traceID、特定的业务参数等。函数第一个参数类型设置为 context.Context 也是 Go 的默认写法&#xff0…

2 常见模块库(3)

2.9 积分模块&#xff08;2&#xff09; External reset: 在什么条件下进行外部重置操作描述一下每个选项&#xff1a; Rising&#xff1a;当重置信号从非正的值&#xff08;0或负值&#xff09;变为正值时&#xff0c;重置积分器的状态。 Falling&#xff1a;当重置信号从正…

Java每日一练(20230419)

目录 1. 二叉树的最大深度 &#x1f31f; 2. 二叉树的层序遍历 &#x1f31f;&#x1f31f; 3. 最短回文串 &#x1f31f;&#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Jav…

双向带头循环链表的实现

双向带头循环链表 双向带头循环链表结构讲解期望实现功能创建链表和头节点作用头插和头删头插头删 尾插与尾删尾插尾删 pos 删除和插入插入删除 打印和查找 整体代码 这个数据结构可以算是YYDS的存在了。 我们前面讲过的单链表&#xff0c;尾删和尾插需要遍历数组&#xff0c;极…

是时候该换掉你的axios了

axios是一个基于Promise的HTTP客户端&#xff0c;每周的npm下载量4000W&#xff0c;如果回到在10年前&#xff0c;promise式的请求工具是一个很大的创新&#xff0c;它解决了请求繁琐的问题&#xff0c;在那个性能要求不那么高的年代可谓是一骑绝尘。但随着时间的推移&#xff…

【网络】UDP协议 TCP协议

&#x1f941;作者&#xff1a; 华丞臧. &#x1f4d5;​​​​专栏&#xff1a;【网络】 各位读者老爷如果觉得博主写的不错&#xff0c;请诸位多多支持(点赞收藏关注)。如果有错误的地方&#xff0c;欢迎在评论区指出。 推荐一款刷题网站 &#x1f449; LeetCode刷题网站 文章…

Centos7安装Elasticsearch6.4.3和Kibana6.4.3

一、下载好安装文件上传到/usr/local 二、安装Java环境 1&#xff09;、解压jdk tar -zxvf jdk-8u181-linux-x64.tar.gz2&#xff09;、 配置Java环境变量 vim /etc/profile 3&#xff09;、profile末尾添加 export JAVA_HOME/usr/local/jdk1.8.0_181 export PATH$JAVA_HO…

【2023 · CANN训练营第一季】昇腾AI入门课(Pytorch)---昇腾AI入门课(PyTorch)微认证考试

1、下列不属于昇腾计算服务层的是() 2、AscendCL的优势包括() 3、使用AscendCL开发应用的基本流程&#xff0c;以下正确的是&#xff1f; 4、关于AscendCL初始化&#xff0c;以下说法不正确的是&#xff1f; 5、以下关于ATC工具说法正确的是 6、模型转换工具的名称是&#xf…

深入实战探究 Vue 2.7 Composition API 的强大之处

最近几年公司开发一直使用的是 Vue2.6&#xff0c;对于逻辑复用使用的是 Mixin 方式&#xff0c;但随着项目体量的增加&#xff0c;带了一些问题&#xff0c;特别是&#xff1a;数据混乱问题&#xff1a;实例上的数据属性从当前模板文件中无法查取到&#xff0c;存在多个 Mixin…

API 鉴权都有哪些分类,这些重点不要错过

API鉴权是保证API安全性和可用性的一项重要措施。通过API鉴权&#xff0c;系统可以对用户或者应用进行有效的身份认证和权限管理。一般来说&#xff0c;在实际开发中&#xff0c;我们使用以下几种API鉴权方式&#xff1a; 1. 基本认证 基本认证是API鉴权的一种最基本形式。此方…

如何创建Spring项目

创建Spring项目 创建一个Maven项目 这里使用的是2023版本的idea。 添加Spring框架支持 在项目的pom.xml中添加Spring支持。这里可以到中央仓库找一下。 <dependencies><!-- https://mvnrepository.com/artifact/org.springframework/spring-context --><dep…

Android Binder 图文解释和驱动源码分析

前言 最近在学习Binder&#xff0c;之前都是跳过相关细节&#xff0c;通过阅读文章对Binder有了一些认识&#xff0c;但是并没有真正理解Binder。如果要深入理解Framework的代码&#xff0c;就必须要真正理解Binder。 我学习Binder的方法&#xff1a; 一边阅读Gityuan的Bind…

视觉语言模型究竟能帮助我们完成哪些工作?

当前&#xff0c;多模式人工智能已经成为一个街谈巷议的热门话题。随着GPT-4的最近发布&#xff0c;我们看到了无数可能出现的新应用和未来技术&#xff0c;而这在六个月前是不可想象的。事实上&#xff0c;视觉语言模型对许多不同的任务都普遍有用。例如&#xff0c;您可以使用…

vmware VM虚拟机去虚拟化教程 硬件虚拟机 过鲁大师检测

一 准备工作 1. 这里演示的VM虚拟机版本是12.5.9 虚拟机系统是win7 64位 2. 用到的工具 winhex和Phoenix BIOS Editor 下载地址工具 链接&#xff1a;https://pan.baidu.com/s/1b3FfA3FyQ_lnFQSjpCGLGg?pwd1221 提取码&#xff1a;1221 3. 注意&#…

【2023 · CANN训练营第一季】昇腾AI入门课(Pytorch)---昇腾AI入门课(上)

AscendCL快速入门 AscendCL概述 AscendCL功能介绍 AscendCL基础概念解析 应用开发流程 样例代码精讲