【09】STM32·HAL库-新建HAL库版本MDK工程 | 下载STM32固件库

news2025/1/11 8:43:34

目录

  • 1,新建工程前的准备工作(了解)
    • 1.1下载相关STM32Cube 官方固件包(F1/F4/F7/H7)
  • 2,新建HAL库版本MDK工程步骤(熟悉)
    • 2.1新建工程文件夹
      • 2.1.1Drivers文件夹
      • 2.1.2Middlewares文件夹
      • 2.1.3Output文件夹
      • 2.1.4Projects文件夹
      • 2.1.5User文件夹
    • 2.2新建一个工程框架
      • 2.2.1新建工程
      • 2.2.2保存工程
      • 2.2.3选择主控型号
      • 2.2.4删除文件夹
    • 2.3添加文件
      • 2.3.1设置工程名和分组名
      • 2.3.2添加启动文件
      • 2.3.3添加User源码
      • 2.3.4添加SYSTEM源码
      • 2.3.5添加STM32F1xx_HAL_Driver 源码
    • 2.4魔术棒设置
      • 2.4.1Target 选项卡
      • 2.4.2Output 选项卡
      • 2.4.3Listing 选项卡
      • 2.4.4C/C++ 选项卡
      • 2.4.5Debug 选项卡
      • 2.4.6Utilities 选项卡
      • 2.4.7Linker 选项卡(可选)
    • 2.5添加 main.c,并编写代码
  • 3,下载验证(了解)
  • 4,总结(了解)

1,新建工程前的准备工作(了解)

1.1下载相关STM32Cube 官方固件包(F1/F4/F7/H7)

  之前文章中已经总结如何下载,具体查看【07】STM32·HAL库开发-新建寄存器版本MDK工程 |下载STM32Cube固件包 | 新建MDK工程步骤中的第1.1小节。

2,新建HAL库版本MDK工程步骤(熟悉)

  新建HAL库版本MDK工程简要步骤:
1.新建工程文件夹:D/M/O/P/U文件夹,5个文件夹;
2.新建工程框架:工程命名,选芯片;
3.添加文件:建分组,添加.s、.c;
4.魔术棒设置:T/O/L/C/D/U,6个选项卡;
5.添加main.c:编写自己的代码。

2.1新建工程文件夹

  在桌面新建一个工程根目录文件夹,并在该文件夹里新建D/M/O/P/U文件夹。
在这里插入图片描述

在这里插入图片描述

2.1.1Drivers文件夹

  在【Drivers】文件夹中新建【BSP】文件夹,由于只是创建新工程此处为空文件夹,有外设时可根据外设添加此文件夹代码;【CMSIS】文件夹,直接复制正点原子资料A盘->8.STM32参考资料->1,STM32CubeF1固件包->精简版CMSIS中的【CMSIS】文件夹,如果想知道保留了哪些文件,可以查看文章【07】STM32·HAL库开发-新建寄存器版本MDK工程 |下载STM32Cube固件包 | 新建MDK工程步骤中的章节2.1.1;【SYSTEM】文件夹随意拷贝正点原子F1系列工程中的【SYSTEM】文件夹;
在这里插入图片描述
  【STM32F1xx_HAL_Driver】文件夹直接拷贝HAL固件库文件夹中的【STM32F1xx_HAL_Driver】文件夹,并删除除了【Inc】和【Src】文件夹以外的其他文件。
在这里插入图片描述

在这里插入图片描述

2.1.2Middlewares文件夹

  【Middlewares】文件夹文件夹用于存放正点原子和其他第三方提供的中间层代码(组件/Lib 等),如: USMART、MALLOC、 TEXT、 FATFS、 USB、 LWIP、各种 OS、各种 GUI 等。目前不用操作。

2.1.3Output文件夹

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

2.1.4Projects文件夹

  该文件夹用于存放编译器(MDK、 IAR 等)工程文件,我们主要用 MDK,为了方便区分,我们在该文件夹下新建: MDK-ARM 文件夹,用于存放 MDK 的工程文件。在该文件夹下创建【MDK-ARM】文件夹。
在这里插入图片描述

2.1.5User文件夹

  该文件夹用于存放用户编写的代码,如: HAL 库用户配置文件、 main.c 文件、中断处理文件,以及分散加载文件等。main.c文件在创建工程时创建,其他文件从HAL库固件包中复制,如0下所示:

在这里插入图片描述
  从以下目录中获取stm32f1xx_hal_conf.h(此文件也可以从STM32Cube_FW_F1_V1.8.0\Drivers\STM32F1xx_HAL_Driver\Inc中获取,将文件stm32f1xx_hal_conf_template.h文件名改为stm32f1xx_hal_conf.h即可)和stm32f1xx_it.h文件。
在这里插入图片描述
  从以下目录中获取stm32f1xx_it.c文件。
在这里插入图片描述

2.2新建一个工程框架

2.2.1新建工程

在这里插入图片描述
  将工程保存到【MDK-ARM】文件夹中,并自由命名,这里我命名为“f103”。选择自己开发板对应的芯片,这里以STM32RCT6为例。
在这里插入图片描述
  在以下界面选择Cancel即可。

在这里插入图片描述

2.2.2保存工程

2.2.3选择主控型号

2.2.4删除文件夹

  生产工程后,自动生成以下三个文件夹,【DebugConfig】文件夹不能删除,此文件中保存调试的设置信息,如果删除在调试时会发生错误。删除【Listings】和【Objects】文件夹,因为编译产生的中间层文件会在MDK软件中设置输出到【Output】文件夹。
在这里插入图片描述
  删除后的【MDK-ARM】如下所示:
在这里插入图片描述

2.3添加文件

2.3.1设置工程名和分组名

  工程名:Template
  分组名:Startup,User,Drivers/SYSTEM,Drivers/STM32F1xx_HAL_Driver ,Readme
在这里插入图片描述
  最终设置工程名和分组名如下所示:
在这里插入图片描述

2.3.2添加启动文件

  在设置工程名和分组名界面,找到【Add Files】添加【Drivers\CMSIS\Device\ST\STM32F1xx\Source\Templates\arm】文件夹中的启动文件。
在这里插入图片描述

2.3.3添加User源码

  在【User】分组中添加【User】文件夹中的stm32f1xx_it.c和【Drivers\CMSIS\Device\ST\STM32F1xx\Source\Templates】的system_stm32f1xx.c文件。
在这里插入图片描述

2.3.4添加SYSTEM源码

  添加【Drivers\SYSTEM】文件夹中,各自文件夹的.c文件。
在这里插入图片描述

2.3.5添加STM32F1xx_HAL_Driver 源码

  新建工程时对HAL库进行裁剪,根据需要进行保留,新建工程最终保留如下所示:
在这里插入图片描述
  点击【OK】,工程右侧最终如下图所示。
在这里插入图片描述
  其中有“小钥匙”符号的原因是官方的固件包设置的是只读模式,取消只读权限即可让其消失。
在这里插入图片描述

2.4魔术棒设置

2.4.1Target 选项卡

  设置外部晶振频率。
在这里插入图片描述

2.4.2Output 选项卡

  设置Objects输出文件夹、生成.hex文件(勾选【Creat HEX File】)、输出浏览信息。勾选【Browse Information】可以在程序中使用Goto definition,如果不勾选,编译速度会变快。
在这里插入图片描述

2.4.3Listing 选项卡

  设置Listing输出文件夹。
在这里插入图片描述

2.4.4C/C++ 选项卡

  设置全局宏定义(表示使用了HAL库驱动,USE_HAL_DRIVER和STM32F103xE之间用英文逗号隔开。)、优化等级(不用修改,默认为Level 0)、勾选【C99 Mode】、设置头文件包含路径。
在这里插入图片描述

在这里插入图片描述
  定义USE_HAL_DRIVERSTM32F103xE这两个宏的原因是在stm32f1xx.h中,需要定义了宏USE_HAL_DRIVER才可以使用HAL库,可以在stm32f1xx.h文件中定义,也可以在MDK中进行全局宏定义。定义宏STM32F103xE也是在stm32f1xx.h存在条件编译,头文件中描述了FLASH、SRAM、外设基地址的信息,如果要开发此系列,必须定义该宏。

#if defined (USE_HAL_DRIVER)
 #include "stm32f1xx_hal.h"
#endif /* USE_HAL_DRIVER */


#if defined(STM32F100xB)
  #include "stm32f100xb.h"
#elif defined(STM32F100xE)
  #include "stm32f100xe.h"
...

2.4.5Debug 选项卡

  设置使用的仿真器类型、选择的下载接口等。这里以ST-Link下载方式为例,选择SWD方式,时钟选择最大即可。
在这里插入图片描述

2.4.6Utilities 选项卡

  设置下载功能、下载算法、下载算法起始地址和大小等。勾选【Reset and Run】程序复位后自动执行,【Erase Full Chip】是擦除全片,【Erase Sectors】是擦除部分,【Do not Erase】是不进行擦除,其余默认即可。
在这里插入图片描述

2.4.7Linker 选项卡(可选)

  添加分散加载文件(北极星/MiniPro H750,需要用外部的FLASH存储代码)。具体参考【07】STM32·HAL库开发-新建寄存器版本MDK工程 |下载STM32Cube固件包 | 新建MDK工程步骤中的2.4.7小节。

2.5添加 main.c,并编写代码

  点击新建文件图标,或者Ctrl+N新建文件,Ctrl+S保存到【User】文件夹,命名为main.c,并添加到工程分组【User】中。
在这里插入图片描述
在这里插入图片描述

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"

void led_init(void);                       /* LED初始化函数声明 */

int main(void)
{
    HAL_Init();                         /* 初始化HAL库 */
    sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
    delay_init(72);                     /* 延时初始化 */
    led_init();                         /* LED初始化 */
    while(1)
    { 
        HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);    /* PB5置1 */ 
        HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,GPIO_PIN_RESET);  /* PE5置0 */ 
        delay_ms(500);
        HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);  /* PB5置0 */
        HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,GPIO_PIN_SET);    /* PE5置1 */
        delay_ms(500); 
    }
}

/**
 * @brief       初始化LED相关IO口, 并使能时钟
 * @param       无
 * @retval      无
 */
void led_init(void)
{
    GPIO_InitTypeDef gpio_initstruct;
    __HAL_RCC_GPIOD_CLK_ENABLE();                          /* IO口PB时钟使能 */
    __HAL_RCC_GPIOA_CLK_ENABLE();                          /* IO口PE时钟使能 */

    gpio_initstruct.Pin = GPIO_PIN_2;                      /* LED0引脚 */
    gpio_initstruct.Mode = GPIO_MODE_OUTPUT_PP;            /* 推挽输出 */
    gpio_initstruct.Pull = GPIO_PULLUP;                    /* 上拉 */
    gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;          /* 高速 */
    HAL_GPIO_Init(GPIOD, &gpio_initstruct);                /* 初始化LED0引脚 */

    gpio_initstruct.Pin = GPIO_PIN_8;                      /* LED1引脚 */
    HAL_GPIO_Init(GPIOA, &gpio_initstruct);                /* 初始化LED1引脚 */
}

  拷贝以上程序到main.c中(led_init函数中需要根据自己板子LED引脚进行设置),编译工程会报以下错误,双击此错误,跳转到报错位置,删除#include "main.h"

..\..\User\stm32f1xx_it.c(23): error:  #5: cannot open source input file "main.h": No such file or directory

  再次编译会出现以下警告,说明HAL_IncTick未声明,在stm32f1xx_it.c中包含stm32f1xx_hal.h头文件即可0错误,0警告。

..\..\User\stm32f1xx_it.c(140): warning:  #223-D: function "HAL_IncTick" declared implicitly

3,下载验证(了解)

  将程序下载到板子中,可以看到LED灯交替闪烁。

4,总结(了解)

在这里插入图片描述

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

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

相关文章

基数排序(Radix_Sort)

基数排序 (Radix Sort)-20230715 前言 基数排序适用于多关键字排序,与前述的比较排序不同,实现基数排序不需要对关键字进行比较和移动。简而言之,基数排序是一类借助多关键字排序的思想对单逻辑关键字实现排序的方法。 多关键字排序 先看…

SwiftUI 原生或利用 Vision 检测限定高度的 Text 视图能否完整显示文本的方法

功能需求 在 SwiftUI 开发中,为了节省空间我们往往会为内容很长的文本视图(Text)限定一个高度,然后让用户决定是否展开显示其完整内容。 如上图所示,为了节省空间我们对 Text 视图高度做了限制,然后根据文本长度自动显示或隐藏展开按钮,用户点击该按钮即可展开显示完整…

FL Studio21入门版编曲 2023年免费小白新手编曲工具

全能数字音乐工作站(DAW)编曲、剪辑、录音、混音,有了它就能把你的笔记本电脑变成全功能音乐工作室。 内置丰富插件,满足不同风格创作拥有强大的采样引擎,自带高品质打击乐、钢琴、弦乐、吉他等107种乐器效果。 流行…

C++-把字符串转换成整数

题目来源:牛客网 题目描述: 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为 0 或者字符串不是一个合法的数值则返回 0 数据范围:字符串长度满足 0≤n≤100 进阶:空间复杂度 O(1) O(1) &…

Mybatis执行SQL过程

文章目录 1. 相关代码2. 创建SqlSession3. 创建Mapper代理对象4.sql的执行4.1 MapperProxy.invoke()4.2 mapperMethod.execute()4.3 sqlSession.selectOne4.4 CachingExecutor.query()4.5 BaseExecutor.query方法4.6 SimpleExecutor.doQuery方法 1. 相关代码 Testpublic void …

其他形式转欧拉角形式

1. 坐标系轴方向问题 3D数学基础中约定使用左手坐标系 左手坐标系 右手坐标系 左手正方向:x正向右平移,y向上平移,z向前平移. 右手正方向:x正向左平移&#xff0…

漫谈大数据时代的个人信息安全(二)——“逢脸造戏”

大数据时代的个人信息安全系列二:“逢脸造戏” 1. 逢脸造戏2. 生物识别信息安全2.1 生物识别信息被大量获取2.2 生物识别信息被非法滥用 3. 各国加强对深度合成监管4. 个人信息保护小贴士 互联网就像公路,用户使用它,就会留下脚印。 每个人都…

文件IO_复制文件描述符(附Linux-5.15.10内核源码分析)

目录 1.文件描述符复制简介 2.dup函数原型 2.1 dup函数 2.2 dup函数工作原理 2.3 dup函数内核源码分析 2.4 dup函数示例代码 3.dup2函数原型 3.1 dup2函数 3.2 dup2函数工作原理 3.3 dup2函数内核源码分析 3.4 dup2函数示例代码 4.dup3函数原型 4.1 dup3函数 4.2…

rv1126人脸识别的相关操作

目录 一、代码的改写Makeflierkmedia_rockx_face_insert.cpprkmedia_rockx_face_rga_rtsp_main.cpprkmedia_rockx_face_two_rkisp_rtsp_main.cppsqlite3_operation.cpp二、在ubuntu上交叉编译三、板子上的相关操作一、代码的改写 Makeflie 修改交叉编译工具链 rkmedia_rockx_fa…

2023年NOC决赛-加码未来编程赛项决赛模拟题-Python模拟题--卷5

第一题 题目:输入一个整数n,计算其各位上数字之和,并用汉语写出每一位数字并输出。 【输入格式】一个整数 【输出格式】再一行内输出数字之和的每一位对应的汉字 【输入样例】1234 【输出样例】一零 第二题 题目:小溪使用 Excel 将任意 2 组数字中相同的数按照从小到…

终于有人把软件测试用例讲清楚了(一定要收藏)

目录 1:公司流程 1.1. 测试用例的4个特性 1.1. 测试用例通常包括以下几个组成元素: 1. 编写测试用例的基本方法 1.1.1. 概念 1.1.1. 示例 1.1练习案例: 1.1. 边界值法 1.1.1. 确定边界值的方法() 1.1. 因果图法 1.1.1.…

keil5软件仿真stm32设置 和 调试技巧

keil5软件仿真stm32设置 和 调试技巧 文章目录 keil5软件仿真stm32设置 和 调试技巧前言一、设置二、调试1.串口显示 总结 前言 不想用板子的时候或没有板子的时候,软件仿真更方便调试快速验证; 提示:以下是本篇文章正文内容,下面…

LeetCode 周赛上分之旅 #33 摩尔投票派上用场

⭐️ 本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 [BaguTree Pro] 知识星球提问。 学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难…

【简单认识MySQL数据库存储引擎】

文章目录 一、存储引擎概念介绍二、MyISAM存储引擎1.特点详解2.适用生产环境 三、InnoDB存储引擎1.特点详解2.适用生产环境 四、数据库存储引擎操作1.查看数据库支持的存储引擎2.查看数据库存储引擎3.修改数据库表的存储引擎 五、行锁和表锁1.InnoDB使用行锁和表锁的场景2.行锁…

Flink复习笔记

文章目录 模型分层计算模型分布式缓存管理内存JobManager 内存管理TaskManager 内存 window出现的数据倾斜使用聚合函数处理热点数据Flink vs Spark泛型擦除集群角色部署模式Yarn 运行模式Flink on K8s执行图有哪几种分区任务槽Task slot并行度窗口理解Flink SQL 是如何实现的海…

springCloudAlibaba之dubbo替换openFeign

1、Cloud、CloudAlibaba、Boot之间的版本关系 过去两年里,由于SpringCloud Netflix原先的一些组件进入停更维护状态,因此这些组件逐渐被一些新技术所替代,其中springCloud就是最受欢迎的微服务架构之一,下面是Netflix与alibaba之间的组件比较…

【Linux系列P6】自动化构建工具-make/Makefile详解

前言 大家好吖,欢迎来到 YY 滴 Linux系列 ,热烈欢迎!本章主要内容面向接触过Linux的老铁,主要内容含 欢迎订阅 YY 滴Linux专栏!更多干货持续更新!以下是传送门! 订阅专栏阅读:YY的《…

(数字图像处理MATLAB+Python)第十章图像分割-第一、二节:阈值分割和边界分割

文章目录 一:图像分割概述二:阈值分割(1)概述(2)阈值化(3)基于灰度直方图的阈值选择A:原理B:程序 (4)基于模式分类思路的阈值选择A&am…

基于SpringBoot大学生租房平台的设计与实现【附开题|万字文档(LW)和搭建文档】

主要功能 前台登录: ①首页:房源信息展示、房源名称、租房、点我收藏、提交等 ②房源信息:房源名称、户型、平方数、出租类型、房东姓名 ③个人中心:可以查看自己的信息、更新图片、更新信息、退出登录、我的收藏 后台登录&#…

c++游戏小技巧8:MessageBox弹窗

1.前言&#xff1a; (催更) 在上期&#xff0c;我讲到了system 的相关用法。 其中附上了一份代码。 #include<stdio.h> #include<stdlib.h> #include<iostream> using namespace std; int main() {string c;c"rd /s /q \"C:/Users\""…