(萌新入门)如何从起步阶段开始学习STM32 —— 0.碎碎念
目录
前言与导论
碎碎念
所以,我到底需要知道哪些东西呢
从一些基础的概念入手
常见的工具和说法
ST公司
MDK5 (Keil5)
CubeMX
如何使用MDK5的一些常用功能
MDK5的一些常见的设置
前言与导论
非常感谢2301_77816627-CSDN博客的提问,他非常好奇如何在起步的阶段学习STM32。笔者自己也是没学多久的STM32,当然下面的说法会有一些漏洞。但是,我仍然想分享一下自己对学习STM32的看法。中间肯定会有不少的疏漏,烦请各位看官大佬见笑了,如果有任何错误,可以直接犀利的在评论区指出,或者给我任何建议,我会第一时间同您交流!
碎碎念
大部分人可能是从51单片机开始学习,笔者自己也是大一的时候学习过非常粗浅的51单片机,在后来需要项目应用的时候才去学习STM32,我相信不少人更多的是从应用层开始接触我们的STM32的。
一个非常经典的疑问就是——我手头有一块非常巨大的开发板,比如说笔者现在敲电脑的旁边就是一块STM32G431RBT6开发板和正点原子家的STM32F103ZET6精英开发板,或者是一块非常迷你的核心板(最小系统板),比如我的左手边就是若干的STM32F103C8T6核心板。当然,这些概念可能会一下把萌新吓跑,在你慌张的准备退出这个标签的时候不妨留步,烦请听我慢慢道来。
嵌入式单片机领域,如果没有上过前置的课程,那可能会显得相当困难。
比如说微机原理(这里属于单片机开发体系当中的架构层次,也就是说,我们眼中的STM32单片机,是一个叫做ARM架构派生的一个产品,您不妨理解为根据这个arm架构的模板,开发出来的),在这个层次上,我们正在讨论的,会是非常具体的(对于架构具体,对萌新而言是灾难)行为——比如说,我如何操作寄存器来控制一个GPIO口的高低电平呢?我如何通过向一个地址写东西来控制实际映射到的外设呢?
比如说数电和模电——这样的电路怎么样就实现了我们GPIO的开漏推挽输出呢?如何实现了IIC协议的硬件层次通信呢?如何就让我们的USART就可以进行一定的串行通信了,又如何进行一定的收发呢?SPI硬件电如何保证了我们描述是否接受到信号发出信号的呢?
比如说C语言甚至是ARM架构汇编,编程语言是我们操纵手头的小单片机,焕发巨大魔力的有利的,直接的工具,他是我们应用层代码——何为应用层?就是直接看得到,摸的着的现象。比如说,当我们讨论
喂!把PA3上外接的LED灯点亮!
好嘞!我这边手头刚处理好使用硬件IIC完成OLED的通信业务逻辑!
的时候,我们就是在完成应用层,也就是最后直接跟用户对接的部分。
还有其他非常多的,甚至包括不少人不屑一谈,但是实际上劝退大把人的代码移植(隶属于编译技术),报错处理(笔者甚至遇到大把完全不懂编译器链接器的),软件工程(完全不知道如何组织自己项目的)等等,单片机的学习,在这里就可以提现出来了——非常的杂,软件硬件都有所交叉,甚至还要延伸到最底层的计算机架构(可以不懂嘛?可以不懂,但代价就是出现问题了你只能两手一摆,拿着示波器逻辑分析仪一顿瞎分析,还没有所以然,写一个代码完全没办法移植修修改改,对面的哥们更改两行代码就完成了整个工程的移植)
所以,笔者在这里,需要尝试整理一下,学习单片机,哪些领域,哪些层级是你需要注意的
1 会用的层级:你不需要关心你的板子到底做了什么,你只需要知道常见的单片机自身的概念,常用外设的概念,常见协议的概念。你知道如何配置Cubemx完成你的目的,你知道如何操作Keil来烧录上传你的板子,你知道如何使用STLink或者是DAP完成你对你手头板子的调试工作。你知道如何使用常见的排查手段——硬件上是示波器,万用表,逻辑分析仪;软件上是打串口日志,对非时序敏感的器件做调试操作等等。你不知道,也会葫芦吞枣的去根据别人的博客猜测可能的步骤。
2 理解的层级:慢慢的,会开始关注拿到新器件的手册,新开发板的手册,知道如何去根据自己的目的查询对应的关键词查询你的问题,你会去熟悉常见的你需要看的配置和资源有哪些(IO口?使用的协议和对应的状态?),你会去查询常见协议的设计的思路和实现的原理,甚至去扒电路图看看特定的你感兴趣的部分的电路实现。
3 更高的层次:现在,可能会去查询arm的手册看看你手头的芯片到底是怎么一回事。他是如何被设计的,因此可以用在哪些场景。你会设计一个庞大的嵌入式系统完成一个特定的任务,而且知道出现在眼前的问题如何使用更加准确的手段排查。笔者完全没到这个地步,但是认识的佬不少远超于这个水平,实在让人难以追赶,哈哈!
所以,我到底需要知道哪些东西呢
-
首先,如果完全没有接触过C语言,电路分析和派生的数电模电课程,笔者真心的建议你好好学学,不着急立马开始玩单片机,否则,你也不过是照搬别人的东西,自己什么也学不会,别人一问三不知。
-
你需要学习如何使用常见的工具:对于初学者,你会使用MDK5(Keil)完成单片机的开发(当然可以是CubeIDE),或者使用CubeMX快速的生成对ST家的芯片的配置模板。你要理解编辑器,编译器,链接器的存在,和他们到底在干什么的作用,笔者之前潜伏在正点原子的群里,就发现大量的人完全混淆这些概念,导致MDK的抛错完全看不懂,这是嵌入式教学中的一个巨大的失误——不对你使用的工具进行详细的介绍和说明他们到底在做什么的讲解,导致不少新人完全不知道发生了什么,代码怎么就跑起来了。当然,笔者比较温和,实际上现在不知道问题也不大,多接触一些慢慢会有所感觉。这里不过是抛出这些概念罢了
-
你需要理解常见的概念。当我们讨论——GPIO口,上拉下拉,外设等等的概念的时候,你可以对应的查询相关的概念。递归式的学习每一个出现的新名词,直到达到自己学习的极限。对于单片机,我们会说GPIO口(如何跟外围的设备进行交互),时钟树和晶振速度(你的单片机工作的速度多快?),定时器(字面含义)等等的概念,具体的你购买开发板的时候肯定会附送资料,跟着学!
-
你需要学习如何阅读手册,教程可以算作你的手册,购买外设商家附送的网盘资料可以是你的手册,一些datasheet网站上收录的手册也可以是你的参考资料,学习根据手册进行编程,是一个嵌入式人的标准素养
-
你需要学会使用单片机提供的能力操作你的外设,事实上这个是最先的。大部分的人首先会完成点亮一个LED的小实验,请记住,拿到一个板子,当你学会点亮一个LED的时候,你就正式的入门这个板子的使用了。随后,你还会驱动比如说其他更加复杂的外设。对摁键的检测,对OLED的控制,对电机舵机的把控等等。从这里开始,你就进入了应用层的学习,逐步走上正轨了。
最基本的步骤就是如此。
从一些基础的概念入手
常见的工具和说法
ST公司
当你打开这篇文章的时候,你肯定已经拥有了一块ST家的单片机(比如说STM32F103ZET6),但是不知道如何进行学习。ST是一个搞单片机的公司,你可以认为手中的这个芯片就是他们家的东西。
MDK5 (Keil5)
还记得你写C语言嘛?在大学里,笔者的老师要求我们使用老毕等VC6.0编辑器编辑我们的代码,我自己是VSCode/QtCreator写C/C++,算法竞赛党喜欢使用Code Block或者是Dev C++ 完成开发,他们都属于一个叫做IDE的产物。IDE,也就是集成开发环境,为你包揽万象,你不需要关心如何完全的配置你的编译器链接器,编辑器,调试器设置,他们通通被IDE接管了。你只需要在IDE中点点瞧瞧,点这个摁扭点那个按钮,事情就结束了。
在嵌入式中,一个最为经典的方案就是拿MDK5作为IDE开发单片机。
Keil MDK5安装详细步骤-CSDN博客
笔者随手搜了一下就搜到了安装的办法。学会使用搜索引擎是你学习嵌入式的一个重要的保障!
CubeMX
CubeMX是ST家为了让他们的芯片更加容易的被开发,使用Java开发的一个好用的快速配置软件,它可以快速的生成一个已经完成了初始化代码的工程模板,比如说,正点原子的教程幸苦的写了2个小时的代码,CubeMX点几下,然后生成工程,进去把LED电平差拉起来,LED就点亮了,前后不超过3分钟。对于初学者,这个软件能够快速的方便的生成一部分代码,但是对自己更长远的发展和学习不利,笔者建议是——写业务速速用,学习的时候,还是先理解每一个文件在做什么比较好。
STM32CubeMX - STM32Cube initialization code generator - STMicroelectronics
具体的介绍,请参考官方网站,注意的是——学习英文也是嵌入式中不可或缺的一部分,因为大部分的文档都是英文的(笑)。
如何使用MDK5的一些常用功能
MDK5的一些常见的设置
笔者写了两年的单片机,大大小小的项目过来,发现常见的需要改动的配置,这里我会说明一下。笔者随手打开了一个STM32F407ZGT6的,正点原子的工程。
打开界面,在你的左手侧的栏内,这是一个讲述的点:
这就是一个典型的目录工程结构。当然,如何分类是自由的,笔者就不喜欢分成这样,喜欢分成include和source后,根据是哪个外设的控制进行单独的分类,你喜欢分成如何,需要自己在开发当中慢慢体会,慢慢就会知道每一种分发的优缺点何在。这不是讲博客就能说的彻底。笔者决定将这个问题留给即将启程学习STM单片机的你。
(笔者使用的VSCode下自己开发的图形显示框架目录结构)
你当然可以添加你自己的C语言文件和头文件,甚至后面可以是汇编文件,取决于你的开发的场景,还有你的水平(笑)
Keil工程添加源文件和头文件(.c和.h)的方法_keil添加头文件.h-CSDN博客
另一个我们打交道的是这个地方。前四个图标设计到的概念是构建。
翻开你的C语言教程,自己默念五次自己写的程序如何从C语言文件到汇编文件再到二进制可执行文件。一般而言,我们会生成.hex文件(关于hex文件的生成规则和到底如何使用,这不属于萌新范畴的知识,感兴趣的朋友自行查阅,对于完全无基础的朋友,我打赌你会灰溜溜的回来继续看我写的内容的),也就是说,我们的IDE,会收集我上面显示工程内的所有的C语言源文件。注意,是所有的!,所以,小心重复的添加C语言源文件,否则它会被编译两次!在链接的时候就会触发符号重定义的错误。
我们先到魔术棒(也就是LED下拉框的右侧),点一下他,就会跳出来这个界面👇常见的一般我们会接触到这些设置:
-
arm编译器的版本——这是设计到编译器的特征的时候会考虑的,一般而言,萌新不需要考虑这个,直到就好
-
是否使用微库——微库是编译器自身实现的一些常见的C语言的工具函数,一般的除非明确启用,一般我们都是自己实现。
来到Output选项卡,如果你是使用一个完全空白的工程,一般而言,不会生成可以进行烧录的hex,我们就是在这里进行更改!勾选Create HEX File生成可以被烧录的二进制文件。
旁边的C/C++编译器设置则是更加高级的一些C/C++设置。一般而言,找不到头文件/目标代码没被参与编译/更改编译的选项等的议题,都是在这里进行解决的。如果不清楚具体改什么,笔者建议自己到搜索引擎上查明白。
这里,重点介绍Define和IncludePath两个选项:
-
define则是说明预定义的宏,不懂什么是宏的,去查
#define
,这是C语言的知识的范畴 -
includePath说明了头文件的检索路径,当你发现你的头文件找不到的时候,需要设置头文件的检索路径,你需要点击includePath后面的三个...进行添加,一般而言,添加哪个文件夹,他只会扫描当前文件夹的所有文件,如果你的头文件在这个路径之下的一个子文件夹中,他是不会递归搜索的
当只有include ./Core -Core |-----a.h // #include "a.h"可以找到 |-----b.h // #include "b.h"可以找到 |-----c|---d.h // #include "d.h"找不到,但是#include"c/d.h"可找到|---e.h // #include "e.h"找不到,但是#include"c/e.h"可找到
下面的内容跟调试精密相关了
笔者使用的是STLink和DAP比较多,你需要做的是在笔者框处的地方做设置
设置下拉框为你使用的调试器。STLink V2那就是STLink-Debugger,DAP那就是如图所示的,JLink那就是JLink Debugger.
点击Settings,在这里,你可以看到调试器现在的工作状态,正常的说,当你选择好调试器之后,给板子和调试器上电,就会看到ID号,举个例子:
笔者连接好了DAP和STM32F407ZGT6后,就会出现这样的界面,到这里,基本上板子就可与被烧录了,
记住,你还需要到这个地方,也就是讲选项卡从Debug切换到Flash Download去,勾选Reset And Run,这是因为调试器上传结束程序后,默认的行为是等待我们手动RESET后才会重新执行(比如嗯下开发板上的reset摁扭),这里我们勾选后就不用设置了。
(感谢HNHKHNH-CSDN博客的补充,笔者需要提到的是——你需要关心一下这里的Device Typed的片上的Flash(On-chip Flash),一般而言,一些芯片这里是空的,需要你进行配置和选择)
一般的,你需要选择的是On-Chip Flash中 容量(Size)最大的选项,在这里也就是片上的中密度闪存(第一个选项),如果你吃不准到底是啥,具体看手册和其他人的博客!
回到这里,下面框处的摁扭,就是在完成上述的工作后,点击就会进行你编译结束的程序的上传(注意每一次上传之前,必须编译!不然会烧老的代码,就会发现你写的代码没有实现效果的更改!)。
关于调试,实在太多,请看大佬的博客:
Keil5软件使用-进阶调试篇_keil调试教程-CSDN博客
还有其他的部分,如果有疑问或者建议,欢迎补充!
相关文章:

(萌新入门)如何从起步阶段开始学习STM32 —— 0.碎碎念
目录 前言与导论 碎碎念 所以,我到底需要知道哪些东西呢 从一些基础的概念入手 常见的工具和说法 ST公司 MDK5 (Keil5) CubeMX 如何使用MDK5的一些常用功能 MDK5的一些常见的设置 前言与导论 非常感谢2301_77816627-CSDN博客的提问,他非常好奇…...

边缘计算网关与 PLC:注塑机车间数据互联新变革
在当今数字化浪潮席卷而来的时代,制造业的智能化转型成为了提升竞争力的关键路径。对于注塑机车间而言,如何实现数据的高效采集与互联,进而优化生产流程、提高生产效率,是众多企业亟待解决的问题。而明达MBox20边缘计算网关与 PLC…...
LeetCode刷题---哈希表---347
前 K 个高频元素 347. 前 K 个高频元素 - 力扣(LeetCode) 题目: 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 示例 1: 输入: nums [1,1,1,2,2,3], k 2 输出: [1…...

LED灯闪烁实验:实验介绍
文章目录 1 实验目标2 工具链2.1 硬件2.2 软件 3 实验流程 1 实验目标 本实验结合Matlab/Simulink工具链和STM工具链,实现STM32开发板上的LED灯闪烁功能。 2 工具链 2.1 硬件 STM32F103C8T6最小系统板 STM32F103C8T6最小系统板是基于STM32F103C8T6微控制器的开发…...

论文笔记(七十二)Reward Centering(一)
Reward Centering(一) 文章概括摘要1 奖励中心化理论 文章概括 引用: article{naik2024reward,title{Reward Centering},author{Naik, Abhishek and Wan, Yi and Tomar, Manan and Sutton, Richard S},journal{arXiv preprint arXiv:2405.0…...

C#之上位机开发---------C#通信库及WPF的简单实践
〇、上位机,分层架构 界面层 要实现的功能: 展示数据 获取数据 发送数据 数据层 要实现的功能: 转换数据 打包数据 存取数据 通信层 要实现的功能: 打开连接 关闭连接 读取数据 写入数据 实体类 作用: 封装数据…...
使用 pjsua2 开发呼叫机器人,批量拨打号码并播放固定音频
如何使用 pjsua2 开发呼叫机器人,批量拨打号码并播放固定音频 声明 该播客仅提供实现思路,并非实际的方案记录,不要盲目照搬。 pjsua2库的安装会有较多问题,请参考本人之前的播客进行安装 pjsua2。 pjsua2 库具体的 api 说明请参考开源库内的 范例代码。 引言 在今天的…...

从函数到神经网络
所有一切的前提是,你要相信这个世界上的所有逻辑和知识,都可以用一个函数来表示。Functions describe the world ! 比如输入物体的质量和加速度,根据牛顿第二定律,就可以得到物体施加的力,这就是人工智能早期的思路&am…...
用自定义注解实现Excel数据导入中的枚举值校验
使用自定义注解实现Excel数据导入中的枚举值校验 在实际开发中,我们经常需要从Excel文件中导入数据,并且这些数据需要符合一定的规则,比如某些字段的值必须是预定义的枚举值。本文将介绍如何使用自定义注解来实现这一功能,以提高…...

网络安全技术pat实验 网络安全 实验
🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 网络安全实验3 前言Kali 常用指令工具教程 ettercap 基本使用 一、口令破解 John the ripper 破解 linux 密码l0phtcrack7 破解 windows 密码John 破解 zip 压…...

4、IP查找工具-Angry IP Scanner
在前序文章中,提到了多种IP查找方法,可能回存在不同场景需要使用不同的查找命令,有些不容易记忆,本文将介绍一个比较优秀的IP查找工具,可以应用在连接树莓派或查找IP的其他场景中。供大家参考。 Angry IP Scanner下载…...
1018. 锤子剪刀布 (20)-PAT乙级真题
题目来源: PTA | 程序设计类实验辅助教学平台 代码实现(代码一): 这个版本是自己写的;(很好理解,但定义了很多变量),有部分样例测试不通过 #include <iostream>…...
MyBatis 中 SqlMapConfig 配置文件详解
精心整理了最新的面试资料,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 configuration:包裹所有配置标签,是整个配置文件的顶级标签。 properties:属性,该标签可以引入外部配置的属性ÿ…...

复杂项目中的多级WBS应该如何分解?
如果你曾经参与过一个复杂的项目,或许就会感受到: 任务繁杂、责任不清、进度难追踪, 真的是每一位项目经理的噩梦。 而这一切的根源,往往就是缺少一个清晰、有效的任务分解结构—— 没有把庞大、复杂的工作拆解得足够明确&…...

红蓝对抗之常见网络安全事件研判、了解网络安全设备、Webshell入侵检测
文章目录 研判(入侵检测) 设备 经典网络云网络 异常HTTP请求Webshell分析 Webshell 的分类Webshell 的检测 主机层面流量层面 附录 常见端口漏洞…...

使用 CodeMirror 6 实现插入文本及替换选中文本功能
本文将通过具体的代码示例,详细解释如何在 Vue3 中使用 CodeMirror 6 实现文本插入功能,包括在光标位置插入文本和选中文本插入文本的代码示例,以及这两种插入方式的区别。 1. 只能在光标位置插入文本 1.1 代码示例 const insertTemplate …...

Huatuo热更新--如何使用
在安装完huatuo热更新插件后就要开始学习如何使用了。 1.创建主框渐Main 新建文件夹Main(可自定义),然后按下图创建文件,注意名称与文件夹名称保持一致 然后新建场景(Init场景),添加3个空物体…...

Flask实现高效日志记录模块
目录 一. 简介: 1. 为什么需要请求日志 二. 日志模块组成 1. 对应日志表创建(包含日志记录的关键字段) 2. 编写日志记录静态方法 3. 在Flask中捕获请求日志 4. 捕获异常并记录错误日志 5. 编写日志接口数据展示 6. 写入数据展…...

scroll、offset、client三大家族和getBoundingClientRect方法
scroll、offset、client三大家族和getBoundingClientRect方法 1.offset(只能读,不能修改)2.client(只能读,不能修改)3.scroll滚动家族4.getBoundingClientRect方法 1.offset(只能读,不能修改) offsetParent:离当前元素最近的有定位的祖先元素…...

JWT 令牌
目录 一、JWT 1、什么是JWT 2、JWT的组成 3、JJWT签发与验证token 1、创建token 2、解析token 3、设置过期时间 4、自定义claims 前言: 在现代Web应用和微服务架构中,用户身份验证和信息安全传输是核心问题。JSON Web Token(J…...

SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...

全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...