❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。
☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋。
🌙专栏目标:实现从零基础入门51单片机和STM32单片机,力求在玩好单片机的同时,能够了解一些计算机的基本概念,了解电路及其元器件的基本理论等。⭐️ 专栏主要内容: 主要学习STM32单片机的功能、各个模块、单片机的外设、驱动等,最终玩好单片机和单片机的外设,全程手敲代码,实现我们所要实现的功能。
🌴 专栏说明 :如果文章知识点有错误的地方,欢迎大家随时在文章下面评论,我会第一时间改正。让我们一起学习,一起进步。
💑专栏主页:http://t.csdn.cn/HCD8v
本学习过程参考:https://space.bilibili.com/383400717
STM3单片机安装软件、各种资料以及源码的路径:
链接:https://pan.baidu.com/s/1snD0uuTfMhchFqOMWvAiHA?pwd=asdf#list/path=%2F
提取码:asdf
链接里压缩包的解压密码:32
本节主要对STM32环境搭建过程进行简单介绍,其中包括软件安装和新建工程两部分;其中软件安装包括安装Keil5 MDK、安装器件支持包、软件注册、安装STLINK驱动、安装USB转串口驱动等;新建工程部分包括STM32开发方式简介以及新建标准库工程等。
文章目录
- 一、软件安装
- 1.1 安装Keil5 MDK
- 1.2 安装器件支持包
- 1.2.1 离线安装
- 1.2.2 在线安装
- 1.3 软件注册
- 1.4 安装STLINK驱动
- 1.5 安装USB转串口驱动
- 二、新建工程
- 2.1 STM32开发方式简介
- 2.2 新建标准库工程
- 2.2.1 新建工程
- 2.2.2 添加启动文件
- 2.2.2.1 添加启动文件
- 2.2.2.2 添加寄存器描述文件
- 2.2.2.3 添加内核寄存器描述文件
- 2.2.2.4 以上文件添加到工程
- 2.2.2.5 在工程中添加头文件路径
- 2.2.3 新工程测试
- 2.2.4 配置寄存器实现点灯
- 2.2.5 使用库函数实现点灯
- 2.2.6 补充:库函数中的启动文件选择
- 2.2.7 总结:新建工程的步骤
一、软件安装
软件的下载链接:
STM3单片机安装软件、各种资料以及源码的路径:
链接:https://pan.baidu.com/s/1snD0uuTfMhchFqOMWvAiHA?pwd=asdf#list/path=%2F
提取码:asdf
链接里压缩包的解压密码:32
1.1 安装Keil5 MDK
解压 资料/Keil5 MDK.zip
,解压之后,双击MDK524.EXE文件,开始安装软件,选Next->勾选同意许可协议->Next->选择安装目录(如果不想放在C盘,也可以在创建英文目录,记得创建文件夹时起英文名字)->Next->填写个人信息(随便填)->Next
,等待安装即可;
安装过程中会让选择是否安装ULINK驱动,选择是就行:
可以将Show Release Notes 取消勾选:
最后点击Finish,接下来就会自动弹出一个Pack Installer的窗口,这个窗口就是用来安装器件支持包的,我们先把它叉掉,后面再讲:
1.2 安装器件支持包
首先来介绍一下为什么需要要安装器件支持包,这个支持包是Keil5才需要安装的,想Keil4和之前的老版本,是不需要安装的;这是因为现在的ARM芯片型号是非常多的,升级换代速度也快;新型号的芯片也是不断地推出来,那Keil软件总不能出一款芯片就升级一下软件吧,而且同时支持所有型号的芯片,这个占用内存也是非常大的,所以Keil5之后,芯片的器件支持包就被独立出来了;我们开发哪种芯片,就安装对应的支持包就行;如果你不安装支持包,那在新建工程时,是不会出现相应的器件型号的;
安装器件支持包有两种安装方式,一种是离线安装,一种是在线安装;
1.2.1 离线安装
首先介绍一下离线安装:
打开Keil5 MDK的安装包文件夹,打开支持包文件夹:
在这里已经提前准备了常见的支持包,我们本课程使用的是STM32F1系列, 我们就需要选择这个Keil.STM32F1xx_DFP
的文件,双击打开,这里的目标路径会自动选择我们安装时的那个目录:
直接点击Next即可,等待一小会儿即可安装完成;安装完成点击Finish即可。此时再打开Keil5软件,新建工程:
可以发现这里就出现了STM32F1的器件列表,展开之后我们可以选择F103,然后F103C8,这样就可以新建工程了;
到这里,我们离线安装器件支持包的方式就介绍完了;
1.2.2 在线安装
在线安装是离线安装的扩展部分,主要是为了防止以后开发其他芯片找不到型号;大概了解一下即可;
因为在1.2.1的安装包里,只提供了部分的器件支持包,所以如果以后想开发其他芯片,比如STM32F2的系列或者其他公司的ARM芯片,那到时候找不到器件支持包不就尴尬了嘛,,,这个时候就可以用上在线安装了。
打开keil5软件,点击下面的绿色按钮:
弹出来的就是我们之前叉掉的那个Pack Installer界面:
那这个就可以用来安装支持包,并且所有可以用keil软件来开发的芯片都可以找到,使用还是非常方便的,就是网速比较慢哈;
注意,在这个页面一定要联网;
然后进来之后它就会自动在Keil官网上获取最新的器件列表了;左下角提示的就是正在获取的东西,右边有进度条显示进度;
这个网速还是挺慢的,大家得多等一会儿;
如果你点进来没有自动获取的话,可以点一下这个更新按钮,这样就可以获取最新列表了:
点击刷新后,经过漫长的等待,这个器件列表总算是加载完了哈:
可以看到,这里有很多公司的名称,里面包含了Keil支持的所有ARM芯片,其中这个GigaDevice公司下,就有目前做的还不错的国产兼容STM32的芯片,叫GD32,里面有这个叫GD32F103C8的型号,基本和STM32F103C8T6的芯片一样;
还有下面这个MindMotion公司,里面也有MM32F103C8T,也是可以兼容STM32F103C8T6的国产芯片:
现在STM32涨价比较厉害,所以国产这些芯片也取得了一定的发展;大家可以了解一下;
接着往下划,下面这个STMicroelectronics里面就有STM32了,里面包含了现在STM32的所有型号,其中就有我们刚才安装的STM32F1系列:
那比如我们以后想要开发STM32F2的系列,我们就可以选择这个STM32F2;因为刚刚在离线安装中我们已经安装好了STM32F1,所以此次我们是拿STM32F2来演示在线下载:
在右边找到这个后缀是DFP的文件,然后点击Install,安装即可:
那接下来,它就会自动在Keil的官网下载DFP文件,然后自动帮我们安装上;
当然也可以用浏览器到这个网站上下载,下载之后,就和离线安装的方式是一样的了:
现在又是需要一段漫长的时间来下载哈,等提示完成后即可叉掉这个窗口了,叉掉后,会出来一个弹窗,如下所示,提示软件的支持包已经更改,是否要重新加载支持包,选择是就行:
然后再新建工程,就可以看到有STM32F2系列的芯片了:
这就是在线安装的整个过程了,有个印象就行;
1.3 软件注册
这个Keil软件是一个付费软件,如果不注册的话,功能上会有很大限制的,如果我们个人用户学习的话,使用盗版问题也不大,但是企业用户就必须得用正版了。
首先我们先关闭软件, 然后再Keil5图标上右键,选择以管理员身份运行(这里需要注意,必须是右键->以管理员身份运行)然后点击File->LicenseManagement
,把这个CID复制下来:
然后打开安装包,将Keygen的压缩包解压:
打开解压后的文件夹,可以看到这个注册机(如果解压后看不到该文件,可能是被杀毒软件杀掉了,那就需要将杀毒软件关掉再重新解压),双击打开:
然后将刚刚复制的CID码复制进来,右边的Target选择ARM,点击Generate,
最后将生成的序列码复制下来,就可以退出这个软件了,
最后回到Keil5软件,将刚刚生成的序列码粘贴到LIC位置,点击Add LIC即可,如下图所示:
提示LIC添加成功,并且上面的MDK-ARM这一行的使用期限显示2032年,就表示软件注册完成了。
1.4 安装STLINK驱动
首先,我们需要将STLINK插到电脑上,
然后在 此电脑->右键->设备管理器
,打开设备管理器的窗口,在其他设备里面可以看到这个STLINK是在其他设备的列表上,并且图标带了个感叹号,说明我们的电脑上目前是没有安装STLINK驱动的; 如下图所示
如果插上STLINK,在这个列表里找一下,能找到STLINK的设备且没有感叹号,那说明你的电脑已经装过STLINK的驱动了,就不需要进行这一步了。
如果没有安装STLINK驱动,我们则需要安装一下:
这个驱动程序Keil软件自带的就有,我们可以打开Keil5的安装目录,在ARM->STLink->USBDriver
里面,找到amd64.exe就是64位的,X86是32位的:
我的电脑是64位的,那么双击这个64,然后一直Next即可。安装完成后,可以发现没有感叹号了:
另外这个目录下,还有JLINK的驱动,JLINK也是一种常用的调试器,如果你想安装JLINK驱动的话可以打开这里的Segger文件夹,
这里面就可以安装JLINK的驱动了。
1.5 安装USB转串口驱动
同样我们先把USB串口模块插在电脑上,这个USB转串口的芯片是CH340,和之前51开发板上的一样,如果之前学过51,那么大概率已经装过该驱动了。
如果这里有感叹号,就需要装一下驱动,如果能正常识别,就不需要装了。
CH340的驱动在资料文件夹里,打开工具软件,打开USB转串口CH340驱动,双击以下EXE程序:
点击安装
出现驱动安装成功就ok了;
设备管理器里感叹号也消失了。
二、新建工程
本小节我们来建立一个STM32的工程,STM32的工程结构还是比较复杂的,需要用到很多文件,之后我们的代码也都是需要建立在工程结构上的,所以在开始学习后续内容之前,我们先来学习以下如何新建STM32的工程;
2.1 STM32开发方式简介
目前STM32的开发方式主要有基于寄存器的方式
、基于标准库也就是库函数的方式
和基于HAL库的方式
;
- 基于
寄存器
的方式和我们51单片机的开发方式一样,是用程序直接配置寄存器,来达到我们想要的功能;这种方式最底层、最直接、效率会更高一些;但是由于STM32的结构复杂、寄存器太多,所以基于寄存器的方式目前是不推荐的; - 基于
库函数
的方式是使用ST官方提供的封装好的函数,通过调用这些函数来间接的配置寄存器,由于ST对寄存器封装的比较好,所以这种方式既能满足对寄存器的配置,对开发人员也比较友好,有利于提高开发效率,我们本课程使用的就是库函数的开发方式; - 最后一个基于
HAL库
的方式可以利用图像化界面快速配置STM32,这个比较适合快速上手STM32的情况,但是这种方式隐藏了底层逻辑,如果你对STM32不熟悉,基本只能停留在很浅的水平,所以目前不推荐HAL库。
既然我们要使用库函数的方式,我们需要准备一个STM32库函数的压缩包,大家可以在百度云链接提供的资料里找到固件库的文件,如下图所示:
可以看到STM32F10x标准外设库的这个压缩包,解压后就可以看到库函数的文件夹目录了,
- _htmresc文件夹里放的是图片,没啥用
- Libraries文件夹里放的是库函数的文件了,我们之后建工程时会用到
- Project时官方提供的工程示例和模板,以后使用库函数的时候可以参考一下;
- Utilities是STM32官方评估板的相关例程,这个评估板就是官方用STM32做的一个小电路板,用来测评STM32的;这个文件夹里面存的就是这个小电路板的测评程序;
- 接下来后面的两个文件,一个是库函数的发布文档,一个是使用手册;发布文档里有一些版本的说明,使用手册里有教怎么使用这些库函数的;
2.2 新建标准库工程
2.2.1 新建工程
接下来我们就正式开始新建一个基于标准库的工程,首先我们需要建立一个存放工程的文件夹,为了方便,我就在桌面新建该文件夹了,起个名字叫STM32Project,以后我们的工程都存在这个文件夹下,这样比较方便管理;
接着打开Keil5软件,点击Project->New uVision Project
然后选择我们刚才新建的文件夹(桌面上的STM32Project),在里面再新建一个文件夹,用来存放本次的工程,如下图:
起个名字,就叫2-1 STM32工程模板,
然后点进去,接下来给工程文件起个名字,在这里我们可以起一个通用一点的名字,这个工程是干啥的我们可以在文件夹名称说明,文件夹的名称是方便改的,但是工程的名称以后不太方便改,所以我们就七个Project的名称,然后点击保存:
接下来选择器件型号,我们的芯片型号是STM32F103C8T6,所以这里选择STM32F103C8这个,
点击ok后,会弹出keil软件的一个新建工程小助手,这个小助手可以帮助我们快速新建工程,我们暂时不用这个小助手,可以直接把它叉掉:
接下来工程就已经建好了,但是这里的工程文件是空空如也,
2.2.2 添加启动文件
2.2.2.1 添加启动文件
现在这个工程还是不能直接用的,我们需要给他添加一个工程的必要文件,那我们打开我们的固件库文件夹,路径如下图:
打开Libraries->CMSIS->CM3->DeviceSupport->ST->STM32F10x->startup->arm
,
这些就是STM32的启动文件
,STM32的程序就是从启动文件
开始执行的;我们把这些文件复制下来,然后回到工程模板文件夹里,可以看到我们刚刚新建工程后自动生成的文件:
在这里新建一个文件夹Start用来存放启动文件,将刚刚复制的启动文件复制到Start文件夹里:
2.2.2.2 添加寄存器描述文件
然后将资料库里的以下三个文件也复制到Start里面:
其中stm32f10x.h是STM32的外设寄存器描述文件,作用类似于51单片机的头文件REGX52.H,是用来描述STM32有哪些寄存器和它对应的地址的;
下面的两个system文件是用来配置时钟的, STM32主频是72MHz,就是system文件里的函数配置的;
这三个文件也都复制到Start下面;
2.2.2.3 添加内核寄存器描述文件
打开以上路径,将两个core文件复制到Start文件夹下;
这两个cm3(Cortex-M3)文件就是内核的寄存器描述;当然他还带了一些内核的配置函数,所以多了个.c文件。
到此为止,我们工程的必要文件就复制完成了,最终Start文件夹下包含的所有文件如下所示:
2.2.2.4 以上文件添加到工程
再回到keil软件,把我们刚刚复制的那些文件添加到工程里来,先选中Source Group 1,然后单击一下,把这个组改一下名字,也叫Start
然后右键,选择添加已经存在的文件夹到组里来
打开Start文件夹把下面这个文件过滤器选择All files,
然后将startup_stm32f10x_md.s
、以及所有的.c
和.h
文件都添加进来(至于为什么这么多启动文件单单只添加md.s,这个后面再讲),选好后,点击Add;然后Start文件夹里面的文件就添加好了,如下图所示:
这里的文件都是STM32里最基本的文件,是不需要我们修改的,我们添加进来即可。且我们可以看到这些文件图标上带了个小钥匙,表示他们是只读的文件;
2.2.2.5 在工程中添加头文件路径
最后我们还需要在工程选项里添加上这个文件夹的头文件路径,否则软件是找不到.h
文件的;
点击魔术棒按钮,打开工程选项,在C/C++里,找到Include Paths栏,然后点击右边三个点的按钮,
在这里点新建路径,
然后再点三个点的路径,把Start的路径添加进来:
点击OK,这样就把这个文件夹的头文件路径添加进来了;
2.2.3 新工程测试
接下来我们新建一个main函数测试一下这个工程是否可行;
打开工程文件夹,新建一个User文件夹:
我们的main函数就放在这个文件夹里,然后再keil里,在Target 1这里点击右键,点击添加组:
然后将名字改为User:
然后再User上右键,点击添加新文件,
选择C文件,名字叫main:
下面的路径注意一下,要选择User文件夹,要不然默认是放在文件夹外面的:
然后点击Add,这样我们就有了main.c文件了:
在main.c里,我们先右键插入头文件,选择stm32f10x.h
:
然后写一个main函数,并写入测试代码,然后点击build:
可以看到结果为编译通过,0警告0错误,则证明工程建立成功了:
这里需要注意,文件的最后一行必须要空一行,否则会报警告。
这个工程目前还没有添加STM32的库函数,所以它还是一个基于寄存器开发的工程,如果你想用寄存器开发STM32,那工程建到这里就可以了。
2.2.4 配置寄存器实现点灯
下面演示一下通过配置寄存器来完成点灯操作,当然直接操作寄存器不是本节的重点,了解一下即可。
首先拿出STM32的最小系统板、STLINK和四根母对母的杜邦线, 按照插针边上的标识,把3.3V、SWDIO、SWCLK、GND对应连接好:
连接好之后如下图所示:
然后把STLINK插在电脑上
插上电之后,板子上的电源灯应该会常亮,另一个谅解在PC13口上的灯默认应该是闪烁状态,这是芯片里的一个测试程序;
然后我们再在Keil里面配置一下调试器:点击魔术棒按钮->选择DEBUG->,这个调试器默认是ULINK,改成ST-Link Debugger
然后再点击上图3旁边的Settings按钮,在Flash Download里,把Reset and Run这一项勾上:
勾上这一项的目的是,我们下载程序后会立马复位并执行,这样方便一些;否则每次下载之后还要按一下板子上的复位按键才能执行程序;配置好之后点击确认即可。
然后将以下代码写进main.c里:
然后编译并下载,
现象是灯就会灭:
如果将代码改为以下:
灯就会被亮:
这就是通过寄存器控制LED灯,通过寄存器配置LED灯要一直查手册,来了解每一个寄存器的每一位是干啥的, 才能成功点亮。
2.2.5 使用库函数实现点灯
新建一个文件夹叫Library,用来存放库函数,
接着打开固件库的文件夹,打开Libraries->STM32标准外设驱动->src
:如下图
这些就是库函数的源文件,这个misc.c
是内核的库函数,其他的就是内核外的外设库函数了;这个misc就是混杂的意思;按ctrl+A全选,然后复制,在Library下粘贴,如下图所示:
然后再打开固件库的inc
文件夹:
这些是库函数的头文件,继续全选并复制,同样在Library文件夹下粘贴:
然后回到Keil软件,同样在Target1处右键,添加组,
改个名字叫Library:
再右键,添加已经存在的文件,打开Library,ctrl+A,Add:
这样就把所有的库函数文件都添加进来了;但是对于这个库函数来说,现在还不能直接使用,需要再添加一个文件:打开固件库的文件夹(路径为固件库\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template
),找到如下三个文件:
其中stm32f10x_conf.h
是用来配置库函数头文件的包含关系的,另外这里面还有个用来参数检查的函数定义,这是所有库函数都需要的;两个it结尾的文件是用来存放中断函数的;
把这三个文件复制下来,粘贴进工程的User目录下:
接着回到Keil软件, 在User组里,把刚发财那三个文件添加进来:
因为在头文件中定义了如下代码:
所以我们需要对USE_STDPERIPH_DRIVER宏进行定义,才能包含到stm32f10x_conf.h头文件:
添加该宏的步骤如下:
这样我们基于库函数的工程就建好了;我们可以看一下,这个Library里面的库函数也都带了钥匙,说明只读;
此时编译一下,结果如下:
0错误0警告,所以我们的工程建立是成功的。
然后我们用库函数实现点灯的操作,代码如下:
#include "stm32f10x.h" // Device header
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
// GPIO_SetBits(GPIOC, GPIO_Pin_13);
GPIO_ResetBits(GPIOC, GPIO_Pin_13);
while (1)
{
}
}
代码解释:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
表示配置GPIOC的外设时钟;
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
先定义一个GPIO_InitTypeDef 结构体,然后对其进行赋值,最后调用GPIO_Init函数,来配置GPIO模式;
最后设置端口的高低电平来进行点灯:
GPIP_SetBIts
这个函数可以把指定端口设置为高电平,GPIO_SetBits(GPIOC, GPIO_Pin_13)
代码的意思是将PC13号口设置为高电平;
GPIO_ResetBits
这个函数可以将指定端口设置为低电平,GPIO_ResetBits(GPIOC, GPIO_Pin_13);
代码的意思是将PC13号口设置为低电平;
以上代码的现象(注释掉了PC13号口的低电平,使用的是低电平),所以灯会亮:
2.2.6 补充:库函数中的启动文件选择
在第2.2.2.4 节中,添加启动文件时,我们选择了md.s结尾的启动文件,
为什么选择这个而不选择添加其他的呢?
先看一下下面的表:
我们使用的STM32F103系列C8T6,其Flash大小是64K,按照表中的对应关系,需要选择MD的启动文件。
2.2.7 总结:新建工程的步骤
工程架构: