STM32 — 2.2 新建工程

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,不然会有中文乱码问题

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,在设置的宏定义中打开它

之后,头文件的路径不要忘记了,要把LibraryUser的路径都要放进去

新建工程里的启动文件选择

启动文件有很多类型,该选择哪一个要根据芯片型号来选择

下表是STM32F1系列的型号分类

根据flash的大小,分为小容量产品LD中容量产品LD大容量产品HD加大容量产品XL

STM32F100系列,ST把它叫超值系列,简写为VL(Value Line)

STM32F105和107,ST把它们较为互联型产品CL(Connectivity Line)

所以:

如果用的是STM32F001,就选择带VL的启动文件,再根据Flash的大小选择LDMD还是HD

如果用的是STM32F101/102/103的型号,就选择不带VL的,然后再根据FLASH的大小去选择

如果用的是STM32F105/107的型号,直接选择CL的启动文件即可

我们用的是STM32F103C8T6103所以选不带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 需要勾选,不然每次重新烧录程序还需要按复位按键

相关推荐
森利威尔电子-2 小时前
森利威尔SL3062替代 LM3485 60V降压恒压芯片
单片机·嵌入式硬件·集成电路·芯片·电源芯片
_Ningye2 小时前
STM32 — 3.1 GPIO输出
stm32·单片机·嵌入式硬件
学嵌入式的小杨同学3 小时前
STM32 进阶封神之路(十九):ADC 深度解析 —— 从模拟信号到数字转换(底层原理 + 寄存器配置)
c++·stm32·单片机·嵌入式硬件·mcu·架构·硬件架构
青桔柠薯片3 小时前
51单片机(STC89C52RC)学习总结:从裸机编程到外设驱动
嵌入式硬件·学习·51单片机
weiyvyy3 小时前
从开发视角看硬件接口:接口开发的本质与全景图
驱动开发·单片机·嵌入式硬件·硬件工程
老李的森林3 小时前
杂谈--如何与AI高效率的对话
人工智能·stm32·嵌入式硬件·机械
_Ningye4 小时前
STM32 —2.1 软件安装
stm32
weixin_462901975 小时前
esp32wifi的AP模式
单片机·嵌入式硬件
2501_918126915 小时前
学习所有6502写游戏动画的语句
汇编·嵌入式硬件·学习·程序人生·游戏