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 需要勾选,不然每次重新烧录程序还需要按复位按键

相关推荐
fie88892 天前
基于51单片机的航模遥控器6通道接收机程序
单片机·嵌入式硬件·51单片机
bu_shuo2 天前
嵌入式硬件工程师VS单板硬件工程师
嵌入式硬件·电子工程师·单板硬件
llilian_162 天前
选择北斗导航卫星信号模拟器注意事项总结 北斗导航卫星模拟器 北斗导航信号模拟器
功能测试·单片机·嵌入式硬件·测试工具·51单片机·硬件工程
Yyq130208696822 天前
MH2457,‌国产 32 位屏驱 MCU‌芯片,支持‌1080P 高清显示‌与‌以太网通信‌,广泛应用于两轮车仪表盘及工控屏等领域
单片机·嵌入式硬件
爱分享的阿Q2 天前
STM32现代化AI开发环境搭建:从Keil到VSCode+AI的范式转移
人工智能·vscode·stm32
爱吃程序猿的喵2 天前
南邮计科电工电子实验B《RLC串联谐振电路》实验报告
单片机·嵌入式硬件
独小乐2 天前
009.中断实践之实现按键测试|千篇笔记实现嵌入式全栈/裸机篇
linux·c语言·驱动开发·笔记·嵌入式硬件·arm
XINVRY-FPGA2 天前
XC7VX690T-2FFG1157I Xilinx AMD Virtex-7 FPGA
arm开发·人工智能·嵌入式硬件·深度学习·fpga开发·硬件工程·fpga
bubiyoushang8882 天前
利用STM32实现Modbus通信(RTU从机方案)
stm32·单片机·嵌入式硬件
cmpxr_2 天前
【单片机】常用设计模式
单片机·嵌入式硬件·设计模式