打印
[STM32F1]

使用RTE ,从 0 开始创建一个 (keil) ARM MDK工程

[复制链接]
1210|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
说一下: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个。

使用特权

评论回复
沙发
远芳侵古道|  楼主 | 2024-5-19 22:44 | 只看该作者
工程结构
在Keil环境中创建STM32工程时,通常遵循以下结构:

工程文件(Project Files):

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

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

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

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

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

调试信息文件(.axf、.elf):包含了调试器需要的符号信息和调试信息。
调试输出文件(.txt):包含了调试过程中的输出信息和日志。
除了上述文件之外,Keil工程中还可能包含其他辅助文件,如:

启动文件(startup_xxx.s):包含处理器的启动代码,初始化处理器和外设。
配置文件(xxx.h):包含各种配置选项和宏定义。
驱动文件(xxx.c、xxx.h):用于特定外设的驱动程序代码和头文件。
中断处理函数(xxx.c):处理中断请求的函数。
这个是为了方便你读别人的代码做的说明,你想怎样就怎样(但别随意),不过都大同小异。最核心的就是 用户程序+系统文件 (启动文件、驱动文件等等)。

使用特权

评论回复
板凳
远芳侵古道|  楼主 | 2024-5-19 22:45 | 只看该作者
本帖最后由 远芳侵古道 于 2024-5-19 22:53 编辑

实操。

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

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



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

使用特权

评论回复
地板
远芳侵古道|  楼主 | 2024-5-19 22:53 | 只看该作者
Manage Run-Time Environment是keil软件中用来管理软件组件的一个功能。可以在这个窗口中选择或取消需要的组件,例如CMSIS、Device、Middleware等。这些组件可以提供一些预编译的库文件、头文件、源代码等,方便开发STM32工程。

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

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


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

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

使用特权

评论回复
5
远芳侵古道|  楼主 | 2024-5-19 22:54 | 只看该作者
在解决完所有的问题后,点击OK按钮来关闭Manage Run-Time Environment窗口,并生成相应的工程文件。

前面的操作,keil已经为我们生成了工程所需的必要文件:

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

使用特权

评论回复
6
远芳侵古道|  楼主 | 2024-5-19 22:55 | 只看该作者
其中,带有黄色钥匙的文件,是无法修改的,并且不会显示在工程的文件夹中。当然,这些生成的文件通常都不需要修改。此外,有的文件还带有+号,可以展开,这体现了文件的包含关系,方便查看文件依赖。

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

使用特权

评论回复
7
远芳侵古道|  楼主 | 2024-5-19 22:55 | 只看该作者
现在的工程目录的内容:

后面3个是工程文件,之前介绍过了,几个文件夹分别是:

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

使用特权

评论回复
8
远芳侵古道|  楼主 | 2024-5-19 23:02 | 只看该作者
编写用户程序

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

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

编写代码;

把他们添加到keil中:

点击Manage project items ,新建Group,添加刚刚的源文件,如图:

在option for target中,勾选生成hex文件
(6)下载

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

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

使用特权

评论回复
9
远芳侵古道|  楼主 | 2024-5-19 23:04 | 只看该作者
注意事项
3.1 我好像少了一些设置?
本文中,我使用的是STM32F103C8T6,在项目中,只是简单实现了LED灯的亮灭控制。上面只有一个mian.c文件。


我的完整工作流概述是:

新建工程,选择型号;
配置RTE;
编写程序;
将程序添加到keil;
选择生成hex文件;
编译;
设置ST-Link下载;
Download。

使用特权

评论回复
10
远芳侵古道|  楼主 | 2024-5-19 23:05 | 只看该作者
由于我是使用RTE创建的工程,RTE会自动处理必要的包含路径和库文件,以确保正确的编译和链接过程。它会基于你在RTE配置向导中选择的设备和外设驱动程序,自动生成相应的配置文件,包括正确的包含路径。RTE也会根据你选择的设备和外设驱动程序自动生成相应的处理器符号和宏定义。

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

使用特权

评论回复
11
远芳侵古道|  楼主 | 2024-5-19 23:06 | 只看该作者
由于我是使用RTE创建的工程,RTE会自动处理必要的包含路径和库文件,以确保正确的编译和链接过程。它会基于你在RTE配置向导中选择的设备和外设驱动程序,自动生成相应的配置文件,包括正确的包含路径。RTE也会根据你选择的设备和外设驱动程序自动生成相应的处理器符号和宏定义。

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

使用特权

评论回复
12
远芳侵古道|  楼主 | 2024-5-19 23:06 | 只看该作者
附录、代码
简单的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--); //循环减计数
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

82

主题

842

帖子

0

粉丝