STM32从零开始深入学习

STM32项目创建

  • 1.新建项目文件夹
    • [1.1 Drivers](#1.1 Drivers)
    • [1.2 Middlewares](#1.2 Middlewares)
    • [1.3 Output](#1.3 Output)
    • [1.4 Projects](#1.4 Projects)
    • [1.5 User](#1.5 User)
  • 2.新建项目工程
    • [2.1 项目新建](#2.1 项目新建)
    • [2.2 项目文件添加](#2.2 项目文件添加)
  • 3.魔术棒设置
    • [3.1 Target](#3.1 Target)
    • [3.2 Output](#3.2 Output)
    • [3.3 Listing](#3.3 Listing)
    • [3.4 C/C++](#3.4 C/C++)
    • [3.5 Debug](#3.5 Debug)
  • 4.下载调试
    • [4.1 主程序写入](#4.1 主程序写入)
    • [4.2 编译和下载烧录](#4.2 编译和下载烧录)

1.新建项目文件夹

新建一个项目名为test_project文件夹,然后在该文件夹下再分别新建Drivers、Middlewares、Output、Projects、User五个文件夹,效果如下图所示

大家在新建完这些文件夹后,可能还是会有点疑问,这些文件夹的作用是什么,下表给出了上面所提到的文件夹作用或者存放内容。

文件夹名称 用途
Drivers 存放与硬件相关的驱动层文件
Middlewares 中间层组件文件和第三方中间层文件
Output 存放工程编译输出文件
Projects 存放MDK工程文件
User 存放用户编写的代码,如main.c

上表只是给出这五个文件夹的大体作用,接下来是更具体描述文件夹的作用。

1.1 Drivers

在Drivers文件下,新建BSP、CMSIS、SYSTEM文件夹

文件夹 作用
BSP 存放开发板板级支持包驱动代码,如各种外设驱动,如LED、蜂鸣器、按键
CMSIS 存放CMSIS底层代码,如启动文件(.s文件)、stm32f1xx.h等
SYSTEM 存放正点原子系统级核心驱动代码,如sys.c、delay.c和usart.c等

我这边随便找一个正点原子例程,这边以正点原子给的综合实验例程来分析,下面是Drivers文件下的层次结构图:

如下图绿色线路所示,概括来说,事实上,Drivers文件下的BSP文件下,包含了各个外设驱动文件夹,比如LED文件夹,在LED文件夹中定义了一个软件逻辑led.c文件,一个硬件逻辑和参数led.h文件,他们共同构成了板极外设驱动led。

如下图绿色所示,在Driver文件夹下面的CMSIS文件夹,核心在于里面的设备Device文件,主要包括启动文件(.s文件)、stm32f1xx.h

如下图绿色所示,在Driver文件夹下面的SYSTEM文件夹,核心在于里面的delay,sys,usart文件,软件逻辑.c文件,一个硬件逻辑和参数=.h文件,他们共同构成了系统驱动。

1.2 Middlewares

该文件夹用于存放正点原子和其他第三方提供的中间层代码(组件/Lib等),如:USMART、

MALLOC、TEXT、FATFS、USB、LWIP、各种OS、各种GUI等等。还是以正点原子综合实验为例,我们可以看看其中GUI文件下的结构:

也就是说,事实上在Middlewares文件夹中的子级文件夹,无非是包含了一些中间层或者第三方库文件。

1.3 Output

该文件夹用于存放编译器编译工程输出的中间文件,比如:.hex、.bin、.o文件等等。这里

不需要操作,后面只需要在MDK里面设置该文件夹为编译过程中间文件的存放文件夹就行。这边通常是在魔术棒中设置输出的相关文件的路径

1.4 Projects

在Projects文件夹下面新建一个MDK-ARM文件夹

该文件夹用于存放编译器(MDK、IAR等)工程文件,我们主要用MDK,为了方便区分,

我们在该文件夹下新建:MDK-ARM文件夹,用于存放MDK的工程文件

1.5 User

该文件夹用于存放用户编写的代码,如:main.c 等。

2.新建项目工程

2.1 项目新建

新建项目,并选择项目的文件保存地路径为项目名/Projects/MDK-ARM

选择芯片型号STMF103ZE系列

回到test_project文件夹下的Projects文件下的MDK-ARM文件下,可以看到有以下文件生成

这里对上面生成的三个文件进行简单汇总成下表

文件夹 作用
DebugConfig 用于存放调试设置信息文件(.dbgconf),不可删除!
Listings 用于存放编译过程产生的链接列表等文件,可删除
Objects 用于存放编译过程产生的调试信息、.hex、预览、.lib文件等,可删除

编译过程产生的链接列表、调试信息、预览、lib等文件,统称为中间文件。为了统一管理,

方便使用,我们会把输出在Listings 和Objects 文件夹的内容,统一改为输出到Output 文件夹
(通过魔术棒设置),我们先把MDK自动生成的这两个文件夹(Listings和Objects)删除。

此时,我们只是建立了一个项目,还是什么也没有,如下图所示

2.2 项目文件添加

这个时候,我们需要对项目命名,以及分组,并对分组后的每个组添加各自需要的文件,每个小组可以理解为一个文件夹,可是这个时候有人会问:"前面不是有五个文件夹吗-Drivers,Middlewares,Output,Projects,User",事实上,前面五个文件夹只是一个铺垫准备,是我们自己人工分为的五个组,通过以下的分组创建的文件夹才是真正的项目中,被软件所认可的项目文件,我们要做的就是把之前我们存放的文件加到软件所认同的对应分组中,具体操作如下图所示:

Tips:大家如果有兴趣其实也可以去自己阅读下这个启动源码,尝试能不能自己写出来,主要还是汇编语言

最后,依据自己创建的组Drivers/SYSTEM,进行相应的文件添加

最终添加完后,效果如下图所示

3.魔术棒设置

主要对魔术棒下面的六个进行设置

3.1 Target

选择为

3.2 Output

选择为,特别注意Output输出文件夹,应该是最开始创建项目文件时候的Output路径

注意,我们勾选:Browse Information,用于输出浏览信息,这样就可以使用go to definition
查看函数/变量的定义,对我们后续调试代码比较有帮助,如果不需要调试代码,则可以去掉这
个勾选,以提高编译速度。

3.3 Listing

修改为

经过Output和Listing这两步设置,原来存储在Objects和Listings文件夹的内容(中间文
件)就都改为输出到Output文件夹了。

3.4 C/C++


在②处设置了全局宏定义:STM32F103xE,用于定义所用STM32型号,在stm32f1xx.h里

面会用到该宏定义。

在③处设置了优化等级为-O0,可以得到最好的调试效果,当然为了提高优化效果提升性能

并降低代码量,可以设置-O1~-O3,数字越大效果越明显,不过也越容易出问题。注意:当使用

AC6编译器的时候,这里推荐默认使用-O1优化。

在④处勾选C99模式,即使用C99 C语言标准。

在⑤处,我们可以进行头文件包含路径设置,相当于系统变量,这样我们在写C语言的include命令的时候,相当于就有了默认前缀,系统回去下面的路径去找

c 复制代码
..\..\Drivers\CMSIS\Device\ST\STM32F1xx\Include
..\..\Drivers\CMSIS\Include
..\..\Drivers
..\..\User

修改为

3.5 Debug

我这边使用的ST_LINK调试器

4.下载调试

4.1 主程序写入

在User组中新建main.c,并将下面代码写入:

c 复制代码
#include "./SYSTEM/sys/sys.h" 
#include "./SYSTEM/usart/usart.h" 
#include "./SYSTEM/delay/delay.h" 
 
int main(void) 
{ 
    uint8_t t = 0; 
    sys_stm32_clock_init(9);     /* 设置时钟, 72Mhz */ 
    delay_init(72);              /* 延时初始化 */ 
 usart_init(72, 115200);      /* 串口初始化 */ 
 
    while (1) 
    { 
        printf("t:%d\r\n", t); 
        delay_ms(500); 
        t++; 
    } 
} 

4.2 编译和下载烧录

可以看到编译成功

最后我们打开串口,并烧录代码,看到最终串口不停的输出

相关推荐
生活很暖很治愈21 分钟前
从玩具到工业控制--51单片机的跨界传奇【2】
嵌入式硬件·51单片机
2301_8059629330 分钟前
STM32如何测量运行的时钟频率
stm32·单片机·嵌入式硬件
冰茶_38 分钟前
C#异步和多线程,Thread,Task和async/await关键字--12
开发语言·学习·c#·visual studio
Wallace Zhang1 小时前
SimpleFOC |SimpleFOC学习笔记汇总
嵌入式硬件
捕鲸叉1 小时前
STM32程序发生异常崩溃时,怎样从串口输出当时的程序调用栈等信息
stm32·单片机·嵌入式硬件·调试 诊断
成为编程高手O_o1 小时前
Redis 实战篇 ——《黑马点评》(中)
java·数据库·redis·学习·缓存
一棵开花的树,枝芽无限靠近你2 小时前
【PPTist】幻灯片放映
前端·笔记·学习·编辑器·pptist
前端熊猫2 小时前
CSS3的aria-hidden学习
前端·学习·css3
索然无味io2 小时前
应急响应之入侵排查(下)
linux·windows·笔记·学习·网络安全·安全威胁分析
隼玉2 小时前
【STM32-学习笔记-8-】I2C通信
c语言·笔记·stm32·学习