STM32开发笔记-新建标准库工程

1.STM32开发方式

STM32开发一般包括三种方式:基于寄存器开发、基于标准外设库开发、基于HAL库开发。

标准外设库是最基础的STM32开发方式,提供了一系列函数用于配置和控制STM32的外设,如GPIO、USART、SPI等。使用标准外设库需要手动编写代码,对于有一定嵌入式开发经验的开发者来说比较熟悉。其优点是灵活性高,可以根据具体需求进行定制开发,但缺点是编写代码量大,开发周期较长。

HAL库是STM32提供的一套高级抽象层,封装了底层的硬件操作,提供了一系列易于使用的函数接口。使用HAL库可以大大简化开发流程,减少代码量。开发者只需要调用相应的函数,即可完成对外设的配置和控制。其优点是开发效率高,适合快速开发和原型验证,但缺点是灵活性相对较低,对于一些特殊需求可能需要自行编写底层代码。寄存器开发是通过直接操作寄存器进行开发,但是由于STM32的寄存器数量众多,逐个查询比较繁琐。其优点是对底层了解深入,可以实现一些HAL库无法实现的功能,但缺点是需要手动编写大量代码,且容易出错。

后续应该大力推广的是基于HAL库的形式,但是由于我自己用的是基于标准外设库开发方式,就只在此记录基于标准外设库的工程新建过程。

2. 新建工程文件夹

2.1 下载标准外设库

标准外设库可以到STM32社区下载STM32官方标准库网址: https://www.stmcu.org.cn/下载。这里我所用的芯片为STM32F103C8T6,下载的库为STM32F10x_StdPeriph_Lib_V3.5.0,解压后目录如下;
在这里插入图片描述

其中:Libraries为库函数文件;Project为官网的例程;Utilities文件夹是ST官方评估板源文件(不能了解); Release_Notes.html是固件库的发布日志;stm32f10x_stdperiph_lib_um.chm文件是固件库的帮助文档,可以直接双击打开。

2.2 创建文件夹放置项目工程

创建一个新的文件夹,我这里是命令为controller_project,然后在该文件夹里面创建四个子文件夹来存放不同的文件,包括user、project、FWLIB和CMSIS。其中,user文件夹用来存放主函数和一些用户自定义函数;project文件夹用来存放项目工程文件以及起始代码文件;FWLIB文件夹用来存放库函数;CMSIS文件夹用来存放内核函数及启动引导文件。
在这里插入图片描述

2.3 拷贝工程所需的库文件

首先从固件库路径
STM32F10x_StdPeriph_Lib_V3.5.0\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template
中找到stm32f10x_it.c、stm32f10x_it.h和stm32f10x_conf.h 文件
在这里插入图片描述

复制到controller_project/user文件夹中。
在这里插入图片描述

其次,将STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport中的文件复制到controller_project/CMSIS中。
在这里插入图片描述

找到
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x文件夹下的相应文件,将它复制粘贴到复制到controller_project/CMSIS文件夹中。
在这里插入图片描述

最终效果如图所示。
在这里插入图片描述

最后,在标准库路径
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver中找到如下文件夹内容。
在这里插入图片描述

复制到工程路径controller_project\FWLIB下
在这里插入图片描述

至此文件拷贝工作完成,需要说明的是,文件目录存放在只是为了规范工程,并非一定一板一眼按照流程照做,可以灵活处理。

3 创建项目工程

3.1 新建工程

打开Keil5,点击Project选择New Version Project创建工程项目.
在这里插入图片描述

然后将其放置到创建的文件夹中controller_project/project并重新命令,点击保存。则弹出如下界面。
在这里插入图片描述

在弹出的界面中选择相应的芯片,这里我选择的是STM32F103C8。选择后点击OK。
在这里插入图片描述

弹出了如下菜单,因为我们已经做了库代码的拷贝,不需要在利用KEIL自带的库函数了。因此直接点击OK即可。
在这里插入图片描述

至此,工程就创建完毕。

3.2 项目工程的配置

如图所示,点击“品字”图标,在新建工程选项中添加文件路径。
在这里插入图片描述

在此页面,可以修改Project Targets名并添加多个Groups,修改结果如下。
在这里插入图片描述

接下来我们添加文件进入工程项目中,先单击选中FWLIB,选择add files…进入新建的工程文件夹controller_project/FWLIB\src中,选中所有文件,点击Add完成文件添加。
在这里插入图片描述

再单击选中CMSIS,选择add files…进入新建的工程文件夹controller_project/CMSIS中,选中所有的.c文件,点击Add完成文件添加。
在这里插入图片描述

再单击选中startup,选择add files…进入新建的工程文件夹controller_project/CMSIS/startup/arm文件夹中找到如图所示的startup_stm32f10x_md.s文件,点击Add完成文件添加。
在这里插入图片描述

最后,再单击选中user,选择add files…进入新建的工程文件夹controller_project/user文件夹中找到如图所示的stm32f10x_it.c文件,点击Add完成文件添加。
在这里插入图片描述

3.3 新建main.c并创建main函数

在页面左侧project栏中,选中user按右键,弹出菜单中,选择Add New Item to Group ‘user’。
在这里插入图片描述

弹出如下菜单。在菜单中作如下修改,点击Add完成main.c文件的添加。

在这里插入图片描述

打开main.c,在main.c里,编写如下代码,创建一个空main函数。
在这里插入图片描述

3.4 配置编译环境

点击魔术棒图标,弹出编译配置菜单。选中output选项卡,一般选择把Create Hex File选项勾选上,这样编译才能生成hex文件方便用烧录软件下载到STM32上。如图所示。
在这里插入图片描述

再次选中选中c/c++选项卡。如图所示添加两个宏:STM32F10X_MD, USE_STDPERIPH_DRIVER
在这里插入图片描述

添加USE_STDPERIPH_DRIVER是为了使用ST官方库,
添加STM32F10X_MD宏定义是因为我们用的芯片是中容量的,
小容量的芯片使用:STM32F10X_LD
中容量的芯片使用:STM32F10X_MD
大容量的芯片使用:STM32F10X_HD
这个宏和startup中的启动文件需要匹配上,和芯片型号最好也匹配上,否则可能出现编译不过的情况。
在这里插入图片描述

对应关系总结如下。芯片型号对应的具体内存大小,可以根据芯片手册对应查找。
|宏 |启动文件 |内存大小|

启动文件内存大小
STM32F10X_LDstartup_stm32f10x_ld.s16-32k
STM32F10X_MDstartup_stm32f10x_md.s64-128k
STM32F10X_HDstartup_stm32f10x_hd.s256-512k

在这里插入图片描述

最后一步配置:如图所示,添加文件索引路径:
在这里插入图片描述

点击OK完成配置。

3.5 编译

依次点击图示三个图标。无报错则说明工程配置成功。
在这里插入图片描述

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

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

相关文章

(39)4.29数据结构(栈,队列和数组)栈

#include<stdlib.h> #include<stdio.h> #define MaxSize 10 #define Elemtype int 1.栈的基本概念 2.栈的基本操作 typedef struct { Elemtype data[MaxSize]; int top; }Sqstack;//初始化栈 void InitStack(Sqstack& S) { S.top -1; //初始化…

Golang日志管理:使用log/slog实现高级功能和性能优化

Golang日志管理&#xff1a;使用log/slog实现高级功能和性能优化 简介基础使用初始化和配置日志级别 高级技巧自定义日志格式器条件日志处理 实战案例场景一&#xff1a;API请求日志记录场景二&#xff1a;错误跟踪和用户通知 性能优化优化日志记录的性能异步日志处理选择合适的…

Vue的项目启动指令分析

通过Vue CLI脚手架创建的项目&#xff0c;默认的启动项目方式是 npm run serve 这里的serve是可以修改的。 在创建的项目目录中&#xff0c;找到package.json 双击打开&#xff0c;找到scripts部分 在scripts部分&#xff0c;有一个"serve"键值对&#xff0c;这里的…

机器学习-K近邻算法(KNN)

目录 什么是KNN算法 图解KNN基本算法 &#xff08;1&#xff09;k近邻算法中k的选取 &#xff08;2&#xff09;距离函数 &#xff08;3&#xff09;归一化处理 &#xff08;4&#xff09;概率kNN KNN算法的优缺点 优势 缺点 KNN算法总结 什么是KNN算法 k近邻算法&…

[Spring Cloud] (6)gateway整体加解密

文章目录 简述整体效果后端增加配置nacos增加配置GlobalConfig 添加请求整体解密拦截器DecryptionFilter添加响应整体解密拦截器EncryptionFilter 前端请求拦截器添加整体加密逻辑请求头中添加sessionId 响应拦截器添加整体解密逻辑 简述 本文网关gateway&#xff0c;微服务&a…

[C语言]指针进阶详解

指针是C语言的精髓所以内容可能会比较多&#xff0c;需要我们认真学习 目录 1、字符指针 2、指针数组 3、数组指针 3.1数组指针的定义 3.2&数组名vs数组名 3.3数组指针的使用 4、数组传参和指针传参 4.1一维数组传参 4.2二维数组传参 4.3一级指针传参 4.4二级指…

学习如何使用PyQt5实现notebook功能

百度搜索“pyqt5中notebook控件”&#xff0c;AI自动生成相应例子的代码。在 PyQt5 中&#xff0c;QTabWidget 类被用作 Notebook 控件。以下是一个简单的示例&#xff0c;展示如何创建一个带有两个标签的 Notebook 控件&#xff0c;并在每个标签中放置一些文本。 import sys f…

45. UE5 RPG 增加角色受击反馈

在前面的文章中&#xff0c;我们实现了对敌人的属性的初始化&#xff0c;现在敌人也拥有的自己的属性值&#xff0c;技能击中敌人后&#xff0c;也能够实现血量的减少。 现在还需要的就是在技能击中敌人后&#xff0c;需要敌人进行一些击中反馈&#xff0c;比如敌人被技能击中后…

使用macof发起MAC地址泛洪攻击

使用macof发起MAC地址泛洪攻击 MAC地址泛洪攻击原理&#xff1a; MAC地址泛洪攻击是一种针对交换机的攻击方式&#xff0c;目的是监听同一局域网中用户的通信数据。交换机的工作核心&#xff1a;端口- MAC地址映射表。这张表记录了交换机每个端口和与之相连的主机MAC地址之间…

Spring Boot与JSP的浪漫邂逅:轻松构建动态Web应用的秘诀

本文介绍 Spring Boot 集成 JSP。 1、pom.xml 增加对 JSP 的支持 Spring Boot 的默认视图支持是 Thymeleaf 模板引擎&#xff0c;如果想要使用 JSP 页面&#xff0c;需要配置 servlet 依赖和 tomcat 的支持。 在 pom.xml 文件中增加如下代码&#xff1a; <!-- servlet依赖 -…

(六)SQL系列练习题(下)#CDA学习打卡

目录 三. 查询信息 16&#xff09;检索"1"课程分数小于60&#xff0c;按分数降序排列的学生信息​ 17&#xff09;*按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩 18&#xff09;*查询各科成绩最高分、最低分和平均分 19&#xff09;*按各科成绩…

Apache和Nginx的区别以及如何选择

近来遇到一些客户需要lnmp环境的虚拟主机&#xff0c;但是Hostease这边的虚拟主机都是基于Apache的&#xff0c;尽管二者是不同的服务器软件&#xff0c;但是大多数情况下&#xff0c;通过适当的配置和调整两者程序也是可以兼容的。 目前市面上有许多Web服务器软件&#xff0c;…

rust使用Atomic创建全局变量和使用

Mutex用起来简单&#xff0c;但是无法并发读&#xff0c;RwLock可以并发读&#xff0c;但是使用场景较为受限且性能不够&#xff0c;那么有没有一种全能性选手呢&#xff1f; 欢迎我们的Atomic闪亮登场。 从 Rust1.34 版本后&#xff0c;就正式支持原子类型。原子指的是一系列…

HCIP第二节

OSPF&#xff1a;开放式最短路径协议&#xff08;属于IGP-内部网关路由协议&#xff09; 优点&#xff1a;相比与静态可以实时收敛 更新方式&#xff1a;触发更新&#xff1a;224.0.0.5/6 周期更新&#xff1a;30min 在华为设备欸中&#xff0c;默认ospf优先级是10&#…

对于子数组问题的动态规划

前言 先讲讲我对于这个问题的理解吧 当谈到解决子数组问题时&#xff0c;动态规划(DP)是一个强大的工具&#xff0c;它在处理各种算法挑战时发挥着重要作用。动态规划是一种思想&#xff0c;它通过将问题分解成更小的子问题并以一种递归的方式解决它们&#xff0c;然后利用这些…

500行代码实现贪吃蛇(1)

文章目录 目录1. Win32 API 介绍1.1 Win32 API1.2 控制台程序&#xff08;Console&#xff09;1.3 控制台屏幕上的坐标COORD1.4 [GetStdHandle](https://learn.microsoft.com/zh-cn/windows/console/getstdhandle)1.5 [GetConsoleCursorInfo](https://learn.microsoft.com/zh-c…

【论文阅读】Sparse is Enough in Scaling Transformers

Sparse is Enough in Scaling Transformers 论文地址摘要1 介绍2 相关工作模型压缩。模型修剪模型蒸馏。稀疏注意力。张量分解。稀疏前馈。 3 Sparse is Enough3.1 稀疏前馈层3.2 稀疏 QKV 层3.3 稀疏损失层。 4 长序列的稀疏性4.1 长序列架构4.2 内存效率的可逆性4.3 泛化的循…

泰克示波器电流探头如何抓浪涌电流波形?

泰克示波器是一种常见的电子测量仪器&#xff0c;广泛应用于电子工程、通信工程、医疗设备等领域。它的主要功能是实时显示电信号的波形&#xff0c;从而帮助工程师和技术人员分析和调试电路。而在一些特定的应用场景中&#xff0c;例如电源、电机、电器设备等&#xff0c;我们…

分布式与一致性协议之ZAB协议(二)

ZAB协议 ZAB协议是如何实现操作地顺序性的&#xff1f; 如果用一句话解释ZAB协议到底是什么&#xff0c;我觉得它是能保证操作顺序性的、基于主备模式的原子广播协议。 接下来&#xff0c;还是以指令X、Y为例具体演示一下&#xff0c;帮助你更好地理解为什么ZAB协议能实现操作…

【不使用深度学习框架】多层感知机实现手写Minist数据集识别

手写Minist识别是一个非常经典的问题&#xff0c;其数据集共有70000张28*28像素的图片&#xff0c;其中60000张作为训练集&#xff0c;剩下的10000张作为测试集&#xff0c;每一张图片都表示了一个手写数字&#xff0c;经过了灰度处理。 本文延续前面文章提到的多层感知机&…