当前位置: 首页 > article >正文

STM32从零开始深入学习

STM32项目创建

  • 1.新建项目文件夹
    • 1.1 Drivers
    • 1.2 Middlewares
    • 1.3 Output
    • 1.4 Projects
    • 1.5 User
  • 2.新建项目工程
    • 2.1 项目新建
    • 2.2 项目文件添加
  • 3.魔术棒设置
    • 3.1 Target
    • 3.2 Output
    • 3.3 Listing
    • 3.4 C/C++
    • 3.5 Debug
  • 4.下载调试
    • 4.1 主程序写入
    • 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命令的时候,相当于就有了默认前缀,系统回去下面的路径去找

..\..\Drivers\CMSIS\Device\ST\STM32F1xx\Include
..\..\Drivers\CMSIS\Include
..\..\Drivers
..\..\User

修改为
在这里插入图片描述

3.5 Debug

我这边使用的ST_LINK调试器
在这里插入图片描述

4.下载调试

4.1 主程序写入

在User组中新建main.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 编译和下载烧录

在这里插入图片描述
可以看到编译成功
最后我们打开串口,并烧录代码,看到最终串口不停的输出
在这里插入图片描述


http://www.kler.cn/a/500026.html

相关文章:

  • IP 地址与蜜罐技术
  • 通信与网络安全管理之ISO七层模型与TCP/IP模型
  • DBeaver执行本地的sql语句文件避免直接在客户端运行卡顿
  • php 二维数组根据其他字段值是否相同来进行去重
  • IOS HTTPS代理抓包工具使用教程
  • 学会使用computed计算属性与watch监听(小白学习笔记)
  • 深入Android架构(从线程到AIDL)_24 活用IBinder接口于近程通信02
  • 深入NLP核心技术:文本张量表示与词嵌入全面解析
  • 【GESP】C++二级练习 luogu-B2080, 计算多项式的值
  • Iterator 与 ListIterator 的区别
  • 头部(Header)
  • Vulnhub-Red靶机笔记
  • FFmpeg音视频流媒体,视频编解码性能优化
  • 【pikachu】靶场中爆破模块的token检测,如何使用burp进行爆破
  • Vue3框架核心功能点响应式数据reactive、组合式API setup、computed、组件通信、路由导航,状态管理vuex、pinia等的实战示例代码
  • 从0开始搭建MySQL服务 | 创建库 、创建表、数据写入、查数据
  • Qt 智能指针
  • 三维卷积( 3D CNN)
  • 通过一个含多个包且引用外部jar包的项目实例感受Maven的便利性
  • js前序遍历等
  • git - 用SSH方式迁出远端git库
  • 从0开始分享一个React项目(二):React-ant-admin