【STM32】使用RTE ,从 0 开始创建一个 (keil) ARM MDK工程(纯keil,标准库,以STM32F103C8T6为例)

2023-07-16 23:30:40

学习相关的基础知识请阅读本专栏其他文章,一定有你想要的。

https://blog.csdn.net/weixin_43764974/category_11021363.html

本文软硬件:

  • STM32F103C8T6
  • ARM MDK 5.38
  • ARM complier 6
  • ST-Link v2
  • StdPeriph Drivers(标准库)

文章开始前,我想再次说一下:keilμvisionARM MDK这几个名词(尽管前面的额文章已经说过好几次了)

  • Keil是一家德国公司,提供了一系列用于嵌入式系统开发的软件工具。其中,Keil MDK(Microcontroller Development Kit)是Keil推出的一套集成开发环境(IDE),用于开发基于ARM处理器的嵌入式应用程序。

  • μVision(MicroVision)是Keil MDK的核心组件,是一个强大的集成开发环境,提供了代码编辑、编译、调试、仿真和烧录等功能。μVision作为Keil MDK的前端工具,为用户提供了友好的图形界面和便捷的开发体验。

  • ARM MDK(ARM Microcontroller Development Kit)是由ARM公司授权Keil开发的一套完整的软件开发工具套件。它结合了Keil的软件开发工具和ARM提供的CMSIS(Cortex Microcontroller Software Interface Standard)等软件库,用于开发基于ARM Cortex-M系列处理器的嵌入式系统。

通常,用 keil 代指上面3个。

一、工程结构

在Keil环境中创建STM32工程时,通常遵循以下结构:

  1. 工程文件(Project Files)

    • 工程文件.uvprojx):Keil工程的主文件,保存了工程的设置和配置信息。
    • 工程选项文件.uvoptx):保存了编译器、链接器和调试器的配置选项。
    • 工程配置文件.uvproj.user):保存了工程的用户配置选项,如源文件列表、编译选项等(这里的user是你创建工程时的Windows用户名)。
  2. 源文件(Source Files)

    • C/C++源文件(.c、.cpp):包含应用程序的主要源代码。
    • 汇编源文件(.s):可选的汇编语言文件,用于特定的处理器指令或启动代码。
    • 头文件(.h):包含各种配置和宏定义。
  3. 库文件(Library Files)

    • STM32标准外设库(.a):包含STM32芯片的标准外设库文件,提供了访问STM32外设的函数和常量。
    • 第三方库文件:如果你使用了第三方库(如FreeRTOS、CMSIS等),这些库的文件也可以放在此处。
  4. 中间文件(Intermediate Files)

    • 目标文件(.o):编译源文件生成的目标文件,用于后续的链接操作。
    • 列表文件(.lst):包含了编译后的汇编代码,可以用于调试和分析。
  5. 输出文件(Output Files)

    • 可执行文件(.axf、.elf):链接器将目标文件链接成可执行文件,用于烧录到STM32芯片上运行。
    • HEX文件(.hex):可执行文件的十六进制格式,常用于烧录器烧录。
    • BIN文件(.bin):可执行文件的二进制格式,也常用于烧录器烧录。
  6. 调试文件(Debug Files)

    • 调试信息文件(.axf、.elf):包含了调试器需要的符号信息和调试信息。
    • 调试输出文件(.txt):包含了调试过程中的输出信息和日志。

除了上述文件之外,Keil工程中还可能包含其他辅助文件,如:

  • 启动文件(startup_xxx.s):包含处理器的启动代码,初始化处理器和外设。
  • 配置文件(xxx.h):包含各种配置选项和宏定义。
  • 驱动文件(xxx.c、xxx.h):用于特定外设的驱动程序代码和头文件。
  • 中断处理函数(xxx.c):处理中断请求的函数。

这个是为了方便你读别人的代码做的说明,你想怎样就怎样(但别随意),不过都大同小异。最核心的就是 用户程序+系统文件 (启动文件、驱动文件等等)。

二、实操

关于keil的详细介绍,可以看本专栏之前的文章。

(1)点击project—>new μVision project,选择一个工程的保存位置

(2)选择设备:STM32F103C8(这里的pack要先安装,前面文章已经详细介绍过)

在这里插入图片描述

(3)点击 OK会弹出一个运行时的配置界面

在这里插入图片描述


Manage Run-Time Environment是keil软件中用来管理软件组件的一个功能。可以在这个窗口中选择或取消需要的组件,例如CMSIS、Device、Middleware等。这些组件可以提供一些预编译的库文件、头文件、源代码等,方便开发STM32工程。

  • 在弹出的Manage Run-Time Environment窗口中,你可以在左侧的树状列表中看到不同类别的组件,例如CMSIS、Device、Middleware等。右侧显示了对应的描述、版本、文档等信息。

  • 在右侧的复选框中选择或取消需要的组件。一般来说,至少需要选择CMSIS->COREDevice->Startup这两个组件,它们提供了一些基本的定义和启动代码。其他的组件根据工程需求而定,例如我来点个灯,就再选一个GPIO(这里使用标准库,选择stdPeriph Drivers下的GPIO)。
    在这里插入图片描述

  • 在选择完组件后,点击Resolve按钮来解决一些依赖关系或者冲突问题,帮你勾选其他的依赖选项。 (如果你只知道要使用GPIO,不知道还要勾选其他的什么,就只选一个GPIO然后让系统自动勾选)

在之后的开发中,你依旧可以点击工具栏的绿色菱形来选择需要的组件。


(4)在解决完所有的问题后,点击OK按钮来关闭Manage Run-Time Environment窗口,并生成相应的工程文件。
在这里插入图片描述
前面的操作,keil已经为我们生成了工程所需的必要文件:

  • 系统初始化文件:system_stm32f10x.c,包含了一些系统初始化函数的定义。
  • 启动文件:startup_stm32f10x_md.s,包含了复位向量表和复位处理函数的定义。
  • GPIO驱动:stm32f10x_gpio.c,可以在这个文件中查看GPIO驱动的功能和参数。
  • 等等。

其中,带有黄色钥匙的文件,是无法修改的,并且不会显示在工程的文件夹中。当然,这些生成的文件通常都不需要修改。此外,有的文件还带有+号,可以展开,这体现了文件的包含关系,方便查看文件依赖。

这可能与你用的“工程模板”有点不同,因为有的项目是旧版本的keil创建的,可能没有使用软件包或者RTE(即Run-Time Environment)功能,或者是基于CubeMX创建的,比如这样:
在这里插入图片描述

现在的工程目录的内容:
在这里插入图片描述
后面3个是工程文件,之前介绍过了,几个文件夹分别是:

  • RTE:这个文件夹包含了你选择的软件组件的配置文件、头文件和源文件。您可以在这里查看或修改您的组件设置和代码。
  • DebugConfig:这个文件夹包含了你的调试配置文件,例如目标设置、调试器设置、跟踪设置等。可以在这里查看或修改调试参数。
  • Listings:这个文件夹包含了工程编译后生成的汇编代码、符号表、映射文件等。可以在这里查看或分析您的编译结果。
  • Objects:这个文件夹包含了工程编译后生成的目标文件、库文件、可执行文件等。

5)编写用户程序

  • 可以在工程文件夹中新建一个用户程序文件夹,比如User

  • 然后新建文件,另存为.c文件,保存到刚才的文件;

  • 编写代码;

  • 把他们添加到keil中:

    • 点击Manage project items ,新建Group,添加刚刚的源文件,如图:
      在这里插入图片描述
    • option for target中,勾选生成hex文件

6)下载

我使用ST-Link下载的,如果不会可以看我之前的文章:

【STM32】自举模式 和 程序下载(ST-Link和串口示例)

三、注意事项

3.1 我好像少了一些设置?

本文中,我使用的是STM32F103C8T6,在项目中,只是简单实现了LED灯的亮灭控制。上面只有一个mian.c文件。
在这里插入图片描述

我的完整工作流概述是:

  1. 新建工程,选择型号;
  2. 配置RTE;
  3. 编写程序;
  4. 将程序添加到keil;
  5. 选择生成hex文件;
  6. 编译;
  7. 设置ST-Link下载;
  8. Download。

由于我是使用RTE创建的工程,RTE会自动处理必要的包含路径和库文件,以确保正确的编译和链接过程。它会基于你在RTE配置向导中选择的设备和外设驱动程序,自动生成相应的配置文件,包括正确的包含路径。RTE也会根据你选择的设备和外设驱动程序自动生成相应的处理器符号和宏定义。

也就是说,这些设置通常都不用管(当然,如果你自己编写了头文件,可能需要指定包含路径):
在这里插入图片描述

3.2 RTE中驱动库API的选择

【必看】如何选择SPL库、HAL库、LL库?详细的介绍看新文章:https://blog.csdn.net/weixin_43764974/article/details/132416118

CMSIS DriverARM 公司定义的通用驱动接口标准,用于各种 Cortex-M 微控制器的外设控制。它提供了一致的编程接口和移植性,使得驱动代码可以在不同厂商的微控制器之间共享和重用。STMicroelectronics 提供了符合 CMSIS Driver 标准的驱动实现,以便与其 STM32 系列微控制器兼容。

HAL (Hardware Abstraction Layer)STMicroelectronics 提供的一种高层次的库,用于 STM32 微控制器的外设编程。HAL 提供了对 STM32 系列特定外设的功能函数和配置选项,使得开发人员可以相对简单地编写和控制外设。HAL 位于 CMSIS Driver 之上,使用 CMSIS Driver 提供的底层接口进行外设的控制。

stdPeriph Drivers 是由 STMicroelectronics 提供的旧版外设驱动库。stdPeriph Drivers 提供了较高层次的 API,使编程相对简单,但对于不同系列的 STM32 微控制器,其外设功能和寄存器定义可能有所差异。

附录、代码

简单的LED闪烁,标准库:

复制后如果中文乱码,修改编码为UTF-8即可。

#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"

void LED_Init(void); //LED初始化函数声明
void Delay(uint32_t nCount); //延时函数声明

int main(void)
{
  LED_Init(); //调用LED初始化函数
  while (1)
  {
    GPIO_ResetBits(GPIOC, GPIO_Pin_13); //将PC13置低,点亮LED
    Delay(0x0FFFFF); //延时一段时间
    GPIO_SetBits(GPIOC, GPIO_Pin_13); //将PC13置高,熄灭LED
    Delay(0x0FFFFF); //延时一段时间
  }
}


void LED_Init(void) //LED初始化函数定义
{
  GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO初始化结构体变量
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //使能GPIOC端口时钟
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; //选择PC13引脚
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置为推挽输出模式
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置IO口速度为50MHz
  GPIO_Init(GPIOC, &GPIO_InitStructure); //根据参数初始化GPIOC
  GPIO_SetBits(GPIOC, GPIO_Pin_13); //将PC13置高,熄灭LED
}

void Delay(uint32_t nCount) //延时函数定义
{
  for(; nCount != 0; nCount--); //循环减计数
}

效果:

在这里插入图片描述



~

更多推荐

力扣常见算法题

LeetCode上的问题可以有很多不同的解题思路,具体的解法取决于问题的要求和限制条件。以下是一些常见的解题思路和Python代码示例:文章目录思路1.暴力法(BruteForce):2.哈希表(HashTable):3.双指针(TwoPointers):4.动态规划(DynamicProgramming):例题1.两

【第43篇】CLIP:从自然语言监督中学习可迁移的视觉模型

摘要最先进的计算机视觉系统被训练来预测一组固定的预定对象类别。这种受限制的监督形式限制了它们的通用性和可用性,因为需要额外的标记数据来指定任何其他视觉概念。直接从有关图像的原始文本中学习是一种很有前途的替代方案,它利用了更广泛的监督来源。我们证明了预测哪个标题与哪个图像搭配的简单预训练任务是一种有效且可扩展的方式,可以

华纳云:Ubuntu中怎么配置lamp环境

LAMP(Linux、Apache、MySQL、PHP)是一种常用于搭建Web服务器的开发环境。在Ubuntu中配置LAMP环境相对简单,以下是配置的基本步骤:安装ApacheWeb服务器:打开终端,运行以下命令安装Apache:sudoaptupdatesudoaptinstallapache2安装完成后,启动Apa

使用 PyTorch 的计算机视觉简介 (3/6)

一、说明在本单元中,我们将了解卷积神经网络(CNN),它是专门为计算机视觉设计的。卷积层允许我们从图像中提取某些图像模式,以便最终分类器基于这些特征。二、卷积神经网络计算机视觉不同于通用分类,因为当我们试图在图片中找到某个物体时,我们正在扫描图像以寻找一些特定的图案及其组合。比如在寻找猫的时候,我们首先可能会寻找水平线

​重生奇迹MU魔剑士玩转攻略​

大家都知道重生奇迹MU中有很多职业,比如魔法师、弓箭手、剑士等等,并且后续版本又推出了其他职业。根据职业加点不同又有很多方向,像魔剑士便是剑士的一个发展分支。如何玩好奇迹魔剑士?那么玩魔剑士应该怎么玩呢,我们玩家应该怎么去好游戏之中的魔剑士呢,在加点方面需要注意什么呢,这些问题对于每一个玩家都应该思考一下。如果玩家想要

绘图(一)弹球小游戏

AWT编程·语雀仓库:Java图形化界面:Java图形化界面学习demo与资料(gitee.com)很多程序如各种小游戏都需要在窗口中绘制各种图形,除此之外,即使在开发JavaEE项目时,有时候也必须"动态"地向客户端生成各种图形、图表,比如图形验证码、统计图等,这都需要利用AWT的绘图功能。组件绘图原理之前我们已经学

高通8295中国首发!智舱再度上演「军备竞赛」,这次有何不同

对于智能座舱来说,上一轮市场红利已经接近尾声。高工智能汽车研究院监测数据显示,2023年1-6月中国市场(不含进出口)乘用车前装标配中控娱乐系统交付856.13万辆,前装标配渗透率已经超过90%,达到92.13%。其中,支持车联网功能主机占比也已经超过80%,达到83.03%。这意味着,车企需要尽快构建下一代座舱的差异

“智能制造进园区·浙江站和专家行”活动成功举办

为进一步加强央地联动,强化智能制造系统推进格局,促进重点区域行业智能制造供需对接,2023年9月12日-15日,在工业和信息化部装备工业一司指导下,由国家智能制造专家委员会、浙江省经济和信息化厅、智能制造系统解决方案供应商联盟、中国电子技术标准化研究院、温州市人民政府主办,瑞安市人民政府、温州市经济和信息化局、浙江省技

不得不爱的AI艺术写真头像二维码生成小程序开发

最近什么最火?AI最火!AI里什么最火?艺术写真生成和二维码美化最火。一款小程序集合了高还原度的AI写真艺术照和二维码美化,你们说香还是不香?并且加入了输入心愿就能生成独一无二的个性头像功能,直接拿捏年轻人的心。为了方便小程序运营中裂变效果好,更是加入了分销机制,分享小程序不仅能跟小伙伴分享制作写真的快乐,还能顺带恰点

算法----数组常见知识点

1.在Java中,数组可以分为以下几种类型:一维数组:一维数组是最常见的数组类型,它包含一系列具有相同数据类型的元素。数组中的每个元素可以通过索引访问,索引从0开始。二维数组:二维数组是由一维数组组成的数组。它可以被看作是一个表格或者矩阵,其中的元素可以通过两个索引进行访问。每个元素都是由行索引和列索引确定的。多维数组

【实训项目】你好,教练-校园私教平台的设计与开发

1.设计摘要随着社会的进步,人们的健康意识逐渐提高,越来越多的人选择在闲暇时间健身,在大学生群体中,这一现象犹为明显。在大学城内,有多家健身房供同学选择,也有许多同学选择在操场或者宿舍内自己健身,全民健身已经逐渐成为一种潮流。在2018年,国家体育总局近日推出解决群众健身难的十项举措,包括建设一批健身步道、建设一批体育

热文推荐