STM32开发方式
- 基于寄存器【不推荐,太复杂,寄存器太多】
- 基于标准库【本笔记使用】
- 基于HAL库【快速上手,隐藏了底层逻辑】
这里下面的固件库说明,指的是ST官方给出的对应的芯片型号标准库,也就是
STM32F10x_StdPeriph_Lib_V3.5.0这个文件
下面就是STM32F10x_StdPeriph_Lib_V3.5.0这个文件里面的东西

新建工程流程
新建一个文件夹,然后用keil新建一个工程,芯片选择STM32F103C8T6,工程名字就用Project
后面会跳出来一个界面,是keil软件的一个新建工程小助手,可以帮助我们快速新建工程,但是我们用不太到,所以先关闭

在固件库的:
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm
此路径下,为STM32的启动文件,STM32的程序的启动,就是从启动文件开始的

在新建的工程内,建立Start,将其放在里面,把上面的文件全部复制下来放进去
之后,让我们再回到下面的路径:
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x
此路径下有三个文件:

stm32f10x.h:STM32的外设寄存器描述文件【描述STM32有哪些寄存器和对应的地址的】system_stm32f10x.c:用于配置时钟,STM32主频72MHz,就是system文件里的函数配置的system_stm32f10x.h:和system_stm32f10x.c配合一起用于配置时钟
将这三个文件放入Start文件夹中
因为STM32是内核和内核外围的设备组成的,而且内核的寄存器描述和外围设备的描述文件不是在一起的,所以我们还需要添加一个内核寄存器的描述文件
接下来导入内核(Cortex-M3)的寄存器描述以及内核的配置函数
打开:\CMSIS\CM3\CoreSupport,将其内部文件导入

至此,Start文件夹内文件如下:

然后我们打开工程,新建一个Start文件夹,然后把上面文件夹内的文件全部导入
注意,启动文件只需要导入一个就行,即starup_stm32f10x_md.s

之后,工程文件内加入Start的文件路径,不然工程无法找到.h的文件

至此,基于寄存器开发的项目工程已经配置完毕了!配置工程演示:

- main函数需要int类型void返回,并且文件的最后一行需要是空行,不然会报Warning
- 编码推荐使用UTF-8,不然会有中文乱码问题
配置STLINK
1、在魔术棒工具里面选择STLINK

2、打开自动复位
三个箭头选择框的最后一个:RESET AND RUN

基于标准库函数的工程
在工程内建立Library文件夹
将下面路径:
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver
把此路径里面的src与inc文件全部放入Library文件夹,这些是STM32F10x的标准库函数
然后导入工程中Library文件夹里面去
这里的
misc.c【misc是混合的意思,内核的库函数怎么在外面呢?】是内核的库函数,其他的就是内核外的外设库函数

除此之外还不够,还需要导入一个文件,路径:
STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template
stm32f10x_conf.h:用来配置库函数头文件的包含关系,以及用于参数检查,为所有库函数都需要的stm32f10x_it.c/stm32f10x_it.h:用于存放中断函数
将这三个文件复制下来,放在User的路径中,然后导入工程
在stm32f10x.h文件中,有个标准库启动选项USE_STDPERIPH_DRIVER,在设置的宏定义中打开它
之后,头文件的路径不要忘记了,要把Library、User的路径都要放进去


新建工程里的启动文件选择
启动文件有很多类型,该选择哪一个要根据芯片型号来选择
下表是STM32F1系列的型号分类

根据flash的大小,分为小容量产品LD,中容量产品LD,大容量产品HD,加大容量产品XL
STM32F100系列,ST把它叫超值系列,简写为VL(Value Line)
STM32F105和107,ST把它们较为互联型产品,CL(Connectivity Line)
所以:
如果用的是STM32F001,就选择带VL的启动文件,再根据Flash的大小选择LD、MD还是HD
如果用的是STM32F101/102/103的型号,就选择不带VL的,然后再根据FLASH的大小去选择
如果用的是STM32F105/107的型号,直接选择CL的启动文件即可
我们用的是STM32F103C8T6,103所以选不带VL的,C8T6的Flash是64K,所以在这里选择MD的型号
工程架构详解

Startup_xx.s:为启动文件【我们用的是startup_stm32f10x_md.s】
此文件为程序执行最基本的文件,是用汇编写的。
启动文件内定义中断向量表,中断服务函数等等
中断服务函数中,有一个复位中断,这就是整个程序的入口,当STM32上电复位或者按下复位按键之后,程序就会进入复位中断函数执行
复位中断函数主要做两件事情:
- 调用
Systeminit函数 - 调用
main函数;
先调用SystemInit,然后调用main,之后程序结束,由于main函数一定会有一个while(1),所以实际上,程序永远也不会结束
可以看下面这个图,就是中断服务函数,上来先调用SystemInit,然后调用main

SystemInit函数定义:
这个函数在system_stm32f10x.c里面

主要就是:
- 设置微控制器的启动
- 初始化嵌入式闪存接口、锁相环、更新系统内核的时钟变量
- 等等...
Note中写的是这个函数仅在复位后需要调用
下面就是来配置了,不需要我们更改
只需要知道,在main函数之前,系统已经执行了一堆东西了,帮我们把闪存接口,时钟等一系列杂碎的东西都配置好了
且在启动文件里面还定义了STM32其他的所有中断,这些中断达到触发条件之后就会自动执行
STLINK的使用
STLINK有2根供电线,2根烧录线,连接方式如下:
| STLINK | MCU |
|---|---|
| 3.3V | 3.3 |
| GND | GND |
| SWCLK | DCLK |
| SWDIO | DIO |
注意,STLink设置:
这里的Reset and Run 需要勾选,不然每次重新烧录程序还需要按复位按键
