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

news2024/11/18 1:50:48

【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.coloradmin.cn/o/463421.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Fedora 38 正式发布

Fedora Linux 38 正式发布,用户可以访问官网下载安装最新版本。 新网站 如果你点击了上面的官网链接,你应该会注意到 Fedora 的官网看起来与之前有了很大不同。这是 Fedora Websites & Apps 团队与 Design & Infrastructure 团队以及广大社区合作…

HCIA-RS实验-ENSP搭建一个基础的IP网络

HCIA-RS是华为认证网络工程师(Routing & Switching)的缩写。通过考取HCIA-RS证书,可以证明自己有能力设计、实现和维护小型网络。而HCIA-RS实验则是考试的一部分,是考生必须要完成的实践环节。这将是第一篇文章,后…

Qt连接MySQL数据库最详细的教程

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1.直接通过MySQL的驱动加载数据库1)所需代码2)解决QMYSQL driver not loaded 2.通过ODBC连接MySQL数据库1)官方解释2…

如何react中使用redux和react-redux

Redux Redux 是 JavaScript 状态容器,提供可预测化的状态管理。 可以让你构建一致化的应用,运行于不同的环境(客户端、服务器、原生应用),并且易于测试。 不仅于此,它还提供 超爽的开发体验,比…

指针可以这样认知

注:此篇文章仅限初步了解,本小白后续会持续进行详解指针的相关操作。 目录: 认知内存一个内存单元的大小地址的产生 理解指针用途 指针变量的大小💞结尾 了解指针为什么需要了解内存呢? 因为指针是用来管理内存&#x…

【k8s】ruoyi微服务迁移到k8s

书接上回【传统方式部署Ruoyi微服务】,此刻要迁移至k8s。 环境说明 31 master , 32 node1 , 33 node2迁移思路 交付思路: 其实和交付到Linux主机上是一样的,无外乎将这些微服务都做成了Docker镜像; 1、微服务数据层: MySQL、 R…

聊聊 IP packet 的 TTL 与 tcp segment 的 MSL

聊聊 IP packet 的 TTL 与 tcp segment 的 MSL 1 前言 - 网络知识的重要性 近几年在排查解决应用系统在客户现场遇到的复杂问题时,越来越觉得除了扎实的LINUX操作系统知识,对TCP/IP网络知识的深入理解也是至关重要的。 有鉴于此,后续笔者会…

排序算法---插入排序

插入排序是一种简单的排序算法,一般又称为直接插入排序。插入排序的思想与选择排序有些相似,即在原数组上将数组分为两个部分:已排列好的有序数组和待排列数组,选择排序强调的是“选择”,而插入排序强调的是”插入“&a…

【Excel统计分析插件】上海道宁为您提供统计分析、数据可视化和建模软件——Analyse-it

Analyse-it是Microsoft Excel中的 统计分析插件 它为Microsoft Excel带来了 易于使用的统计软件 Analyse-it在软件中 引入了一些新的创新统计分析 Analyse-it与 许多Excel加载项开发人员不同 使用完善的软件开发和QA实践 包括单元/集成/系统测试 敏捷开发、代码审查 …

【JavaScript面向对象】

JavaScript面向对象 1 本节目标2 面向对象编程介绍2.1 两大编程思想2.2 面向过程编程POP2.3 面向对象编程OOP2.4 面向过程和面向对象的对比 3 ES6中的类和对象3.1 对象3.2 类class3.3 创建类3.4 类constructor构造函数3.5 类添加方法3.6 三个注意点 4 类的继承4.1 继承4.2 supe…

matlab 点云采样相关操作-源码复制粘贴即可

1.随机采样一个百分点的随机抽样 clc; clear; close all; % clear everything% Import point cloud pc pointCloud(Lion.xyz);% Plot all points pc.plot; % points are colored by z coordinate title(All Points, Color, w); view(0,0); snapnow;% Select randomly 5 perce…

FL Studio21免费吗?怎么下载最新中文版本?

FL Studio中文版已上线,自20.8版起已支持简体中文。推荐使用Windows 10系统安装, Windows 7系统设置FL Studio语言为中文时若出现乱码,可以将Win10系统中的“微软雅黑”字体复制并安装进Win7系统电脑中!FL Studio支持什么格式的插…

【软考数据库】第四章 操作系统知识

目录 4.1 进程管理 4.1.1 操作系统概述 4.1.2 进程组成和状态 4.1.3 前趋图 4.1.4 进程同步与互斥 4.1.5 进程调度 4.1.6 死锁 4.1.7 线程 4.2 存储管理 4.2.1 分区存储管理 4.2.3 分页存储管理 4.2.…

进程与线程:同步和互斥

进程与线程:同步&互斥 同步&互斥的概念 ​ 进程具有异步性的特征。异步性是指各并发进程执行的进程的以各自独立的,不可预知的速度向前推进 同步 ​ 同步 亦称为直接制约关系,它是指为完成某种任务而建立的两个或多个进程&#xf…

虚拟主机解压/压缩功能说明

使用帮助说明 主机控制面板上点击文件管理,进入目录。 一、解压 windows操作系统: 鼠标移动到压缩文件,点击“解压” Linux操作系统: 压缩文件后点击解压按钮。 注意linux系统不支持rar在线解压,rar改名为zip也不能解压&…

JVM 调优

大部分的情况都是由于企业内部代码逻辑不合理导致。 JVM内部性能优化 栈上分配 方法内联 JVM的自适应调整 JVM改错 大并发内存不足OOM 内存泄漏GC频繁CPU飙升 JVM的调优的原则是让你各项指标尽可能的利用到你硬件的性能瓶颈。 JVM的性能优化可以分为代码层面和非代码层面。…

数据库系统工程师——第五章 网络基础知识

文章目录 📂 第五章、网络基础知识 📁 5.1 计算机网络概述 📖 5.1.1 计算机网络的概念 📖 5.1.2 计算机网络的分类 📖 5.1.3 网络的拓扑结构 📁 5.2 网络硬件基础 📖 5.2.1 网络设备 &…

Linux 文件内容相关命令使用汇总

Linux操作系统有很多强大的文件内容相关命令,这些命令可以让您查看、分析和编辑文件。其中,最基本和常用的命令包括cat、more、less和head/tail等。除了这些基本命令之外,grep和find命令也是文件搜索和过滤方面的有力工具。 前言 我们这篇主…

UM2080F32 低功耗32 位 Sub1GHz 无线SOC收发器芯片

产品描述 UM2080F32 是广芯微电子(广州)股份有限公司研制的基于 ARM Cortex M0 内核的超低功 耗、高性能的、单片集成 (G)FSK/OOK 无线收发机的 32 位 S o C 芯片。 UM2080F32 工作于 200MHz~960MHz 范围内,支持灵活可设的数据包格式&#xf…

危险试探,产品经理赋予AI人格来打造品牌忠诚度

图片来源:由无界 AI工具生成 你可能不会相信,你的手机很可能变成你的虚拟情人,升级情人需要升级手机,而你从此再也不想换其他品牌手机。 AI时代,赋予产品以人格,让用户爱上产品,这或许是接下来产…