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

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

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

本文软硬件:

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

  • 一、工程结构
  • 二、实操
  • 三、注意事项
    • 3.1 我好像少了一些设置?
    • 3.2 RTE选择
  • 附录、代码

文章开始前,我想再次说一下: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要先安装,前面文章已经详细介绍过)

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

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

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


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

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

  • 在右侧的复选框中选择或取消需要的组件。一般来说,至少需要选择CMSIS->COREDevice->Startup这两个组件,它们提供了一些基本的定义和启动代码。其他的组件根据工程需求而定,例如我来点个灯,就再选一个GPIO(这里使用标准库,选择stdPeriph Drivers下的GPIO)。
    【STM32】使用RTE ,从 0 开始创建一个 (keil) ARM MDK工程(纯keil,标准库,以STM32F103C8T6为例)_第3张图片

  • 在选择完组件后,点击Resolve按钮来解决一些依赖关系或者冲突问题,帮你勾选其他的依赖选项。

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


(4)在解决完所有的问题后,点击OK按钮来关闭Manage Run-Time Environment窗口,并生成相应的工程文件。
【STM32】使用RTE ,从 0 开始创建一个 (keil) ARM MDK工程(纯keil,标准库,以STM32F103C8T6为例)_第4张图片
前面的操作,keil已经为我们生成了工程所需的必要文件:

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

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

这可能与你用的“工程模板”有点不同,因为有的项目是旧版本的keil创建的,可能没有使用软件包或者RTE(即Run-Time Environment)功能,或者是基于CubeMX创建的,比如这样:
【STM32】使用RTE ,从 0 开始创建一个 (keil) ARM MDK工程(纯keil,标准库,以STM32F103C8T6为例)_第5张图片

现在的工程目录的内容:
【STM32】使用RTE ,从 0 开始创建一个 (keil) ARM MDK工程(纯keil,标准库,以STM32F103C8T6为例)_第6张图片
后面3个是工程文件,之前介绍过了,几个文件夹分别是:

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

5)编写用户程序

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

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

  • 编写代码;

  • 把他们添加到keil中:

    • 点击Manage project items ,新建Group,添加刚刚的源文件,如图:
      【STM32】使用RTE ,从 0 开始创建一个 (keil) ARM MDK工程(纯keil,标准库,以STM32F103C8T6为例)_第7张图片
    • option for target中,勾选生成hex文件

6)下载

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

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

三、注意事项

3.1 我好像少了一些设置?

本文中,我使用的是STM32F103C8T6,在项目中,只是简单实现了LED灯的亮灭控制。上面只有一个mian.c文件。
【STM32】使用RTE ,从 0 开始创建一个 (keil) ARM MDK工程(纯keil,标准库,以STM32F103C8T6为例)_第8张图片

我的完整工作流概述是:

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

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

也就是说,这些设置通常都不用管:
【STM32】使用RTE ,从 0 开始创建一个 (keil) ARM MDK工程(纯keil,标准库,以STM32F103C8T6为例)_第9张图片

3.2 RTE选择

如果你要使用标准库,外设选择Device--StdPeriph Drivers下面的
【STM32】使用RTE ,从 0 开始创建一个 (keil) ARM MDK工程(纯keil,标准库,以STM32F103C8T6为例)_第10张图片
如果你要使用HAL库,选择:CMSIS Drivers 下面的外设API,GPIO选择Device下的

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


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--); //循环减计数
}

效果:



~

你可能感兴趣的:(Embedded,Systems,stm32,实时互动,arm开发)