• 在学习STM32之前建议学习51单片机打基础,不学也没关系

  • 建议先下载软件Keil5 MDK,如果是在百度网盘下载的话很慢

学习工具

STM32

初学者建议选用stm32f10103c8t6

传感器

  • 光敏电阻

  • 热敏电阻

  • 对射式红外模块

  • 反射式红外模块

  • W25Q64 Flash存储模块

  • MPU6050陀螺仪和加速度计

  • 旋转编码器

面包板

面包板用来固定单片机

OLED

0.96寸的OLED显示屏幕

LED按键

蜂鸣器

杜邦线

万用表

示波器

  • 有条件可以买实验室使用的示波器

  • 条件稍微差点可以买虚拟示波器

SG90舵机

镊子、剪刀

直流电机和TB6612电机驱动模块

软件

Keil5 MDK:ARM系列的单片机编程

Keil5 C51:51系列单片机编程

安装Keil5 MDK

安装器件支持包

软件注册

安装STLINK驱动

安装USB转串口驱动

Keil5软件设置

设置字体大小

image-20240514210740983

image-20240514210804143

修改编码格式和缩进大小

  • 修改为UTF-8格式防止中文乱码

image-20240514210913798

  • 修改缩进大小

image-20240514211019866

建立工程

  • STM32的开发方式主要有:
    • 基于寄存器的方式:使用程序直接配置寄存器
    • 基于标准库的方式:使用ST官方提供封装好的函数,通过调用函数间接配置寄存器(本次STM32学习的主要内容)
    • 基于HAL库的方式:使用图形化界面快速配置STM32

固件库

  • 在该目录下有一个STM32的固件库

image-20240514195914662

  • 解压后,点击文件夹

image-20240514195958383

  • 该文件夹下的Libraries的文件夹,里面就是库函数文件,之后建立工程的时候会用到

  • Project是官方提供的工程示例和模板,以后使用库函数的时候可以参考一下

  • Utilities是STM32官方评估板的相关流程,评估板是官方用STM32做的一个小电路板,用来测评STM32

  • 最后俩个文件,一个是库函数的发布文档,另一个是使用手册

    • 发布文档有一些版本说明
    • 使用手册用教怎么使用库函数

基于标准库的工程

  • 建立存放工程的文件夹

image-20240514202438106

  • 接着打开Keil 5软件,点击创建一个新项目

image-20240514202558338

  • 然后将项目起一个名字保存在前面创建好的文件夹下,项目名称统一用project

image-20240514202739479

image-20240514202835293

  • 然后选择器件型号,注意STM32F103C8的下面有一个STM32F103CB这两者要区分开来,然后点击OK即可

image-20240514203012410

  • 接下来会弹出新建工程小助手,但是暂时用不到,所以就把这个页面关了

image-20240514203155926

  • 然后就会看到如下图所示,但是目前还不能使用,还要配置一些必要的文件

image-20240514203418350

  • 打开文件夹,这个文件夹下就是STM32的启动文件,STM32就是从启动文件开始执行的

image-20240514203615424

  • 将这些文件复制下来,回到项目文件中,然后新建一个名为start的文件夹,将启动文件复制到该文件夹里面

image-20240514203947543

  • 然后回到该文件夹下,然后会看到
    • stm32f10x.h:stm32的外设寄存器描述文件与51单片机的头文件一样,用来描述STM32有哪些寄存器和它对应的地址的
    • system_stm32f10x.c:主要用来配置时钟
    • system_stm32f10x.h:主要用来配置时钟
    • STM32主频72MHz,是system文件里面函数配置的

image-20240514204408896

  • 将这三个文件复制到Start文件夹下

image-20240514204509685

  • 接下来添加内核寄存器的描述文件,打开该文件夹,该文件夹下的这俩个文件就是内核的寄存器描述,还带了一些内核配置函数,这俩个文件也粘贴到Start文件下。工程的必要文件就复制完成了

image-20240514204606076

  • 回到Keil 5,将先前复制的文件添加到工程里面去

  • 修改文件名为Start

  • 点击右键,然后点击红框所示

image-20240514204929750

  • 然后添加md.s启动文件,启动文件只能添加1个,这里添加的启动文件是之后要使用的
  • 然后将剩下的.c.h文件都添加进来

image-20240514205142401

  • 最后在工程选项里面添加头文件路径

image-20240514205452537

image-20240514205514023

  • 检查配置文件是否可行
  • 在项目文件中新建一个User的文件夹,main函数就放到该文件夹下

image-20240514205807332

  • 然后如下操作

image-20240514205900352

  • 修改名字为User

image-20240514205939094

  • 点击添加新文件
  • 注意下面第二个图片中的文件路径,main函数不会默认在User文件夹下,会在该文件夹的外面

image-20240514210024588

image-20240514210059541

  • 然后插入头文件

image-20240514210219011

image-20240514210242035

  • 然后编写如下代码,注意最后一行必须是空行

image-20240514210331880

  • 编写完之后点击下图红色框按钮,编译并建立工程

image-20240514210417664

  • 零错误,零警告,说明我们建立的工程是没有问题的

image-20240514210457140

  • 配置到这里就可以进行直接对寄存器的操作了

STM32操作

  • 准备ST-Link、STM32的最小系统板和四根双母头的杜邦线
  • 按照插针边上的标识,把3.3V、SWDIO、SWCLK、GND对应连接好

配置调试器

  • 点击下图按钮

image-20240527095520412

  • 选择debug
  • 调试器默认的是ULINK2,现在要选择ST-Link

image-20240527095630401

  • 设置ST-Link设置好后,点击右边的Settings

image-20240527095758748

  • 在设置中,点击Flash Download,然后将Reset and Run勾选上
  • 这样下载程序之后会立马复位并执行
  • 配置好后点击确定,OK然后重新编译程序

image-20240527095941028

  • 然后点击将程序下载到STM32里面
  • 因为城程序里面什么都没有,所以这个灯就不会闪了

image-20240527100315219

点亮STM32第一灯

  • 需要配置3个寄存器,即可点灯
  • RCC里面的ABP2ENR
  • GPIOC里面的CRH
  • GOIOC里面的ODR
1
2
3
4
5
6
7
8
9
10
11
12
#include "stm32f10x.h"                  // Device header

int main(void)
{
RCC->APB2ENR = 0x00000010;
GPIOC->CRH = 0x00300000;
GPIOC->ODR = 0x00000000;
while(1)
{

}
}

添加库函数

  • 在项目文件中添加一个 Library的文件夹

image-20240527101146533

  • 打开固件库的文件夹
  • 其中misc是内核的库函数
  • 其他是内核外的外设库函数
  • 全选复制,在前面刚创建的Library文件夹下复制

image-20240527101308332

  • 再打开固件库里面的inc文件夹
  • 里面是库函数的头文件
  • 继续全选复制到Library文件夹下

image-20240527101531862

  • 然后回到keil软件
  • 在Target1里面Add Group

image-20240527101653425

  • 修改名字为 Library然后再按右键添加已经存在的文件

image-20240527101837998

  • Library文件夹下所以文件都添加进去

image-20240527102013963

  • 但是现在还不能使用这些库函数,还需要配置一个文件打开文件,会看到下图
  • stm32f10x_conf.h配置库函数头文件的包含关系,参数检查和函数定义,所有库函数都需要
  • stm32f10x_it.c 这两个it文件是用来存放中断函数
  • stm32f10x_it.h

image-20240527102341842

  • 将三个文件复制下来,粘贴到工程的User目录下

image-20240527102647305

  • 在Keil里面添加这三个文件

image-20240527102735052

image-20240527102759038

设置宏定义

  • 打开头文件

image-20240527102858134

  • 下滑到文件结尾,看到如图语句
  • 复制USE_STDPERIPH_DRIVER

image-20240527102943823

  • 打开工程选项
  • 在C/C++这边将复制的东西粘贴到Define里面

image-20240527103129073

  • 添加头文件路径,将创建在工程项目中的User和Library文件夹的路径添加到里面

image-20240527103334160

移动文件

  • 点击该红框按钮

image-20240527103529183

  • 将Library文件夹上移,使得Library和Start这两个不需要修改的内容的文件夹放在上面,User放在最下面

image-20240527103625306

编译

  • 点击下图红框按钮进行编译
  • 第一次编译可能会比较慢

image-20240527103658396

  • 编译完后如果出现0错误,0警告说明工程建立成功

image-20240527103813878

使用库函数点灯

  • 使用RCC_APB2PeriphClockCmd控制时钟

注意

  • 在启动文件里面有很多类型,具体选什么要根据芯片型号来选择

image-20240527104818779

  • 根据STM32中Flash和STM32的型号选择
  • 如果是STM32F100,选择带VL的启动文件,根据Flash大小选择LD、MD、HD文件
  • 如果使用STM32F101/102/103的型号,选择不带VL的,然后根据Flash大小选择LD、MD、HD还是XL
  • 如果使用STM32F105/107,直接选择CL的启动文件

image-20240527104831350