(萌新入门)如何从起步阶段开始学习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的手册看看你手头的芯片到底是怎么一回事。他是如何被设计的,因此可以用在哪些场景。你会设计一个庞大的嵌入式系统完成一个特定的任务,而且知道出现在眼前的问题如何使用更加准确的手段排查。笔者完全没到这个地步,但是认识的佬不少远超于这个水平,实在让人难以追赶,哈哈!

所以,我到底需要知道哪些东西呢

  1. 首先,如果完全没有接触过C语言,电路分析和派生的数电模电课程,笔者真心的建议你好好学学,不着急立马开始玩单片机,否则,你也不过是照搬别人的东西,自己什么也学不会,别人一问三不知。

  2. 你需要学习如何使用常见的工具:对于初学者,你会使用MDK5(Keil)完成单片机的开发(当然可以是CubeIDE),或者使用CubeMX快速的生成对ST家的芯片的配置模板。你要理解编辑器,编译器,链接器的存在,和他们到底在干什么的作用,笔者之前潜伏在正点原子的群里,就发现大量的人完全混淆这些概念,导致MDK的抛错完全看不懂,这是嵌入式教学中的一个巨大的失误——不对你使用的工具进行详细的介绍和说明他们到底在做什么的讲解,导致不少新人完全不知道发生了什么,代码怎么就跑起来了。当然,笔者比较温和,实际上现在不知道问题也不大,多接触一些慢慢会有所感觉。这里不过是抛出这些概念罢了

  3. 你需要理解常见的概念。当我们讨论——GPIO口,上拉下拉,外设等等的概念的时候,你可以对应的查询相关的概念。递归式的学习每一个出现的新名词,直到达到自己学习的极限。对于单片机,我们会说GPIO口(如何跟外围的设备进行交互),时钟树和晶振速度(你的单片机工作的速度多快?),定时器(字面含义)等等的概念,具体的你购买开发板的时候肯定会附送资料,跟着学!

  4. 你需要学习如何阅读手册,教程可以算作你的手册,购买外设商家附送的网盘资料可以是你的手册,一些datasheet网站上收录的手册也可以是你的参考资料,学习根据手册进行编程,是一个嵌入式人的标准素养

  5. 你需要学会使用单片机提供的能力操作你的外设,事实上这个是最先的。大部分的人首先会完成点亮一个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下拉框的右侧),点一下他,就会跳出来这个界面👇常见的一般我们会接触到这些设置:

  1. arm编译器的版本——这是设计到编译器的特征的时候会考虑的,一般而言,萌新不需要考虑这个,直到就好

  2. 是否使用微库——微库是编译器自身实现的一些常见的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博客

还有其他的部分,如果有疑问或者建议,欢迎补充!

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

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

相关文章

线程池-抢票系统性能优化

文章目录 引言-购票系统线程池购票系统-线程池优化 池化 vs 未池化 引言-购票系统 public class App implements Runnable {private static int tickets 100;private static int users 10000;private final ReentrantLock lock new ReentrantLock(true);public void run() …

soular基础教程-使用指南

soular是TikLab DevOps工具链的统一帐号中心,今天来介绍如何使用 soular 配置你的组织、工作台,快速入门上手。  1. 账号管理 可以对账号信息进行多方面管理,包括分配不同的部门、用户组等,从而确保账号权限和职责…

大数据SQL调优专题——Hive执行原理

引入 Apache Hive 是基于Hadoop的数据仓库工具,它可以使用SQL来读取、写入和管理存在分布式文件系统中的海量数据。在Hive中,HQL默认转换成MapReduce程序运行到Yarn集群中,大大降低了非Java开发者数据分析的门槛,并且Hive提供命令…

细胞计数专题 | LUNA-FX7™新自动对焦算法提高极低细胞浓度下的细胞计数准确性

现代细胞计数仪采用自动化方法,在特定浓度范围内进行细胞计数。其上限受限于在高浓度条件下准确区分细胞边界的能力,而相机视野等因素则决定了下限。在图像中仅包含少量可识别细胞或特征的情况下,自动对焦可能会失效,从而影响细胞…

JAVA生产环境(IDEA)排查死锁

使用 IntelliJ IDEA 排查死锁 IntelliJ IDEA 提供了强大的工具来帮助开发者排查死锁问题。以下是具体的排查步骤: 1. 编写并运行代码 首先,我们编写一个可能导致死锁的示例代码: public class DeadlockExample {private static final Obj…

leetcode 297. 二叉树的序列化与反序列化

题目如下 我们常常说单独先序遍历不能完整的表示一棵树是有前提条件的。 为什么?先序遍历是按 根节点 左子树 右子树的方向遍历树且遇到空子树直接返回,这样会造成我们并不知道某个节点的左右子树存在与否,故我们无法确定树的形状。但是如果…

pt->onnx->rknn(量化) step by step FAQ

文档修订中... 1.pt->onnx 这个转换是在yolov11的docker环境做的转换。非常简单。 #!/usr/bin/env python3 # -*- coding: utf-8 -*- # 获取当前脚本文件所在目录的父目录,并构建相对路径 import os import sys current_dir os.path.dirname(os.path.abspath…

同为科技智能PDU助力Deepseek人工智能和数据交互的快速发展

1 2025开年,人工智能领域迎来了一场前所未有的变革。Deepseek成为代表“东方力量”的开年王炸,不仅在国内掀起了技术热潮,并且在全球范围内引起了高度关注。Deepseek以颠覆性技术突破和现象级应用场景席卷全球,这不仅重塑了产业格…

【css】width:100%;padding:20px;造成超出100%宽度的解决办法 - box-sizing的使用方法 - CSS布局

问题 修改效果 解决方法 .xx {width: 100%;padding: 0 20px;box-sizing: border-box; } 默认box-sizing: content-box下, width 内容的宽度 height 内容的高度 宽度和高度的计算值都不包含内容的边框(border)和内边距(padding&…

C++ Primer 函数基础

欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…

滤波总结 波形处理原理 如何对一个规律的波形进行滤波 显现出真正的波形 如何设计滤波

需要用到的软件:waveserialport vofa++ 1.波形想用MCU进行采集首先你要考虑到你的采集频率因为如果你的对象波形即你要采集的波形,他过于快速的话有一些MCU它是不能的比如说有一些它的主频才36兆72兆呢你如果遇到一个特别快的波形毫秒级别那他就检测不了 2.…

PyQt组态软件 拖拽设计界面测试

PyQt组态软件测试 最近在研究PyQt,尝试写个拖拽设计界面的组态软件,目前实现的功能如下: 支持拖入控件,鼠标拖动控件位置 拖动控件边缘修改控件大小支持属性编辑器,修改当前选中控件的属性 拖动框选控件,点选控件 控…

算法学习笔记之贪心算法

导引(硕鼠的交易) 硕鼠准备了M磅猫粮与看守仓库的猫交易奶酪。 仓库有N个房间,第i个房间有 J[i] 磅奶酪并需要 F[i] 磅猫粮交换,硕鼠可以按比例来交换,不必交换所有的奶酪 计算硕鼠最多能得到多少磅奶酪。 输入M和…

把 DeepSeek1.5b 部署在显卡小于4G的电脑上

这里写自定义目录标题 介绍准备安装 Ollama查看CUDA需要版本安装CudaToolkit检查Cuda是否装好设置Ollama环境变量验证是否跑在GPU上ollama如何导入本地下载的模型安装及配置docker安装open-webui启动open-webui开始对话 调整gpu精度 介绍 Deepseek1.5b能够运行在只用cpu和gpu内…

第四十四篇--Tesla P40+Janus-Pro-7B部署与测试

环境 系统:CentOS-7 CPU: 14C28T 显卡:Tesla P40 24G 驱动: 515 CUDA: 11.7 cuDNN: 8.9.2.26创建环境 conda create --name trans python3.10torch 2.6.0 transformers 4.48.3克隆项目 git clone https:/…

「vue3-element-admin」Vue3 + TypeScript 项目整合 Animate.css 动画效果实战指南

🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template 🌺 仓库主页: GitCode︱ Gitee ︱ Github 💖 欢迎点赞 👍 收藏 ⭐评论 …

LabVIEW太阳能制冷监控系统

在全球能源需求日益增长的背景下,太阳能作为一种无限再生能源,被广泛应用于各种能源系统中。本基于LabVIEW软件和STM32F105控制器的太阳能制冷监控系统的设计与实现,提供一个高效、经济的太阳能利用方案,以应对能源消耗的挑战。 项…

【openresty服务器】:源码编译openresty支持ssl,增加service系统服务,开机启动,自己本地签名证书,配置https访问

1,openresty 源码安装,带ssl模块 https://openresty.org/cn/download.html (1)PCRE库 PCRE库支持正则表达式。如果我们在配置文件nginx.conf中使用了正则表达式,那么在编译Nginx时就必须把PCRE库编译进Nginx&#xf…

迅为RK3568开发板篇Openharmony配置HDF控制UART-什么是串口

串口(Serial Port)也叫串行通信接口,通常也叫做 COM 接口,是通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输。 两个 UART 设备的连接示意图如下,UART 与其他模块一般用 2 线…

Anaconda +Jupyter Notebook安装(2025最新版)

Anaconda安装(2025最新版) Anaconda简介安装1:下载anaconda安装包2: 安装anaconda3:配置环境变量4:检查是否安装成功5:更改镜像源6:更新包7:检查 Jupyter Notebook一.Jup…