STM32单片机入门学习——第3-4节: [2-1、2]软件安装和新建工程

news2025/4/3 6:54:32

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做!

本文写于: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 header



int main(void)
{
	RCC->APB2ENR=0x00000004;	//使能GPIOA
	GPIOA->CRL=0x00000003;		//调试GPIOA0
	GPIOA->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 header

int 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);						//整体配置GPIO
	
	GPIO_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函数。
注意最后一行要是空行,不然会警告。
最后实现了点灯。
我是使用的串口下载,要这样选择同事下载前按一下复位按钮。

在这里插入图片描述

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

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

相关文章

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模型的局限性:状态覆盖导致审计困难、无法追溯历史。分布式系统复杂性的提升:微服务架构下数据一致性、回滚与调试的需求激增。监管合规性要求:金融、医疗等领域对数…

【力扣hot100题】(035)二叉树的中序遍历

正常方法递归很简单,于是又学了一种栈的方法。 原理如下:每次循环先尽量将目前节点入栈并左移,没有左节点时回到栈首节点将目前节点放入结果容器中并移出栈外,目前节点变为该节点的右节点,循环结束条件是目前节点为nu…

《数字图像处理》教材寻找合作者

Rafael Gonzalez和Richard Woods所著的《数字图像处理》关于滤波器的部分几乎全错,完全从零开始写,困难重重。关于他的问题已经描述在《数字图像处理(面向新工科的电工电子信息基础课程系列教材)》。 现寻找能够共同讨论、切磋、…

批量删除 txt/html/json/xml/csv 等文本文件中的重复行

在文本文件中,可能会存在一些重复的数据行,这可能不是我们期望的,因此我们会碰到需要删除文本文件中重复行的情况。如果是人工删除,当文件较大或者数量较多的时候,处理的难度会较大。今天就给大家介绍一下批量删除文本…

基于微信小程序的智慧乡村旅游服务平台【附源码】

基于微信小程序的智慧乡村旅游服务平台(源码L文说明文档) 目录 4系统设计 4.1系统功能设计 4.2系统结构 4.3.数据库设计 4.3.1数据库实体 4.3.2数据库设计表 5系统详细实现 5.1 管理员模块的实现 5.1.1旅游景点管理…

80. Linux内核定时器实验

一、Linux内核定时器原理 1.1、内核时间管理 1、Cortex-M内核使用systick作为系统定时器。 2、硬件定时器、软件定时器,原理是依靠系统定时器来驱动。 3、linux内核频率可以配置,图形化界面配置。 4、重点,HZ表示系统节拍率, 1.…

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、自动化与智能化的本质区别自动化:大语言模型通过预训练和微调,基于大量数据和规则生成输出。它的行为是基于输入数据的…

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.…

我的创作纪念日-一周年

目录 机缘 收获 日常 成就 憧憬 机缘 时光荏苒,转行计算机已经是第5个年头了。从Python入门,到C入土,兜兜转转,发现自己也只是初窥门径,习得皮毛。我从6年前开始潜水CSDN,学习各路大佬的技术经验&…

多线程代码案例 - 1

目录 单例模式 1. 饿汉模式 2. 懒汉模式 单例模式与多线程 问题1 问题2 问题3 完! 单例模式 单例模式是一种设计模式。 设计模式,是我们在编写代码时候的一种软性的规定,也就是说,我们遵守设计模式,代码的下限…

开发体育赛事直播系统主播认证功能技术实现方案

该体育直播系统系统由东莞梦幻网络科技开发&#xff0c;使用 ThinkPHP 作为后端&#xff0c;Vue.js 作为 PC/H5 端框架&#xff0c;Java 和 Objective-C 分别用于安卓和 iOS 开发。 1、前端实现 (Vue.js) <template><div class"anchor-certification">…

国产三维CAD「皇冠CAD」在汽车零部件领域建模教程:刹车片

本教程深度融合三维皇冠CAD&#xff08;CrownCAD&#xff09;的MBD&#xff08;Model-Based Definition&#xff09;设计理念&#xff0c;通过参数化建模、智能约束管理、动态装配验证等功能&#xff0c;实现数据驱动设计&#xff0c;精准解决了汽车制动系统中精密制动组件的设…

SpringMvc获取请求数据

基本参数 RequestMapping("save5") ResponseBody public User save5(String name, int age) {User user new User();user.setName(name);user.setAge(age);return user; } 在url中将name与age进行编写&#xff0c;通过框架可以提取url中的name与age&#xff0c;这…

大语言模型开发框架——LangChain

什么是LangChain LangChain是一个开发由语言模型驱动的应用程序的框架&#xff0c;它提供了一套工具、组件和接口&#xff0c;可以简化构建高级语言模型应用程序的过程。利用LangChain可以使应用程序具备两个能力&#xff1a; 上下文感知 将语言模型与上下文&#xff08;提示…