【STM32】基础知识 第八课 MDK 工程

news/2024/4/20 13:53:04/文章来源:https://blog.csdn.net/weixin_46274168/article/details/130239788

【STM32】基础知识 第八课 MDK 工程

  • 准备工作
  • 新建寄存器版本 MDK 工程步骤
    • 新建工程文件夹
    • 添加文件
    • 魔术棒设置
    • 绝对路径和相对路径对比
    • 测试程序
  • 新建 HAL 库版本 MDK 工程
    • CMSIS
    • HAL 库简介
    • Drivers
    • Middlewares
    • Device 和 Include
  • HAL 库文件介绍
    • HAL 库 API 函数和比那辆命名规则
    • HAL 库对寄存器位操作的相关宏定义
    • HAL 库回调函数
    • HAL 库使用注意事项
  • 新建 HAL 库版本 MDK 工程步骤

准备工作

  1. 下载相关 STM32Cube 官方固件包 (F1/F4/F7/H7), ST 官网搜索 STM32Cube
  2. 搭建开发环境

STM32 新建工程

新建寄存器版本 MDK 工程步骤

  1. 新建工程文件夹
  2. 新建一个工程框架
  3. 添加文件
  4. 魔术棒设置
  5. 添加 main.c, 并编写代码

新建工程文件夹

在桌面新建一个工程根目录文件夹, 并在该文件夹里新建 D/M/O/P/U 文件夹.

文件名称作用
Drivers存放与硬件相关的驱动层文件
Middlewares存放正点原子提供的中间层组文件和第三方中间层文件
Output存放工程编译输出文件
Projects存放 MDK 工程文件
User存放 HAL 库用户配置文件, main.c, 中断处理文件, 以及分散加载文件

Drivers 文件夹

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

Middlewares 文件夹:
该文件夹用来存放中间层代码 (组件 / Lib 等). 比如: USMART, MALLOC, TEXT, FATFS, USB, LWIP, 各种 OS, 各种 GUI 等.

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

Projects 文件夹:
该文件夹用于存放编译器 (MDK, IAR 等) 工程文件, 我们主要用 MDK, 为了方便区分, 我们在该文件夹下新建: MDK-ARM 文件夹, 用于存放 MDK 的工程文件.

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

添加文件

添加文件步骤:

  1. 设置工程名和分组名
  2. 添加启动文件
  3. 添加 SYSTEM 源码

工程名: Template
分组名: Startup, User, Drivers/SYSTEM, Readme

在这里插入图片描述
在这里插入图片描述

魔术棒设置

魔术棒设置:

  1. Target 选项卡: 设置使用的编译器版本, 外部晶振频率
  2. Output 选项卡: 设置 Objects 输出文件 , 生成 .hex 文件, 输出浏览信息
  3. Listing 选项卡: 设置 Listing 输出文件夹
  4. C/C++ 选项卡: 设置全局宏定义, 优化等级, C99 Mode, 设置头文件包含路径
  5. Debug 选项卡: 设置使用的仿真器类型, 选择的下载接口等
  6. Utilities 选项卡: 设置下载功能, 下载算法, 下载算法起始地址和大小等
  7. Linker 选项卡 (可选): 添加分散加载文件 (北极星 / MiniPro H750)

AC5 和 AC6 编译器对比

对比项AC5AC6说明
中文支持较好较差AC6 对中文支持极差, goto definition 无法使用, 误报等
代码兼容性较好交差AC6 对某些代码优化可能导致运行异常, 需慢慢调试
编译速度较慢较快AC6 编译速度比 AC5 快
语法检查一般严格AC6 语法检查非常严格, 代码严谨性较好

绝对路径和相对路径对比

绝对路径是指目录下的绝对位置, 直接到达目标位置, 通常是从盘符开始的路径. 相对路径就是指由某个文件所在的路径引起的跟其它文件 (或文件夹)的路径关系.

对于相对路径, 大家记住 3 点:

  1. 默认路径就是指 MDK 工程所在路径, 即 .uvprojx 文件所在路径 (文件夹)
  2. ./表示当前目录 (相对当前路径, 也可以写做.\)
  3. ../表示当前目录的上一层目录 (也可以写做..\)

测试程序

#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++;}
}

编译:

assembling startup_stm32f103xe.s...
compiling delay.c...
compiling usart.c...
compiling sys.c...
linking...
Program Size: Code=1924 RO-data=336 RW-data=4 ZI-data=1412  
FromELF: creating hex file...
"..\..\Output\atk_f103.axf" - 0 Error(s), 0 Warning(s).
Build Time Elapsed:  00:00:01

新建 HAL 库版本 MDK 工程

CMSIS

CMSIS (Cortex Microcontroller Software Interface Standard), 微控制器软件接口标准, 是由 ARM 和与其合作的芯片厂商, 软件工具厂商, 共同指定的标准.

HAL 库简介

ST 为了方便用户开发 STM32 芯片开发提供了三种库:

  • 标准外设库 (Standard Peripheral Libraries)
  • HAL 库 (硬件抽象层): Hardware Abstraction Layer
  • LL 库: Lower Layer

对比:

  • 直接操作寄存器: 执行效率高, 时间成本高
  • 标准库: F0/F1/F2/F3/F4/L1, 目前已停止维护
  • HAL 库: 全系列兼容, ST 目前主推的库, 兼容性, 易移植性
  • LL 库: 全系列兼容, 与 HAL 库绑发布, 轻量级, 效率高, 不匹配部分复杂外设

Drivers

文件夹名称作用
BSP板级支持包, 用于适配 ST 官方的开发板 (可参考)
CMSIS符合 CMSIS 的组件, 包括: DSP 库, Cortex-M 内核及其设备文件, 微控制专用头文件, 启动文件, 专用系统文件等
STM32F1xx_HAL_DriverHAL 库外设驱动源码, 包括 F1 系列 HAL 库源文件和头文件

Middlewares

文件夹名称文件作用
STSTemWinStemWin 工具包
STSTM32_USB_Device_LibraryUSB 从机设备支持包
STSTM32_USB_Host_LibraryUSB 主设备支持包
Third_PartyFatFsFAT 文件系统支持包
Third_PartyFreeRTOSFreeRTOS 实时系统支持包
Third_PartyLwIPLwIP 网络通信协议支持包

Device 和 Include

文件名称描述
stm32f1xx.h是所有 F1 系列的顶层头文件, 通过条件编译来包含某个芯片的头文件, 定义通用的枚举类型, 定义通用的宏定义
stm32f103xe.h包含: 中断编号定义, 外设寄存器结构体类型定义, 寄存器映射, 寄存器位定义, 外设判定
system_stm32f1xx.c
system_stm32f1xx.h
定义了系统初始化函数 Systemlnit 和系统时钟更新函数 SystemCoreClockUpdate
startup_stm32f103xe.s大容量 F103 系芯片的启动文件

HAL 库文件介绍

文件描述
stm32f1xx_hal.c
stm32f1xx_hal.h
HAL 库初始化, 系统滴答, HAL 库延时等相关函数
stm32f1xx_hal_conf.hHAL 库的用户配置文件, 系统滴答, HAL 库延时等相关函数
stm32hxx_hal_def.h包含 HAL 库通用的枚举类型数据和宏定义
stm32fxx_hal_cortex.h内核通用函数定义和声明, 如 NVIC, MPU, 系统软复位, Systick 等, 其实主要是对 core_cm3.h 文件的相关函数再次封装
stm32f1xx_hal_ppp.c
stm32f1xx_hal_ppp.h
某任意外设驱动源码, PPP 表示任意外设
stm32f1xx_hal_ppp_ex.c
stm32f1xx_hal_ppp_ex.h
主要是存放外设的扩展 (特殊) 功能的驱动源码, PPP 表示任意外设
stm32f1xx_ll_ppp.c
stm32f1xx_ll_ppp.h
LL 库驱动源码, 在部分 STM32F1xx_hal_ppp.c 或 stm32f1xx_hal_ppp_ex.c 中会被调用

HAL 库 API 函数和比那辆命名规则

文件名stm32f1xx_hal_ppp.(c/h)stm32发xx_hal_ppp_ex.(c/h)
函数名HAL_PPP_FunctionHAL_PPPx_Function
外设句柄PPP_HandleTypeDef
外设工作参数
初始化结构体
PPP_InitTypeDefPPP_InitTypeDef
配置参数结构体PPP_YyyyConfTypeDefPPP_YyyyConfTypeDef
  • 初始化 / 反初始化函数: HAL_PPP_Init(), HAP_PPP_DeInit()
  • 外设读写函数: HAL_PPP_Read(), HAL_PPP_Write(), HAL_PPP_Receive()
  • 控制函数: HAL_PPP_Set(), HAL_PPP_Get()
  • 状态和错误: HAL_PPP_GetState(), HAL_PPP_GetError()

HAL 库对寄存器位操作的相关宏定义

宏定义结构用途
__HAL_PPP_ENABLE_IT(__HANDLE__,__INTERRUPT__)使能外设中断
__HAL_PPP_DISABLE_IT(__HANDLE__,___INTERRUPT__)禁用外设中断
__HAL_PPP_GET_IT(__HANDLE__,__INTERRUPT__)获取外设某一中断源
__HAL_PPP_CLEAR_IT(__HANDLE__,__INTERRUPT__)清除外设中断
__HAL_PPP_GET_FLAG(__HANDLE__,__INTERRUPT__)获取外设的状态标记
__HAL__PPP_CLEAR_FLAG(__HANDLE__,__FLAG__)获取外设的状态标记
__HAL_PPP_ENABLE(__HANDLE__)开启某一外设
__HAL_PPP_DISABLE(__HANDLE__)禁用某一外设
__HAL_PPP_XXXX(__HANDLE__,__PARAM___)针对外设的特殊操作
__HAL__PPP_GET_IT_SOURCE(__HANDLE__,__INTERRUPT__)检查外设的中断源

HAL 库回调函数

回调函数举例
HAL_PPP_MspInit() / _DeInit()举例: HAL_USART_MspInit()
会被 HAL_PPP_Init() 函数调用, 该函数主要用于存放外设使用到的 GPIO, CLOCK, NVIC, DMA 等初始化代码
HAL_PPP_ProcessCpltCallback举例: HAL_USART_TxCpltCallback
由外设中断或 DMA 中断调用, HAL 库中断公共处理函数已经实现对中断标记位读取, 判断和清除操作, 用户只需要专注于中断逻辑功能的实现即可
HAL_PPP_ErrorCallback举例: HAL_USART_ErrorCallback
外设或 DMA 中断发生的错误, 用于发生错误处理

HAL 库使用注意事项

  1. 使用 HAL 库出现问题, 还是得通过参考手册检查硬件操作是否有问题
  2. 尽量不通过修改库源码实现功能, 这样不方便库更新
  3. HAL 库可能会存在错误, 要有质疑精神
  4. 有些 HAL 库 API 函数执行效率偏低, 我们可能会直接通过操作寄存器的方式代替

新建 HAL 库版本 MDK 工程步骤

STM32 MDK 工程
STM32 MDK 工程
出处: 笔记摘自正点原子

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_103714.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ArcGIS】常见问题总结

1 arcgis如何打开*.adf文件 在处理数据时发现,获取到的土地利用类型数据有两个文件夹,一个叫info,另一个叫lucc2010(年份),打开lucc2010里面是一系列的*.adf文件,数据应该如何打开呢&#xff1…

【Vue】Vue 前端设计模式梳理

文章目录 一、什么是设计模式?二、设计几个原则三、常见的设计模式及实际案例【1】单例模式1. 什么是单例模式?2.Vue中的单例模式 【2】工厂模式1. 什么是工厂模式?2.Vue中的工厂模式 【3】策略模式1. 什么是策略模式?2.策略模式的…

QT笔记——QtPropertyBrowser的使用

上一节,我们将了如何去配置QtPropertyBrowser 本节,我们将说明 如何 去 使用QtPropertyBrowser 这个属性类的一些基本知识 简单的几种用法: 首先: 我们需要创建一个Widget 提升一个类 为 QtTreePropertyBrowser .h文件 QtVariant…

详解客户关系管理系统

一、客户关系管理系统的重要性 客户关系管理系统,是指利用软件、硬件和网络技术,为企业建立一个客户信息收集、管理、分析和利用的信息系统。以客户数据的管理为核心,记录企业在市场营销和销售过程中和客户发生的各种交互行为,以…

华为C++研发工程师编程题 ACM模式输入输出|| 1.汽水瓶,2.明明的随机数,3.进制转换

C ACM输入输出 1.汽水瓶题目描述思路代码如下 2.明明的随机数题目描述思路:代码如下: 3.进制转换题目描述思路:代码如下 题目链接: 华为研发工程师编程题 1.汽水瓶 题目描述 某商店规定:三个空汽水瓶可以换一瓶汽水…

服务器空间不足处理与解决思路—实战docker占用空间太大

前言 服务器Centos操作系统,空间不足的问题处理了三次了,决定把它的解决思路和处理过程记录下来。服务器空间不足是一个经常会遇到的问题,尤其是在大型应用程序和网站上。当服务器空间不足时,应该采取一些步骤来处理和解决这个问…

LeetCode:206. 反转链表

🍎道阻且长,行则将至。🍓 🌻算法,不如说它是一种思考方式🍀 算法专栏: 👉🏻123 一、🌱206. 反转链表 题目描述:给你单链表的头节点 head &#x…

html学习(布局方式(layout)、浮动(float)、定位(position)、弹性盒(flex))

布局方式(layout) 文档流 文档流(normal flow) 文档流通俗的讲,就是一个web页面中,每一个模块只能从上到下从左往右的方式排列在页面上。 将窗口自下而上分成一行一行,应在每行中按从左至右的依次排放元素&#xff0…

光纤网卡传输速率和它的应用领域有哪些呢?通常会用到哪些型号网络变压器呢?

Hqst盈盛(华强盛)电子导读:常有客户问起光纤网卡该如何选用到合适的产品,选用时要注意到哪些事项,这节将结合配合到的网络变压器和大家一起探讨,希望对大家有些帮助。 1.光纤网卡传输速率与网络…

【iOS-分类,拓展和关联对象底层探究】

前言 寒假分享会问题解决二 早在大一的OC的学习过程就知道了分类和拓展的区别和联系,分类不能添加成员变量,而拓展可以添加成员变量。分类是在运行时期实现的,而拓展只是编译器的时候就实现了。对于分类我们可以通过关联对象来为我们需要的分…

线程池四种拒绝机制 实现 及执行日志

目录 目录 目录 创建线程池 测试代码 运行线程 全量代码 日志 AbortPolicy 报出异常模式 DiscardPolicy 放弃机制啥也不处理 DiscardOldestPolicy 放弃机制,放弃列队最早进入的 CallerRunsPolicy 交给主线程执行 创建线程池 public static ExecutorServi…

项目范围控制:如何控制项目范围的变化?

一个成功的项目需要在进度、成本和质量之间取得平衡。控制项目交付范围是实现这个平衡的关键。然而,项目范围是会变化的,因此控制项目范围变化是必要的。 如何控制项目范围的变化? 1、了解项目的交付范围 项目经理、团队成员、利益相关者和…

我用什么写Python?

入门教程、案例源码、学习资料、读者群 请访问: python666.cn 大家好,欢迎来到 Crossin的编程教室 ! 通常来说,每个程序员都有自己趁手的兵器:代码编辑器。你要是让他换个开发环境,恐怕开发效率至少下降三成…

c/c++:char*定义常量字符串,strcmp()函数,strcpy()函数,寻找指定字符,字符串去空格

c/c:char*定义常量字符串,strcmp()函数,strcpy()函数,寻找指定字符,字符串去空格 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,此时学会c的话, 我所…

Python爬虫基础之二

Python爬虫基础包括HTTP协议、HTML、CSS和JavaScript语言基础、requests库的使用、Beautiful Soup库的使用、xpath和正则表达式的使用等。此外,还应该了解反爬虫机制和爬虫的一些常见问题及解决方法。 上一篇文章讲解了有关条件判断语句、循环语句等相关知识&#…

陆奇-奇绩创坛-chatGPT新范式,新时代,新机会

奇绩创坛-新范式,新时代,新机会 01-新范式 新范式的新拐点 新范式的历史环境 新范式的社会影响 新范式的缔造者:Sam Altman和OpenAI 新范式的动力引擎 新范式的演化路径 02-新时代 新时代的宏观发展格局 新时代的中国机会 新时代的OpenAI生…

IT项目管理之软件测试

1. 定义 软件测试是使用人工或者自动的手段来运行或者测定某个软件系统的过程,其目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别。 在软件投入使用前,要经过一系列的严格测试,才能保证交付质量。 2. QC & QA &a…

开源模型ModelScope的初探使用

泛AI开发者的一站式模型服务产品平台 阿里达摩院推出了一个开源的模型共享平台,包括计算机视觉、多模态、自然语言处理等多个领域上手即用的模型,如果AI相关模型感兴趣的同学,或者想基于基础模型做业务场景的同学,都可以用这个平…

C++三大特性—继承 “访问控制”

本文主要阐述关于C继承中基类与派生类之间的访问关系 继承方式与访问方式 继承定义格式: 派生类可以继承定义在基类的成员,但是派生类的成员函数不一定有权访问从基类继承来的成员    访问限定符的作用:控制派生类从基类继承而来的成员是否…

学习系统编程No.23【信号实战】

引言: 北京时间:2023/4/23,最近学习状态不怎么好,总是犯困,没精力的感觉,可能是病没有好彻底的原因,也可能是我内心因为生病而认为摆烂理所应当,反正最后导致摆烂,课现在…