STM32单片机入门学习——第3-4节: [2-1、2]软件安装和新建工程
写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做!
本文写于:2025.04.01
STM32开发板学习——第一节: [1-1]课程简介
- 前言
- 开发板说明
- 引用
- 解答和科普
- 一、软件安装
- 二、新建工程
- 回顾
- 总结
前言
本次笔记是用来记录我的学习过程,同时把我需要的困难和思考记下来,有助于我的学习,同时也作为一种习惯,可以督促我学习,是一个激励自己的过程,让我们开始32单片机的学习之路。
欢迎大家给我提意见,能给我的嵌入式之旅提供方向和路线,现在作为小白,我就先学习32单片机了,就跟着B站上的江协科技开始学习了.
在这里会记录下江协科技32单片机开发板的配套视频教程所作的实验和学习笔记内容,因为我之前有一个开发板,我大概率会用我的板子模仿着来做.让我们一起加油!
另外为了增强我的学习效果:每次笔记把我不知道或者问题在后面提出来,再下一篇开头作为解答!
开发板说明
本人采用的是慧净的开发板,因为这个板子是我N年前就买的板子,索性就拿来用了。另外我也购买了江科大的学习套间。
原理图如下
1、开发板原理图

2、STM32F103C6和51对比

3、STM32F103C6核心板

视频中的都用这个开发板来实现,如果有资源就利用起来。另外也计划实现江协科技的套件。
下图是实物图

引用
【STM32入门教程-2023版 细致讲解 中文字幕】
还参考了下图中的书籍:
STM32库开发实战指南:基于STM32F103(第2版)

数据手册
解答和科普
一、软件安装





在线安装







ST-link驱动安装



CH340驱动安装
二、新建工程
1、 开发STM32的形式为:基于寄存器的方式(太多太麻烦);基于标准库(库函数)和基于HAL库方式。
基于HAL库的方式可以用图形化界面快速配置STM32方便但不是底层。
固件库的文件


Libraries里面就是库函数的文件,建工程要用;
Project是官方提供的工程示例和模版,可以参考;
Utilities是STM32官方评估板的相关例程;
库函数的发布文档和使用手册。
新建工程

自动生成的文件夹

1、创立Start文件夹:
1.1文件从Libaries-CMSIS-CM3-DeviceSupport-ST-STM32F10x-startup-arm,这些就是STM32的启动文件,STM32的程序就是从启动文件开始执行的。

1.2
然后startup文件夹同级的stm32f10x.h(STM32外设寄存器描述文件和51单片机RGEX52.H一样);这两个system文件是用来配置时钟的,STM32主频72MHz,就是system文件里的函数配置的。
1.3
STM32是内核和内核外围的设备组成的,所以还要加入一个内核寄存器的描述文件:DeviceSupport同级的Libaries-CMSIS-CM3-CoreSupport中的两个cm3就是内核的寄存器描述

这样工程的必要文件就复制完成了。
我们回到keil把刚才复制的文件添加到工程里面,把名字改为Start,添加现存的文件,首先添加一下启动文件,这个启动文件有很多分类,我们只能添加其中一个,我们所用的型号需要选择后缀为md.s的启动文件,剩下的C文件和H文件都要添加进来。


这样,我们Start文件夹里面的文件就添加好了,这里的文件都是STM32里最基本的文件,是不需要我们修改的,我们添加进来即可。小钥匙代表是只读文件。
最后还需呀添加上这个文件夹的头文件路径



这是保证放在User文件夹下。
写main函数看是否成功

最后一行必须为空行,不然会报错。

这就完成一个基于寄存器开发的工程。
改变字体大小

字体格式UTF-8

配置调试器:


勾选后,我们下载程序后会立马复位并执行,这样方便一些,否则每次下载,还需要按一下板子上的复位键才能执行程序。

点击load就可以下载了。
完成基于寄存器完成点灯:
接下来配置寄存器,来点亮这个灯,打开STM32的参考手册,首先是RCC的一个寄存器,来使能GPIO的时钟,GPIO都是APB2的外设,所以在这个APB2外设时钟使能寄存器RCC_APB2ENR里面配置,


这一位写1,其他无关项都给0,那整个寄存器的二进制数据转化为十六进制,4位为一个数字,总共32也就是8位十六进制数:00000010。
配置时钟使能:

配置PC13口的模式:

无关为0;所以值为0x0030 0000
配置数据:


这个操作非常不好,就是除了PC13之外的位都配置成了0,这样就会影响到其他端口的原有配置,如果要做到只配置PC13而不影响其他位,就需要进行&=和|=操作。
HJ开发板寄存器点亮LED灯
#include "stm32f10x.h" // Device headerint main(void)
{RCC->APB2ENR=0x00000004; //使能GPIOAGPIOA->CRL=0x00000003; //调试GPIOA0GPIOA->ODR=0x00000000; //亮while(1){}}
生成HEX文件,串口下载

STM32点灯

在寄存器版本上完成库创建
在工程文件夹下创建Library文件夹,
2、Library存放库函数:打开固件库Libaries-STM32F10x_StdPeriph_Driver(标准外设驱动)-src中的文件,其中misc是内核的库文件,其他的就是内核外的外设库函数
打开固件库的inc文件夹,这些是库函数的头文件,继续ctrl+A全选

然后放到Library文件夹下,和添加Start一样,在Keil软件中加入。

3、User文件夹: 打开固件库文件夹,打开Project-STM32Template,选择main、stm32f10x_conf.h和两个it结尾的文件,conf文件是用来配置库函数头文件的包含关系的,还有用来参数检查的函数定义,这是所有库函数都需要的
两个it文件是用来存放中断函数的。

最后还需要一个宏定义:

如果你定义了USE_STDPERIPH_DRIVER这个字符串,下面这个 #include "stm32f10x_conf.h"语句才有效

这样才能包含标准外设库,也就是库函数。
下面的头文件路径也不要忘了

这样基于库函数的工程就建好了
Library里面的库函数也都是只读文件不需要更改,需要更改的是User组里面的文件。


文件创建成功,库函数也是间接的配置寄存器,所以他们的步骤也是一样的,首先是使能时钟,




#include "stm32f10x.h" // Device headerint main(void)
{// RCC->APB2ENR=0x00000004;
// GPIOA->CRL=0x00000003;
// GPIOA->ODR=0x00000000; //灭RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能GPIOA的时钟GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //通用推挽输出GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0; //配置那个端口GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //速度时钟GPIO_Init(GPIOA, &GPIO_InitStructure); //整体配置GPIOGPIO_SetBits(GPIOA,GPIO_Pin_0); //GPIOA0高电平
// GPIO_ResetBits(GPIOA,GPIO_Pin_0); //GPIOA0低电平while(1){}}
控制灯的亮灭
回顾
首先是新建工程里面的启动文件,我们新建工程的第一个加的就是启动文件,要根据芯片型号来选择,分为以下的内容。


小结

1、创立Start文件夹:文件从Libaries-CMSIS-CM3-DeviceSupport-ST-STM32F10x-startup-arm,这些就是STM32的启动文件,STM32的程序就是从启动文件开始执行的。
然后startup文件夹同级的stm32f10x.h(STM32外设寄存器描述文件和51单片机RGEX52.H一样);这两个system文件是用来配置时钟的,STM32主频72MHz,就是system文件里的函数配置的。
STM32是内核和内核外围的设备组成的,所以还要加入一个内核寄存器的描述文件:DeviceSupport同级的Libaries-CMSIS-CM3-CoreSupport中的两个cm3就是内核的寄存器描述
然后回到keil添加:
2、Library存放库函数:打开固件库Libaries-STM32F10x_StdPeriph_Driver(标准外设驱动)-src中的文件,其中misc是内核的库文件,其他的就是内核外的外设库函数
打开固件库的inc文件夹,这些是库函数的头文件,继续ctrl+A全选
3、User文件夹: 打开固件库文件夹,打开Project-STM32Template,选择main、stm32f10x_conf.h和两个it结尾的文件,conf文件是用来配置库函数头文件的包含关系的,还有用来参数检查的函数定义,这是所有库函数都需要的
两个it文件是用来存放中断函数的。
工程文件复制完成
在keil创建三个组:Start、Library、User、添加文件;
Start文件添加带md.s,然后选择其他的.c.h文件,选择并添加
Library是all files Ctrl+A全选
User也是一样all files Ctrl+A全选
文件添加完成
打开魔术棒按钮,打开工程选项,选择C/C++,在Include Paths栏,把我们自己建的文件夹路径都添加进来:Start、Library、User
在Define一栏中写下:USE_STDPERIPH_DRIVER
USE使用_STD标准_PERIP外设_DRVER驱动
最后选择Debug,调试器选择ST-LINK,设置Flash Download 勾选上Rest and Run,这样工程就配置好了。
把main文件删除写上自己的main函数,加上头文件,写上main函数。
注意最后一行要是空行,不然会警告。

首先是Startup启动文件:这个是程序执行最基本的文件,是用汇编写的,这个复位中断是整个程序的入口,当STM32上电复位或者按下复位键之后,程序就会进入复位中断函数执行,复位中断函数主要就做了两件事情,第一个是调用Systemlnit函数,第二个是调用main函数,不会结束所以在main函数的最后,一定是一个死循环。


设置微控制器的启动,初始化嵌入式闪存接口,锁相环,更新系统内核的时钟变量,下面的note写的是这个函数仅在复位后需要调用,下面就是配置的,帮我们配置好,还启动了其他的中断,达到条件就会自动执行。
中断函数的定义就是在STM32fx_it里面,自定义的中断建议写在这,不过我们在那用,写在哪里。

当然我们可以自己封装函数。
到此为止。这个工程结构主动执行的部分就介绍完了。
右边是被动执行的东西了,相当于STM32的资源,我们在主函数或者中断函数就可以调用这些资源,
库函数调用

conf.h是包含了所有的库文件的头文件,又因为stm31f10.h包含了conf.h,所以只需要包含一个stm31f10.h文件就行了,就可以调用库函数了。

总结
本节课主要是学习了如何安装所需的软件和创建一个工程,基于寄存器和标准库的不同,其本质都是操作寄存器,要经过配置,start可以满足启动就可以寄存器配置,但是不方便,要查寄存器手册还要计算,&=和|=。所以又学习了如何创建库。
1、创立Start文件夹:文件从Libaries-CMSIS-CM3-DeviceSupport-ST-STM32F10x-startup-arm,这些就是STM32的启动文件,STM32的程序就是从启动文件开始执行的。
然后startup文件夹同级的stm32f10x.h(STM32外设寄存器描述文件和51单片机RGEX52.H一样);这两个system文件是用来配置时钟的,STM32主频72MHz,就是system文件里的函数配置的。
STM32是内核和内核外围的设备组成的,所以还要加入一个内核寄存器的描述文件:DeviceSupport同级的Libaries-CMSIS-CM3-CoreSupport中的两个cm3就是内核的寄存器描述
然后回到keil添加:
2、Library存放库函数:打开固件库Libaries-STM32F10x_StdPeriph_Driver(标准外设驱动)-src中的文件,其中misc是内核的库文件,其他的就是内核外的外设库函数
打开固件库的inc文件夹,这些是库函数的头文件,继续ctrl+A全选
3、User文件夹: 打开固件库文件夹,打开Project-STM32Template,选择main、stm32f10x_conf.h和两个it结尾的文件,conf文件是用来配置库函数头文件的包含关系的,还有用来参数检查的函数定义,这是所有库函数都需要的
两个it文件是用来存放中断函数的。
工程文件复制完成
在keil创建三个组:Start、Library、User、添加文件;
Start文件添加带md.s,然后选择其他的.c.h文件,选择并添加
Library是all files Ctrl+A全选
User也是一样all files Ctrl+A全选
文件添加完成
打开魔术棒按钮,打开工程选项,选择C/C++,在Include Paths栏,把我们自己建的文件夹路径都添加进来:Start、Library、User
在Define一栏中写下:USE_STDPERIPH_DRIVER
USE使用_STD标准_PERIP外设_DRVER驱动
最后选择Debug,调试器选择ST-LINK,设置Flash Download 勾选上Rest and Run,这样工程就配置好了。
把main文件删除写上自己的main函数,加上头文件,写上main函数。
注意最后一行要是空行,不然会警告。
最后实现了点灯。
我是使用的串口下载,要这样选择同事下载前按一下复位按钮。

相关文章:
STM32单片机入门学习——第3-4节: [2-1、2]软件安装和新建工程
写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做! 本文写于:2025.04.01 STM32开发板学习——第一节: [1-1]课程简介 前言开发板说明引用解答和…...
W3C XML Schema 活动
W3C XML Schema 活动 概述 W3C XML Schema(XML Schema)是万维网联盟(W3C)定义的一种数据描述语言,用于定义XML文档的结构和约束。XML Schema为XML文档提供了一种结构化的方式,确保数据的一致性和有效性。本文将详细介绍W3C XML Schema的活动,包括其发展历程、主要特点…...
爬虫【Scrapy-redis分布式爬虫】
Scrapy-redis分布式爬虫 1.Scrapy-redis实现增量爬虫 增量爬虫的含义 就是前面所说的的暂停、恢复爬取 安装 # 使用scrapy-redis之前最好将scrapy版本保持在2.8.0版本, 因为2.11.0版本有兼容性问题 pip install scrapy==2.8.0 pip install scrapy-redis -i https://pypi.tun…...
intellij Idea 和 dataGrip下载和安装教程
亲测有效 第一步:卸载老版本idea/Datagrip (没有安装过的可跳过此步骤) 第二步:下载idea/dataGrip安装包 建议选择2022以后的版本 官网: https://www.jetbrains.com/datagrip/download/other.html 选择dataGrip 的…...
轻量级搜索接口技术解析:快速实现关键词检索的Java/Python实践
Hi,你好! 轻量级搜索接口技术解析:快速实现关键词检索的Java/Python实践 接口特性与适用场景 本接口适用于需要快速集成搜索能力的开发场景,支持通过关键词获取结构化搜索结果。典型应用场景包括: 垂直领域信息检索…...
架构设计基础系列:事件溯源模式浅析
图片来源网络,侵权删 1. 引言 1.1 研究背景 传统CRUD模型的局限性:状态覆盖导致审计困难、无法追溯历史。分布式系统复杂性的提升:微服务架构下数据一致性、回滚与调试的需求激增。监管合规性要求:金融、医疗等领域对数…...
ResNet系列和ViT系列预训练模型权重文件下载
一、简单介绍 OpenAI CLIP项目提供的预训练模型权重文件列表,主要包含两种架构系列和不同规模配置: ResNet系列 (RN) 基础版本:RN50(ResNet-50)扩展版本:RN50x4、RN50x16、RN50x64(宽度扩展&am…...
【力扣hot100题】(035)二叉树的中序遍历
正常方法递归很简单,于是又学了一种栈的方法。 原理如下:每次循环先尽量将目前节点入栈并左移,没有左节点时回到栈首节点将目前节点放入结果容器中并移出栈外,目前节点变为该节点的右节点,循环结束条件是目前节点为nu…...
《数字图像处理》教材寻找合作者
Rafael Gonzalez和Richard Woods所著的《数字图像处理》关于滤波器的部分几乎全错,完全从零开始写,困难重重。关于他的问题已经描述在《数字图像处理(面向新工科的电工电子信息基础课程系列教材)》。 现寻找能够共同讨论、切磋、…...
批量删除 txt/html/json/xml/csv 等文本文件中的重复行
在文本文件中,可能会存在一些重复的数据行,这可能不是我们期望的,因此我们会碰到需要删除文本文件中重复行的情况。如果是人工删除,当文件较大或者数量较多的时候,处理的难度会较大。今天就给大家介绍一下批量删除文本…...
LangChain 使用向量数据库介绍与使用
LangChain 是一个用于构建大语言模型(LLM)应用的框架,而向量数据库在 LangChain 中主要用于实现检索增强生成(RAG, Retrieval-Augmented Generation),即通过向量搜索从外部知识库中快速检索相关信息,辅助大模型生成更准确的回答。以下是具体的使用方法: 1. 核心流程 L…...
基于微信小程序的智慧乡村旅游服务平台【附源码】
基于微信小程序的智慧乡村旅游服务平台(源码L文说明文档) 目录 4系统设计 4.1系统功能设计 4.2系统结构 4.3.数据库设计 4.3.1数据库实体 4.3.2数据库设计表 5系统详细实现 5.1 管理员模块的实现 5.1.1旅游景点管理…...
d202542
一、142.环形链表I 142. 环形链表 II - 力扣(LeetCode) 用set统计一下 如果再次出现那么就环的第一个return返回就行 public ListNode detectCycle(ListNode head) {Set<ListNode> set new HashSet<>();ListNode cur head;while(cur ! …...
NodeTextFileCollectorScrapeError 报警原因及解决方法
现象 prometheus 经常有告警 NodeTextFileCollectorScrapeError 查看 node-exporter 日志出现如下报错 time2025-04-01T06:43:18.266Z levelERROR sourcetextfile.go:248 msg"failed to collect textfile data" collectortextfile fileipmitool.prom err"fail…...
RapidJSON 处理 JSON(高性能 C++ 库)(四)
第四部分:RapidJSON 处理 JSON(高性能 C++ 库) 📢 快速掌握 JSON!文章 + 视频双管齐下 🚀 如果你觉得阅读文章太慢,或者更喜欢 边看边学 的方式,不妨直接观看我录制的 RapidJSON 课程视频!🎬 视频里会用更直观的方式讲解 RapidJSON 的核心概念、实战技巧,并配有…...
80. Linux内核定时器实验
一、Linux内核定时器原理 1.1、内核时间管理 1、Cortex-M内核使用systick作为系统定时器。 2、硬件定时器、软件定时器,原理是依靠系统定时器来驱动。 3、linux内核频率可以配置,图形化界面配置。 4、重点,HZ表示系统节拍率, 1.…...
Java 可变参数全解析:动态参数传递的实践指南
Java 可变参数全解析:动态参数传递的实践指南 一、可变参数:Java 方法的灵活扩展 在狂神说 Java 第 49 集课程中,我们系统学习了 Java 可变参数的核心原理。作为 Java SE 5 引入的重要特性,可变参数允许方法接受动态数量的输入&…...
C++类与对象(上):从入门到实践
目录 一、引言 二、面向过程和面向对象初步认识 2.1 面向过程编程 2.2 面向对象编程 三、类的引入 四、类的定义 4.1 定义格式 4.2 定义方式 4.3 成员变量命名规则建议 五、类的访问限定符及封装 5.1 访问限定符 5.2 封装 六、类的作用域 七、类的实例化 7.1 概念…...
Lumerical ------ Edge coupler design
Lumerical ------ Edge coupler design 引言正文无 Si Substrate 的仿真步骤有 Si Substrate 的仿真步骤引言 本文,我们将使用官方提供的 Edge coupler 设计教程,但是中间会带有作者本人的设计的感悟。 正文 无 Si Substrate 的仿真步骤 打开 Edge_Coupler_No_Substrate.l…...
大语言模型本质上还是自动化,而不是智能化
大语言模型本质上仍然是自动化或高级自动化,而非真正的智能化,原因可以从以下几个方面进行分析:1、自动化与智能化的本质区别自动化:大语言模型通过预训练和微调,基于大量数据和规则生成输出。它的行为是基于输入数据的…...
cmake 中的命令
命令描述示例capabilities报告 CMake 内置的功能,以 JSON 格式输出cmake -E capabilitiescat连接文件并将其内容打印到标准输出cmake -E cat file1.txt file2.txtchdir在指定目录中运行命令cmake -E chdir /path/to/dir commandcompare_files比较两个文件是否相同cm…...
python数据结构——链表、栈、队列
一、思维梳理: 二、双向循环链表: class Node:def __init__(self,data):self.data dataself.next Noneself.prev Noneclass DoubleLink:def __init__(self):self.size 0self.head Nonedef is_empty(self):return self.size 0def add_end(self,dat…...
centos操作系统如何更换yum镜像源
CentOS Linux 是一个免费提供的、社区支持的Linux发行版,由CentOS项目社区贡献者开发、分发和维护。2020年CentOS项目宣布将把全部投资转移到CentOS Stream,作为即将发布的 Red Hat Enterprise Linux版本的上游开发平台。因此,CentOS Linux更新和发布将在2021年至2024年期间…...
【Linux篇】自主Shell命令行解释器
📌 个人主页: 孙同学_ 🔧 文章专栏:Liunx 💡 关注我,分享经验,助你少走弯路! 文章目录 1. 获取用户名的接口2. 等待用户输入接口3. 将上述代码进行面向对象式的封装4. 命令行解析5.…...
Tomcat 部署 Jenkins.war 详细教程(含常见问题解决)
在Tomcat中部署Jenkins.war文件是一个相对简单的过程,以下是详细步骤: 1. 准备工作 确保已安装JDK:Jenkins需要Java环境,建议安装JDK 8或更高版本。 下载Jenkins.war:https://pan.quark.cn/s/c4fd7711a1b3 下载Tomc…...
我的创作纪念日-一周年
目录 机缘 收获 日常 成就 憧憬 机缘 时光荏苒,转行计算机已经是第5个年头了。从Python入门,到C入土,兜兜转转,发现自己也只是初窥门径,习得皮毛。我从6年前开始潜水CSDN,学习各路大佬的技术经验&…...
多线程代码案例 - 1
目录 单例模式 1. 饿汉模式 2. 懒汉模式 单例模式与多线程 问题1 问题2 问题3 完! 单例模式 单例模式是一种设计模式。 设计模式,是我们在编写代码时候的一种软性的规定,也就是说,我们遵守设计模式,代码的下限…...
display:none与visibility的区别
1. 是否占据空间 display: none:元素完全从文档流中移除,不占据任何布局空间。后续元素会“填补”它的位置。visibility:hidden:元素仍占据布局空间,但内容不可见(类似透明占位符)。 2.渲染与性能 displ…...
算法 | 基于蜣螂优化算法求解带时间窗的车辆路径问题(VRPTW)研究(附matlab代码)
基于蜣螂优化算法求解带时间窗的车辆路径问题(VRPTW)研究 🍏🍏🍏🍏🍏🍏🍏🍏🍏🍏🍏🍏🍏🍏🍏 摘要 带时间窗的车辆路径问题(VRPTW)是物流配送中的核心优化难题。本文提出一种基于蜣螂优化算法(Dung Beetle Optimizer, DBO)的求解方法,通过…...
开发体育赛事直播系统主播认证功能技术实现方案
该体育直播系统系统由东莞梦幻网络科技开发,使用 ThinkPHP 作为后端,Vue.js 作为 PC/H5 端框架,Java 和 Objective-C 分别用于安卓和 iOS 开发。 1、前端实现 (Vue.js) <template><div class"anchor-certification">…...
