赞
踩
学习相关的基础知识请阅读本专栏其他文章,一定有你想要的。
https://blog.csdn.net/weixin_43764974/category_11021363.html
本文软硬件:
- STM32F103C8T6
- ARM MDK 5.38
- ARM complier 6
- ST-Link v2
- StdPeriph Drivers(标准库)
文章开始前,我想再次说一下:keil
、μvision
、ARM 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工程时,通常遵循以下结构:
工程文件(Project Files):
.uvprojx
):Keil工程的主文件,保存了工程的设置和配置信息。.uvoptx
):保存了编译器、链接器和调试器的配置选项。.uvproj.user
):保存了工程的用户配置选项,如源文件列表、编译选项等(这里的user是你创建工程时的Windows用户名)。源文件(Source Files):
库文件(Library Files):
中间文件(Intermediate Files):
输出文件(Output Files):
调试文件(Debug Files):
除了上述文件之外,Keil工程中还可能包含其他辅助文件,如:
这个是为了方便你读别人的代码做的说明,你想怎样就怎样(但别随意),不过都大同小异。最核心的就是 用户程序+系统文件 (启动文件、驱动文件等等)。
关于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->CORE
和Device->Startup
这两个组件,它们提供了一些基本的定义和启动代码。其他的组件根据工程需求而定,例如我来点个灯,就再选一个GPIO
(这里使用标准库,选择stdPeriph Drivers下的GPIO)。
在选择完组件后,点击Resolve
按钮来解决一些依赖关系或者冲突问题,帮你勾选其他的依赖选项。 (如果你只知道要使用GPIO,不知道还要勾选其他的什么,就只选一个GPIO然后让系统自动勾选)
在之后的开发中,你依旧可以点击工具栏的绿色菱形来选择需要的组件。
(4)在解决完所有的问题后,点击OK按钮来关闭Manage Run-Time Environment窗口,并生成相应的工程文件。
前面的操作,keil已经为我们生成了工程所需的必要文件:
system_stm32f10x.c
,包含了一些系统初始化函数的定义。startup_stm32f10x_md.s
,包含了复位向量表和复位处理函数的定义。stm32f10x_gpio.c
,可以在这个文件中查看GPIO驱动的功能和参数。其中,带有黄色钥匙的文件,是无法修改的,并且不会显示在工程的文件夹中。当然,这些生成的文件通常都不需要修改。此外,有的文件还带有+号,可以展开,这体现了文件的包含关系,方便查看文件依赖。
这可能与你用的“工程模板”有点不同,因为有的项目是旧版本的keil创建的,可能没有使用软件包或者RTE(即Run-Time Environment)功能,或者是基于CubeMX创建的,比如这样:
现在的工程目录的内容:
后面3个是工程文件,之前介绍过了,几个文件夹分别是:
(5)编写用户程序
可以在工程文件夹中新建一个用户程序文件夹,比如User
;
然后新建文件,另存为.c文件,保存到刚才的文件;
编写代码;
把他们添加到keil中:
Manage project items
,新建Group,添加刚刚的源文件,如图:option for target
中,勾选生成hex
文件(6)下载
我使用ST-Link下载的,如果不会可以看我之前的文章:
【STM32】自举模式 和 程序下载(ST-Link和串口示例)
本文中,我使用的是STM32F103C8T6,在项目中,只是简单实现了LED灯的亮灭控制。上面只有一个mian.c文件。
我的完整工作流概述是:
由于我是使用RTE创建的工程,RTE会自动处理必要的包含路径和库文件,以确保正确的编译和链接过程。它会基于你在RTE配置向导中选择的设备和外设驱动程序,自动生成相应的配置文件,包括正确的包含路径。RTE也会根据你选择的设备和外设驱动程序自动生成相应的处理器符号和宏定义。
也就是说,这些设置通常都不用管(当然,如果你自己编写了头文件,可能需要指定包含路径):
【必看】如何选择SPL库、HAL库、LL库?详细的介绍看新文章:https://blog.csdn.net/weixin_43764974/article/details/132416118
CMSIS Driver
是 ARM
公司定义的通用驱动接口标准,用于各种 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--); //循环减计数 }
效果:
把 永 远 爱 你 写 进 诗 的 结 尾 ~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。