STM32速成笔记—概述

文章目录

  • 前言
  • 一、专栏简介
  • 二、前期准备
  • 三、编程规范以及程序架构简介
    • 1. 编程规范
    • 2. 程序架构
  • 四、STM32F103ZET6简介
  • 五、程序模板
  • 六、ST-Link调试
    • 6.1 硬件连接
    • 6.2 Keil配置
    • 6.3 下载调试

前言

本人技术菜鸟一枚,2022年大学毕业,大学加入老师实验室,参加过一些嵌入式相关的比赛,获得过2020年TI杯大学生电子设计竞赛山东省一等奖,参加两次大学的电子设计竞赛均获得一等奖。其他的参加过蓝桥杯,成绩并不理想,山东省嵌入式大学组省二。

最初大一下刚加入实验室时学习51单片机,后续使用STM32系列单片机。本人也并不是很专业系统的学习过STM32的开发,当时跟随B站上普中科技的STM32视频一步一步学习的STM32开发。个人觉得看视频记笔记的方式还是很适合我的。开这个专栏既是为了能够让更多的人能够快速上手STM32,其次也是为了再次学习,扎实基础。

发自内心的讲,最开始学习STM32时学的是时钟呀,一些文件的关系呀,一下子由51转到32觉得好难,心里发怵。但是实际使用时其实32比51更加简单,重要的是学习过程中要对自己充满信心。最后,祝愿大家能够在专栏中有所收获,共同进步!

一、专栏简介

本专栏介绍如何利用库函数进行STM32单片机开发,主要针对的单片机型号为STM32F103ZET6。总结来说,“速成”体现在以下方面

  • 在讲述基础知识后会有相应的实例或者模板程序
  • 学习完后会有小项目练习
  • 专栏基础知识部分内容精简,对于“速成”选手更加友好

其次专栏还有以下内容

  • 简单介绍变成规范合和程序架构
  • 专栏不断更新一些外设的使用方法并提供例程

二、前期准备

前期准备主要有物品以及相关软件的准备。首先是物品,单片机选用的是普中科技的一款核心板,主控芯片为STM32F102ZET6,是下面的样子
STM32F103ZET6
图片上是带有LCD屏幕排母的,有一种是不带的,因为本人开发时经常使用LCD,所以买了带排母的,在某宝和聚诚科技购买的,不带彩屏169RMB。学习过程中除了单片机以外还需要购买调试器,ST-LINK,用来下载程序和调试。USB转TTL(可以直接搜索TTL),用来做串口通信时使用,也可以用来下载程序,但是不可以调试。对于前期学习来讲,这些物品就足够啦。

除了物品之外还需要提前准备一些软件和驱动。比如Keil5,CH340(串口驱动),ST-LINK的驱动,这些时需要安装的。其他的类似于下载软件,串口调试助手都是不需要安装的,本人用的是普中科技提供的一些常用辅助开发软件,小伙伴们可以自己动手找一下,没有找到的话私信留一下邮箱,注明需要常用辅助开发软件,后续会邮件发送。

三、编程规范以及程序架构简介

1. 编程规范

对于新手来讲,编程规范以及代码架构也非常重要,有一个良好的编程规范和代码架构,可以提高开发效率,方便问题排查以及后续的程序维护。这里介绍的编程规范很简单,要求不严格。主要有以下几点

  • 变量定义
    变量定义时最好是能够体现该变量所属的外设模块,该变量是否为全局变量,静态变量或者指针变量。变量首字母小写,后面的单词首字母大写。举例如下
// 以ADC模块为例,需要定义一个存储AD值的变量,举例说明变量命名方式

// 局部变量
u32 adValue = 0;

// 全局变量
u32 gAdcAdValue = 0;   // 加一个g表示是全局变量

// 全局静态变量
static u32 gsAdcAdValue = 0;   // 加一个s表示静态变量

// 指针变量
u32 *gpAdcAdValue = (u32*)0x2000800;   // 加一个p表示为指针变量
  • 注释
    函数注释举例如下
/*
 *==============================================================================
 *函数名称:
 *函数功能:
 *输入参数:
 *返回值:无
 *==============================================================================
*/

对于程序语句注释,如果过长可以在程序上方加注释,如果不是很长可以在程序语句后面空三格输入注释。

  • 函数命名
    函数命名要体现函数所属的层级以及函数的功能,关于层级会在代码架构的部分详细说明,这里只说一下函数命名方式。
// 这里以ADC模块的读取AD值函数为例,说明函数命名方式
void Med_Adc_ReadAdValue (void)
{
    // 函数内容
}

这里med指示该函数位于功能层,属于ADC模块,作用是读取AD值。

  • if,while等语句的使用
    使用if或者while等语句时,需要在括号前面加一个空格,如下
if (gAdcAdValue == 0)
{
    // 程序语句
}
  • 四则运算
    四则运算符号前后需要加空格,包括等于号等符号。如下
c = a * b;

2. 程序架构

该程序架构是本人在工作期间学习的,个人感觉还是有助于提高开发效率,方便后续维护的。主要思想是将一个模块的程序分成三部分,每一部分是一个新建的文件夹,下面都是其他模块相同层级的文件。

  • Drv 驱动层
    该层主要是写一些模块的初始化程序,例如GPIO的初始化,ADC的初始化等。
  • Med 功能层
    该层主要是完成一些功能性的操作,比如读取AD值,点亮LED等。Med层的函数可以包含Drv层的函数。
  • App 业务层
    该层主要是完成一些业务,比如在点亮LED的基础上实现流水灯,比如显示电压值等。

四、STM32F103ZET6简介

STM32F103ZET6是由意法半导体(ST)生产的一款单片机,32指32位。STM32也可以成为32位微处理器。STM32F103ZET6的主时钟频率为72MHz,512KB的FLASH,64KB的SRAM。常用到的有GPIO,中断,ADC,TMR,UART,DMA等。

五、程序模板

在使用Keil5编程时,针对一个外设需要新建对应的.c和.h文件。这里以LED模块为例,简单介绍一下本人的常用模板

.c文件

#include "LED.h"   // LED头文件

需要注意的是一定要空出来一格,否则编译会报警告。
文件最后未空一行的警告
.h文件

#ifndef _LED_H
#define _LED_H

#include "sys.h"   // STM32库文件

#endif

.h文件最后也要空出一行,否则也会有警告。

新建完之后需要将这两个文件添加到工程中。对于.c文件,右键工程文件夹,选择“Manage Project Items”打开。点击“Add Files”将新建的.c文件加入到对应的文件夹下。
添加.c文件

对于.h文件,点击魔术棒,选择“C/C++”,点击三个小点选择对应文件夹即可。

添加.h文件

六、ST-Link调试

在开发过程中学会使用Debug调试,能够帮助我们更快地定位问题。这里简单介绍一下利用ST-Link和普中核心板Debug调试方法。

6.1 硬件连接

首先将ST-Link与核心板连接起来,ST-Link的引脚如下
ST-Link引脚
核心板上并没有给ST-Link预留单独的接口,而是跟JTAG一起。其原理图和硬件图如下
JTAG原理图
JTAG硬件图
由原理图可知,ST-Link的“SWCLK”连接核心板的“JTCK”,“SWDIO”连接核心板的“JTMS”,“RST”接“RESET”。VCC不要接,接好ST-Link后再单独给核心板供电。

6.2 Keil配置

硬件连接好后开始配置Keil5,关于ST-Link驱动的安装这里就不再做介绍了。

  • 首先确定ST-Link驱动是否正常
    确认ST-Link驱动是否安装正常
  • 配置Debug
    点击魔术棒,选择Debug,下图处选择“ST-Link Debugger”。
    Debug配置
    然后再点击“Settings”,在“SWIO”右侧不显示“no target connected”就说明ST-Link连接正常。点击“Flash Download”
    Flash Download
    按照图示配置,“Programming Algorithm”只要选择符合芯片型号的即可,需要注意的是,只能保留一个。
    Flash Download配置
    按照下图配置“Utilities”。
    配置Utilities
    至此,Keil5关于ST-Link的内容配置完成,如果小伙伴遇到其他问题,可以多去看一些大佬们的博客。

6.3 下载调试

配置完上面的内容后就可以使用ST-Link进行下载调试了。下载的话比较简单,编译完成后直接点击下图标注的图标,等到下载完成即可。

下载程序

调试时点击下图所示按钮,进入Debug调试。
调试按钮

下面简单介绍一下调试窗口中各个按钮的作用,其他更加详细的介绍需要小伙伴自行搜索,这里参考了这篇大佬的文章KEIL5中Debug调试。

调试窗口按钮含义

第一部分从左到右

  • 复位
  • 全速运行
  • 停止
  • 每点一次运行一行,遇到函数体会进入
  • 每点一次运行一行,遇到函数体不进入,直接执行完到下一行
  • 快速执行当前函数剩余语句,然后跳出该函数体,准备执行下一条
  • 直接运行到光标处

第二部分从左到右

  • 设置当前光标处为断点
  • 失能当前光标处断点
  • 失能全部断点
  • 删除全部断点

打断点的方法比较简单,直接在想要打断点的一行左侧点击一下,出现一个红点就表示已经添加了断点。断点的作用是能够让程序运行到断点处停止,有助于我们分析函数运行方式以及变量的变化。

断点示意图

调试时可以查看某一个变量的值。选中想要查看的变量,右键

查看变量值

此时就会出现一个窗口,能够查看该变量的值。

查看变量值

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

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

相关文章

chatgpt赋能python:如何在Python中创建模块:完整指南

如何在Python中创建模块:完整指南 如果你是一位Python开发者,你肯定需要用到模块。模块使得代码更容易组织和管理,并且可以复用许多代码片段, 提高代码的可重用性。在Python中,模块是一组相关函数,方法和变…

oracle expdp导致system表空间满

今天下午,项目经理反馈有套11204版本数据库无法使用了,立刻登录检查环境发现SYSTEM表空间使用率99.99%了 TABLESPACE_NAME MAXSIZE_MB ACTUALSIZE_MB USED_MB FREESPACE_MB SPACE USAGE ----------------- ---------- ------------- ---------- …

Trace32 SRST和TRST、system.attach 和 system.up的区别

目录 TRST-Resets the JTAG TAP controller and the CPU internal debug logic SRST- Resets the CPU core and peripherals SYStem.Mode Down SYStem.Mode Nodebug SYStem.Mode Prepare SYStem.Mode Go SYStem.Mode Attach SYStem.Mode StandBy SYStem.Mode Up 下图为…

ProGuard 进阶系列(二)配置解析

书接上文,从开源库中把代码下载到本地后,就可以在 IDE 中进行运行了。从 main 方法入手,可以看到 ProGuard 执行的第一步就是去解析参数。本文的内容主要分析源码中我们配置的规则解析的实现。 在上一篇文章末尾,在 IDE 中&#x…

大数据Doris(三十七):Spark Load导入HDFS数据

文章目录 Spark Load导入HDFS数据 一、准备HDFS数据 二、创建Doris表 三、创建Spark Load导入任务

【Reids】搭建主从集群以及主从数据同步原理

目录 一、搭建主从集群 1、介绍 2、搭建 二、数据同步原理 1、全量同步 2、主节点如何判断是不是第一次连接 3、增量同步 4、优化主从数据同步 一、搭建主从集群 1、介绍 单节点的Redis并发能力存在上限,要提高并发能力就需要搭建主从集群,实现…

【LLM GPT】李宏毅大型语言模型课程

目录 1 概述1.1 发展历程1.2 预训练监督学习预训练的好处 1.3 增强式学习1.4 对训练数据的记忆1.5 更新参数1.6 AI内容检测1.7 保护隐私1.8 gpt和bert穷人怎么用gpt 2 生成式模型2.1 生成方式2.1.1 各个击破 Autoregressive2.1.2 一次到位 Non-autoregressive2.1.3 两者结合 2.…

RabbitMQ虚拟主机无法启动的原因和解决方案

RabbitMQ虚拟主机无法启动的原因和解决方案 摘要: RabbitMQ是一个广泛使用的开源消息代理系统,但在使用过程中可能会遇到虚拟主机无法启动的问题。本文将探讨可能导致该问题的原因,并提供相应的解决方案,以帮助读者解决RabbitMQ虚…

第五章 模型篇: 模型保存与加载

参考教程: https://pytorch.org/tutorials/beginner/basics/saveloadrun_tutorial.html 文章目录 pytorch中的保存与加载torch.save()torch.load()代码示例 模型的保存与加载保存 state_dict()nn.Module().load_state_dict()加载模型参数保存模型本身加载模型本身 c…

K8s 中 port, targetPort, NodePort的区别

看1个例子: 我们用下面命令去创建1个pod2, 里面运行的是1个nginx kubectl create deployment pod2 --imagenginx当这个POD被创建后, 其实并不能被外部访问, 因为端口映射并没有完成. 我们用下面这个命令去创建1个svc &#xff…

chatgpt赋能python:Python怎样让画笔变粗

Python怎样让画笔变粗 Python是一门强大的编程语言,不仅适用于数据分析和机器学习等领域,也可以用来进行图像处理。在Python中,我们可以使用Pillow库来进行图像操作。在本篇文章中,我们将介绍如何使用Python和Pillow来让画笔变粗…

vue2_markdown的内容目录生成

文章目录 ⭐前言⭐引入vue-markdown💖 全局配置💖 渲染选项💖 取出markdown的标题层级 ⭐结束 ⭐前言 大家好!我是yma16,本文分享在vue2的markdown文本内容渲染和目录生成 背景: 优化个人博客功能&#xf…

delphi的ARM架构支持与System.Win.WinRT库

delphi的ARM架构支持与System.Win.WinRT库 目录 delphi的ARM架构支持与System.Win.WinRT库 一、WinRT 二、delphi的System.Win.WinRT库 2.1、支持ARM芯片指令 2.2、基于WinRT技术的特点 2.3、所以使用默认库而未经转化的服务端应用并不支持ARM架构服务器 2.4、对默认库…

【Linux】初步认识Linux系统

Linux 操作系统 主要作用是管理好硬件设备,并为用户和应用程序提供一个简单的接口,以便于使用。 作为中间人,连接硬件和软件 常见操作系统 桌面操作系统 WindowsmacOsLinux 服务器操作系统 LinuxWindows Server 嵌入式操作系统 Linux …

深度学习图像分类、目标检测、图像分割源码小项目

​demo仓库和视频演示: 银色子弹zg的个人空间-银色子弹zg个人主页-哔哩哔哩视频 卷积网路CNN分类的模型一般使用包括alexnet、DenseNet、DLA、GoogleNet、Mobilenet、ResNet、ResNeXt、ShuffleNet、VGG、EfficientNet和Swin transformer等10多种模型 目标检测包括…

Java关键词synchronized

目录 一、通过卖票系统观察多线程的安全隐患 二、synchronized的基本知识 1.使用synchronized的原因 2.synchronized的作用 3.synchronized的基本格式 a.synchronized加在方法名前 b.synchronized用在方法中 4. Java锁机制 5.synchronized注意事项 三、使用synchronize…

Java Logback日志框架概述及logback.xml详解

日志技术具备的优势 可以将系统执行的信息选择性的记录到指定的位置(控制台、文件中、数据库中)。 可以随时以开关的形式控制是否记录日志,无需修改源代码。 日志体系结构 Logback日志框架 Logback是由log4j创始人设计的另一个开源日志组件&#xff0…

MATLAB读取OpenFOAM的二进制文件

OpenFOAM的文件格式 上面是OpenFOAM二进制文件的格式,我们可以看出,前面21行都是无关的说明文件,22开始时除了一个括号之外,其它的都是数据。 读取数据 读取数据的思路非常简单,忽略不需要的,读取需要的。…

Autoware 跑 Demo(踩坑指南)

Autoware 跑 Demo(踩坑指南) 网上的博客和官方的教程,几乎都是一样的,但实际上跑不起来 Autoware 1.12学习整理–01–运行rosbag示例 Autoware入门学习(三)——Autoware软件功能使用介绍(1/3&a…

【Unity3D】激光雷达特效

1 由深度纹理重构世界坐标 屏幕深度和法线纹理简介中对深度和法线纹理的来源、使用及推导过程进行了讲解,本文将介绍使用深度纹理重构世界坐标的方法,并使用重构后的世界坐标模拟激光雷达特效。 本文完整资源见→Unity3D激光雷达特效。 1)重构…