【07】STM32·HAL库开发-新建寄存器版本MDK工程 |下载STM32Cube固件包 | 新建MDK工程步骤

这篇具有很好参考价值的文章主要介绍了【07】STM32·HAL库开发-新建寄存器版本MDK工程 |下载STM32Cube固件包 | 新建MDK工程步骤。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

获取方式一:ST官网搜索STM32Cube+回车
stm32hal库 例程,# STM32-HAL库,stm32,单片机,嵌入式硬件,arm开发,C#
  这里以F1系列为例,点击【STM32CubeF1】
stm32hal库 例程,# STM32-HAL库,stm32,单片机,嵌入式硬件,arm开发,C#
  点击【Get Software】即可进行下载,首次下载需要注册邮箱,是免费的
stm32hal库 例程,# STM32-HAL库,stm32,单片机,嵌入式硬件,arm开发,C#
  这里下载最新的1.8.5版本为例进行后期章节编写。
stm32hal库 例程,# STM32-HAL库,stm32,单片机,嵌入式硬件,arm开发,C#

获取方式二:正点原子开发板A盘资料:A 盘→8,STM32 参考资料→1,STM32CubeXX固件包。
  固件包可以理解为一个软件包,里面包含了.h、.c、.s等文件封装了芯片内部设备,如果想开发或学习此款芯片,必须下载这些固件包才能去开发芯片,而ST公司将其芯片分为不同系列,比如MCU分为F1/F4/F7/H7等,不同的的系列,ST公司将软件资料封装为不同的软件包。

2.新建寄存器版本MDK工程步骤(熟悉)

2.1新建工程文件夹

1.新建工程文件夹:D/M/O/P/U文件夹,5个文件夹。
stm32hal库 例程,# STM32-HAL库,stm32,单片机,嵌入式硬件,arm开发,C#
  在桌面新建一个工程根目录文件夹,并在该文件夹里新建D/M/O/P/U文件夹:
stm32hal库 例程,# STM32-HAL库,stm32,单片机,嵌入式硬件,arm开发,C#
  拷贝/新建工程相关文件:在Drivers文件中创建三个文件夹,如果用到了SPI外设就可以在BSP中创建SPI文件夹,如果用到IIC、LED、LCD就可以创建IIC、LED、LCD文件夹。CMSIS、SYSTEM文件夹相对固定,CMSIS存放STMCube固件包中的代码。stm32hal库 例程,# STM32-HAL库,stm32,单片机,嵌入式硬件,arm开发,C#
  BSP是新建的;SYSTEM文件夹是拷贝正点原子F1系列开发板的【标准例程-寄存器版本】实验1跑马灯中的SYSTEM文件夹,当然也可以复制其他工程的;CMSIS是从下载的固件包中复制。

2.1.1Drivers文件夹

  固件库中主要用到【Device】和【include】两个文件夹,两个文件夹中的内容也不是全部用到,将以下两个文件复制到工程文件中【Drivers】->【CMSIS】,并选择保留用到的文件。
stm32hal库 例程,# STM32-HAL库,stm32,单片机,嵌入式硬件,arm开发,C#
  include文件夹保留以下内容:
stm32hal库 例程,# STM32-HAL库,stm32,单片机,嵌入式硬件,arm开发,C#

  在下图示目录下保留相关文件,选择启动文件时,f103是型号,而xe是Flash内存大小,代表大容量F103(256KB≤Flash≤512KB),还有f103x6代表小容量F103(Flash≤32KB)、f103xb代表中容量F103(64KB≤Flash≤128KB)、f103xg代表超大容量f103(768KB≤Flash≤1024KB)。自己使用的板子为F103RCT6的FLASH内存是256KB所以选该型号。
stm32hal库 例程,# STM32-HAL库,stm32,单片机,嵌入式硬件,arm开发,C#
  对应的头文件目录中保留以下文件:
stm32hal库 例程,# STM32-HAL库,stm32,单片机,嵌入式硬件,arm开发,C#

2.1.2Middlewares文件夹

  该文件夹用于存放正点原子和其他第三方提供的中间层代码(组件/Lib 等),如: USMART、MALLOC、 TEXT、 FATFS、 USB、 LWIP、各种 OS、各种 GUI 等。(新建工程暂时留空,后续增加功能再往该文件夹中添加)。

2.1.3Output文件夹

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

2.1.4Projects文件夹

  该文件夹用于存放编译器(MDK、 IAR 等)工程文件,我们主要用 MDK,为了方便区分,我们在该文件夹下新建: MDK-ARM 文件夹,用于存放 MDK 的工程文件。
stm32hal库 例程,# STM32-HAL库,stm32,单片机,嵌入式硬件,arm开发,C#

2.1.4User文件夹

  该文件夹用于存放用户编写的代码,如: main.c 等。(后续步骤添加main.c

2.2新建一个工程框架

2.2.1新建并保存工程

  打开Keil5,【Project】->【New uVision Project】->选择保留到新创建的MDK-ARM文件夹中,并命名。

2.2.2选择主控型号

  在跳出的窗口中选择自己芯片的型号。
stm32hal库 例程,# STM32-HAL库,stm32,单片机,嵌入式硬件,arm开发,C#

  此页面不需要配置,点击Cancel。
stm32hal库 例程,# STM32-HAL库,stm32,单片机,嵌入式硬件,arm开发,C#
  在保存路径中生成了2个文件夹,具体功能如下(保存工程只生成两个文件夹,没有DebugConfig和MDK的版本有关。):
stm32hal库 例程,# STM32-HAL库,stm32,单片机,嵌入式硬件,arm开发,C#

2.2.3删除文件夹

  在保存路径中删除以下文件:
stm32hal库 例程,# STM32-HAL库,stm32,单片机,嵌入式硬件,arm开发,C#

2.3添加文件

2.3.1设置工程名和分组名

stm32hal库 例程,# STM32-HAL库,stm32,单片机,嵌入式硬件,arm开发,C#
或者右击“Target1”。
stm32hal库 例程,# STM32-HAL库,stm32,单片机,嵌入式硬件,arm开发,C#
工程名:Template;分组名:Startup,User,Drivers/SYSTEM,Readme
stm32hal库 例程,# STM32-HAL库,stm32,单片机,嵌入式硬件,arm开发,C#

2.3.2添加启动文件

  添加文件有两种方式,1是在设置工程名和组名页面直接添加
stm32hal库 例程,# STM32-HAL库,stm32,单片机,嵌入式硬件,arm开发,C#
  2是直接双击分组名。
stm32hal库 例程,# STM32-HAL库,stm32,单片机,嵌入式硬件,arm开发,C#
  选择启动文件所在目录,文件类型选择All files。分组名前有“+”,证明添加成功。

stm32hal库 例程,# STM32-HAL库,stm32,单片机,嵌入式硬件,arm开发,C#
  需要修改启动文件2个地方,1是用不到编译器的内存管理函数,为了节省内存,将Heap_Size改成0(如果不能对启动文件进行修改,需要修改文件属性,把【只读】选项前面的勾去掉)。

Stack_Size      EQU     0x00000000

stm32hal库 例程,# STM32-HAL库,stm32,单片机,嵌入式硬件,arm开发,C#

  2是寄存器代码不需要SystemInit函数,因此修改Reset_Handler函数,去掉SystemInit调用,用分号“;”注释掉3行内容:

Reset_Handler   PROC
                EXPORT  Reset_Handler             [WEAK]
                IMPORT  __main
                ;IMPORT  SystemInit
                ;LDR     R0, =SystemInit
                ;BLX     R0               
                LDR     R0, =__main
                BX      R0
                ENDP

2.3.3添加SYSTEM源码

  由于分组名没有下一级,所以用斜杠来代表所属。
stm32hal库 例程,# STM32-HAL库,stm32,单片机,嵌入式硬件,arm开发,C#

2.4添加Readme分组文件

  可以在工厂根目录下创建Readme.txt工程的说明文件,然后加入到工程中。
stm32hal库 例程,# STM32-HAL库,stm32,单片机,嵌入式硬件,arm开发,C#
stm32hal库 例程,# STM32-HAL库,stm32,单片机,嵌入式硬件,arm开发,C#

2.4魔术棒设置

2.4.1Target 选项卡

  外部高速晶振频率为8MHz(需要查看自己具体的板子),设置使用的编译器版本(新版MDK不需要修改,旧版设置为AC5)。
stm32hal库 例程,# STM32-HAL库,stm32,单片机,嵌入式硬件,arm开发,C#

2.4.2Output 选项卡

  设置Objects输出文件夹为工程中的Output文件夹,勾选【Creat HEX File】生成.hex文件、输出浏览信息。
stm32hal库 例程,# STM32-HAL库,stm32,单片机,嵌入式硬件,arm开发,C#
  删除工程文件夹中以下两个文件夹:
stm32hal库 例程,# STM32-HAL库,stm32,单片机,嵌入式硬件,arm开发,C#

2.4.3Listing 选项卡

  设置Listing输出文件夹为工程中Output文件夹。
stm32hal库 例程,# STM32-HAL库,stm32,单片机,嵌入式硬件,arm开发,C#

2.4.4C/C++ 选项卡

  设置全局宏定义为STM32F103xE(其他型号芯片需要根据型号具体修改)、优化等级设置为Level0(默认等级为Level0,选择default和Level0是相同的作用,等级0可以达到最好的调试效果,否则会将没有用到的变量给优化掉,在调试时使用等级0,如果是为了提升代码性能、降低代码量、减少使用内存,可以设置等级1-3,数字越大效果越容易出现问题。)、勾选C99 Mode、设置头文件包含路径。
stm32hal库 例程,# STM32-HAL库,stm32,单片机,嵌入式硬件,arm开发,C#
  此处的头文件路径时是设置的相对路径,后期不用再进行修改。

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

1,默认路径就是指 MDK 工程所在的路径,即.uvprojx 文件所在路径(文件夹)(相对路径也就是相对于以下路径
stm32hal库 例程,# STM32-HAL库,stm32,单片机,嵌入式硬件,arm开发,C#

2,“./”表示当前目录(相对当前路径,也可以写做“.\”)
3,“…/”表示当前目录的上一层目录(也可以写做“…\”)

2.4.5Debug 选项卡

  设置使用的仿真器类型(这里我使用ST-Link的下载方式)、勾选相关选项、选择的下载接口为SW模式并将时钟设置为最大。
stm32hal库 例程,# STM32-HAL库,stm32,单片机,嵌入式硬件,arm开发,C#

2.4.6Utilities 选项卡

  设置下载功能勾选【Use Debug Driver】并在Setting中勾选【Reset and Run】。
stm32hal库 例程,# STM32-HAL库,stm32,单片机,嵌入式硬件,arm开发,C#
  下载算法(默认已经添加好,如果不见了可以点击【Add】进行添加),下载算法起始地址和大小(默认即可)。
stm32hal库 例程,# STM32-HAL库,stm32,单片机,嵌入式硬件,arm开发,C#

2.4.7Linker 选项卡(可选)

  添加分散加载文件(北极星/MiniPro H750)。这里以添加MiniPro H750为例,取消勾选【Use Memory Layout from Target Dialog】,并且在【disable Warning】栏屏蔽6314和6329警告,填写“6314,6329”,点击三个点选择分类加载文件,在正点原子例程中,该文件放置在User\SCRIPT文件夹中,查看分类加载文件就点击Edit,正点原子的分类加载文件是AC5和AC6兼容的,关键看文件第一行是什么,如果是#! armcc - E那就就是兼容AC5,如果改为兼容AC6,需要把第二行提到第一行,不能用分号“;”注释第一行再启用第二行。
stm32hal库 例程,# STM32-HAL库,stm32,单片机,嵌入式硬件,arm开发,C#

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

  创建main.c文件并保存到工程User文件夹中。
stm32hal库 例程,# STM32-HAL库,stm32,单片机,嵌入式硬件,arm开发,C#
  添加到User分组,然后并拷贝代码到main.c中。
stm32hal库 例程,# STM32-HAL库,stm32,单片机,嵌入式硬件,arm开发,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++;
    }
}

3.下载验证(了解)

  将程序下载到开发板,用串口助手打开相应串口,点击开发板的复位按钮即可出现,每隔500ms打印一次变量t的值,t最大为255。
stm32hal库 例程,# STM32-HAL库,stm32,单片机,嵌入式硬件,arm开发,C#

4.总结(了解)

  正点原子工程中的keilkill.bat文件会将Output文件夹中没用到的文件进行删除。
stm32hal库 例程,# STM32-HAL库,stm32,单片机,嵌入式硬件,arm开发,C#文章来源地址https://www.toymoban.com/news/detail-667158.html

到了这里,关于【07】STM32·HAL库开发-新建寄存器版本MDK工程 |下载STM32Cube固件包 | 新建MDK工程步骤的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32G4 比较器COMPx(寄存器开发)

    STM内部的比较器是模拟量的比较器,其与APB2时钟同步,在RCC时钟控制器中没有COMx时钟使能标志位,其时钟的使能与复位与SYSCLK同步。 比较器的输入端有正负极信号,正极INP通过INPSEL选择输入信号,负极通过INMSEL选择输入信号,其SEL引脚定义如下图表所示。 滞回英文 Hystere

    2024年02月12日
    浏览(21)
  • STM32 | STM32时钟分析、GPIO分析、寄存器地址查找、LED灯开发(第二天)

    寄存器 :寄存器的功能是存储二进制代码,它是由具有存储功能的触发器组合起来构成的。一个触发器可以存储1位二进制代码,故存放n位二进制代码的寄存器,需用n个触发器来构成 在计算机领域,寄存器是CPU内部的元件,包括通用寄存器、专用寄存器和 控制寄存器 。寄存

    2024年03月08日
    浏览(23)
  • 使用clion配合STM32CubeMX开发stm32(包含断点调试,查看寄存器值,printf重定向)

    在嵌入式领域中开发以ARM公司的Cortex M内核为代表的单片机时程序员使用最多的IDE一定是Keil公司的MDK4 MDK5,而Keil已经脱离现代智能IDE,近年来IAR逐步向现代智能IDE靠近但还不足,一些芯片原厂提供了基于eclipse改装版IDE,这些工具在调试方面有优势,比如查看外设寄存器,内

    2024年04月24日
    浏览(21)
  • stm32的BRR寄存器和BSRR寄存器

    1、BRR---   bit   RESET(置0)  register   //高16位无,低16位置1为0,不能写1 2 、BSRR---   bit   SET(设置1或0)       register   //低16位设置1为0 BSRR:用于低16位的作用是让指定的IO口置1;而高16位的作用是让指定的IO口置0。  

    2024年02月11日
    浏览(22)
  • STM32之寄存器

    在学习STM32之前有必要了解一下ARM架构,以下相关ARM架构的知识来自百度百科​:​ ARM架构,曾称进阶精简指令集机器(Advanced RISC Machine)更早称作Acorn RISC Machine,是一个32位精简指令集(RISC)架构。还有基于ARM设计的派生产品,重要产品包括Marvell的XScale架构和德州仪器的

    2024年02月22日
    浏览(24)
  • STM32寄存器点亮LED灯

     这个灯是 PB5引脚 看原理图可以看出 让GPIOB5输出低电平 就能点亮 那么我们得让 打开控制GPIOB5的时钟 让GPIOB5 输出模式 让GPIOB5低电平 时钟就相当于一个阀门开关,或者理解成水龙头,你打开了 才有水出来,也就是你打开才能工作。 看中文参考手册 系统架构 找到你的GPIO

    2024年02月07日
    浏览(25)
  • STM32 入门 —— 寄存器与 GPIO

    STM32 总线构图: 什么是寄存器 根据百度百科介绍,寄存器是中央处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。简单来说,寄存器就是存放东西的东西,存放的东西是指令、数据或地址 存放数据的寄存器最容易理解,不同

    2024年02月04日
    浏览(27)
  • STM32存储器映射以及寄存器映射

    目录 1.STM32的寻址范围? 2.存储器映射 3.存储器功能划分(以STM32F1为例) 4.寄存器映射 1.32位单片机有32根地址线,每根地址线有两种状态,导通或者不导通。 2.单片机内存地址访问的存储单元是按字节编址的,而不是bit。 比如我们要访问0x01这个地址,访问的其实是一个字节的空

    2024年04月23日
    浏览(23)
  • STM32-ADC电压采样实验(寄存器版)

    STM32F10X系列支持三路ADC,其ADC通道及对应IO口如下表所示: 其能接受的电压输入范围一般为0-3.3V(V REF- ≤ V IN ≤ V REF+ ),因此,如果需要测量超出0-3.3v量程范围的电压数据,需要在外围硬件增加分压电阻,将电路转换到0-3.3V量程范围内再进行采集。 这里用于做ADC采集的引脚使

    2024年02月15日
    浏览(29)
  • STM32 寄存器配置笔记——GPIO配置输出

           本文主要介绍GPIO 作为输出时的寄存器配置。包括时钟配置,输出模式配置。以STM32F10xxx系列为例,配置PA8、PD2端口作为输出,输出高/低电平。         1)GPIO外设时钟          通过查找STM32F10xxx中文参考手册得知,GPIO PORT口的时钟配置在RCC_APB2ENR寄存器的第2~6位,

    2024年01月24日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包