开发方式:

寄存器法、标准库法、HAL库法。
在这里我用标准库函数法,因为ST公司封装的标准库很好用。寄存器法顾名思义,直接操作寄存器,就像开发51单片机那样,费时费力,较难。

软件安装和安装芯片pack:

1. 软件安装:keil 5 MDK,arm单片机开发用。
keil5 MDK和keil5 C51版本可以共存,如果前面学C51安装了keil5 C51,直接安装到同一个文件夹即可。
2. 安装stm32f103c8t6芯片的pack。打开keil5,点工具栏中的pack instller(最后一个)
搜索stm32f1,右半侧选择“Keil::STM32F1xx_DFP”,点旁边的install。
注意,服务器在国外,国内下载可能要十多分钟甚至下载失败。
下载失败会显示一个链接(以.pack结尾),其实就是这个。直接复制到浏览器打开下载,然后双击打开安装即可。

新建project的前置操作——
下载标准外设库,standard peripheral文件并正确安装启动文件

1. 下载STM32F10x_StdPeriph_Lib_V3.6.0(标准库函数),网址 https://www.st.com/en/embedded-software/stsw-stm32054.html ,解压zip。
2. 找到.\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm目录,把里面全部.s文件(共8个文件)复制到一个空文件夹中(待用)。
3. 再找到.\Libraries\CMSIS\CM3\CoreSupport文件夹,把里面.h和.c文件(共2个文件)复制到一个刚才的那个文件夹中(待用)。
4. 再找到.\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x文件夹,把里面.h和.c文件(共3个文件)复制到一个刚才的那个文件夹中(待用)。
5. 接下来,为了后续所有新建project的便捷,刚才的文件夹命名为Start。
在以后所有新建项目后,把Start文件夹复制到项目根目录下。并且在keil软件,点击魔术棒,C/C++选项-> include paths添加/Start目录。

新建project:

1. 新建project同C51,弹出manage run-time environment(新建工程小助手)关闭即可。
2. 然后在keil5 mdk软件右侧“设计树”——Target1下新建Start。
添加上面步骤的Start目录的下列文件:
startup_stm32f10x_md.s
core_cm3.c
core_cm3.h
stm32f10x.h
system_stm32f10x.c
system stm32f10x.h”
其中startup_stm32f10x_md.s适用于flash用量64K-128K、型号STM32F101/102/103的单片机。具体见下表:
3. 在项目根目录新建文件夹/User添加你的main.c函数。

写点灯代码 —— 第一次编译就遇到的问题:

B站江科大stm32课--【2-2】新建工程-报错4个error解决方法:下载v5版本的arm编译器(我用的ARMCompiler_506_Windows_x86_b960可以)。
找到keil软件安装目录->arm目录中新建一个文件夹命名ARMCCV5COMPILER(只要安装文件夹目录在keil软件安装目录下即可)。
把v5编译器安装到该目录(另一个要选择的目录保持在c盘的appdata不变)。
最后打开keil,点魔术棒(options for target)->target选项卡->code generation选择刚刚安装的v5编译器,再次编译即可。

项目内 —— 包含标准外设库文件:

1. 打开上面下载的STM32F10x_StdPeriph_Lib_V3.6.0\Libraries\STM32F10x_StdPeriph_Driver\src文件夹和\inc文件夹。
其中misc.c(英语misc,miscellaneous:各种各样的; 五花八门的; 混杂的)为内核的库函数,其他都是外设的库函数,比如stm32f10x_i2c.c。
把src文件夹和inc文件夹里面的全部内容复制到项目文件夹中->新建/Library文件夹中。
打开keil,点击魔术棒(options for target),C/C++选项,C/C++选项-> include paths添加/Library目录。
2. 还没完!
在STM32F10x_StdPeriph_Lib_V3.6.0\Project\STM32F10x_StdPeriph_Template文件夹中,找到:
stm32f10x_conf.h —— conf代表configuration,是用于配置库函数头文件包含关系,还有参数检查的函数定义。
stm32f10x_it.c —— 两个it结尾文件,it代表interrupt,是用于存放中断函数的。
stm32f10x_it.h
把这三个文件复制到工程目录/User里面(做main.c函数同级别文件),并在keil软件中添加到“设计树”里。
打开keil,点击魔术棒(options for target...),C/C++选项,C/C++选项-> include paths添加/User目录。
3. 在main.c函数的 #include "stm32f10x.h" 处右键打开该文件,划到8341行(你的可能不一样,你可能下载的不是同一版本的),
看到 #ifndef USE_STDPERIPH_DRIVER那块。意思是你要定义了USE_STDPERIPH_DRIVER这个字符串,下面的#include "stm32f10x_conf.h" 才生效。
复制 USE_STDPERIPH_DRIVER ,打开keil,点击魔术棒,C/C++选项,在Preprocessor Symbols-Define栏目粘贴USE_STDPERIPH_DRIVER。
并在魔术棒(options for target),C/C++选项-> include paths添加/User目录,保存。

检查文件个数、检查include path、检查USE_STDPERIPH_DRIVER,并编译(首次稍微有点慢):

Library文件夹一共46个文件(23个.c,23个.h)
User文件夹一共4个文件(两个it结尾的.c.h,conf结尾的.h,还有main.c)
Start文件夹一共14个文件(上面在“启动文件”提到具体是什么)
main.c 只写个最简单的程序,比如return 0;
然后编译。

通过st-link烧录程序和debug:

魔术棒(options for target...),Debug选项,右侧栏目第一个use: 把选ulink改成st-link debuger那个选项。
再在右侧settings->flash download选项卡,勾上reset and run,这样以后在烧录程序后会自动复位运行。
(不勾选下载程序后要点板子上的复位按钮才能运行)。

忽略用stlink下载时提示的升级固件(山寨的stlink往往会提示这个),解决方法 https://blog.csdn.net/laoxue123456/article/details/125138310