手把手教学一文在Keil5创建工程模版(以STM32F103C8T6点灯为例)

发布时间:2023年12月17日

目录

一、创建工程文件夹

二、在Keil5中新建工程

三、如何新建文件

四、添加文件夹与文件到工程里

方法一(少量文件添加推荐):直接在左侧"Project"添加

方法二(批量文件添加推荐):在上侧找到像"品"字的图标

五、导入STM32F10x固件库文件

方法一:在我的资源里直接白嫖

方法二:手动收集

六、把刚刚收集的固件库文件分类添加到工程里

七、MDK工程配置

八、修改stm32f10x_conf.h文件

九、编写main.c

十、点灯实验


一、创建工程文件夹

? ? ? ? 在任意盘下先新建一个文件夹,可命名格式为项目名+版本号+主题内容,如下图我命名为"ProjectTemplate_v1_0_0_工程模版"。接着在里面再新建两个文件夹"Drivers"与"MDK","Drivers"用于存放程序文件,"MDK"用于存放MDK的工程文件。把程序文件与工程文件分开,是因为考虑到后续可能使用不同的IDE,如"VScode"、"IAR"等,有利于项目文件的整理;


二、在Keil5中新建工程

? ? ? ? 打开Keil5,在上方找到"Project",然后点击"New μVision Project..."

? ? ? ? 找到刚刚创建好的文件夹"MDK",然后填写工程名字,接着点击"保存";

? ? ? ? 选择芯片,在"STMicroelectronics"类别中找到并点击选择"STM32F103C8",然后点击"OK"。如果没有目标芯片,那就是没有下载对应固件支持包,先移步到手把手教学一文安装Keil5(MDK)固件支持包先按步骤下载对应固件支持包。

? ? ? ? 直接右上角退出软件包导入界面,我们选择从外部导入的方式(外部导入方式有利于移植与工程转移);

? ? ? ? 左侧"Project"出现下图内容即创建工程成功;


三、如何新建文件

  • ①点击新建文件;
  • ②新建成功;
  • ③点击保存;

? ? ? ? 找到刚刚新建的文件夹"Drivers",我在里面又新建了一个"User"用来存放这个新命名为"main.c"的文件,然后点击"保存";


四、添加文件夹与文件到工程里

方法一(少量文件添加推荐):直接在左侧"Project"添加

????????编辑文件夹名,直接单击文件夹;

????????添加文件,?双击文件夹,选择文件添加;

????????查看是否添加成功,然后直接退出即可;

????????新建文件夹,右键点击目标工程1,然后点击"Add Group...";

方法二(批量文件添加推荐):在上侧找到像"品"字的图标

????????单击"品"字;

  • ? ?
    • ①新建文件夹;
    • ②单击选中,双击重命名文件夹;
    • ③在对应选中的"Group"里添加文件;
    • ④删除选中的文件/文件夹;
    • ⑤文件/文件夹 上下移动,用于整理位置;
    • ⑥添加完毕;


五、导入STM32F10x固件库文件

方法一:在我的资源里直接白嫖

方法二:手动收集

? ? ? ? 在"Drivers"文件夹先新建文件夹"CMSIS",然后在里面再新建两个文件夹"CORE"与"STM32F10x_Driver",用于存放固件库文件;

? ? ? ? 在Keil5的安装文件夹里跟着如下图的路径①,找到②里的文件夹,这些文件夹里的文件就是固件库文件(如果没有找到"STM32F1xx_DFP"这个文件夹则需要先安装固件支持包,可以按着我的"手把手教学一文安装Keil5(MDK)固件支持包"教程进行下载安装);

? ? ? ? 打开"Include",复制如下图的文件到刚刚在工程文件夹里新建的"CORE"文件夹里;

????????打开"Source",复制如下图的文件到刚刚在工程文件夹里新建的"CORE"文件夹里;

????????? 打开"ARM",复制如下图的文件到刚刚在工程文件夹里新建的"CORE"文件夹里(下一步有解析为什么选择这个启动文件);

? ? ? ? ?由于本文以STM32F103C8T6为例,STM32F103C8的Flash大小为64K,所以启动文件选择了"startup_stm32f10x_hd.s";

? ? ? ? ?返回打开"StdPeriph_Driver/templates",先复制如下图的文件到刚刚在工程文件夹里新建的"CORE"文件夹里;

? ? ? ? 根据下图的路径找到"core_cm3.h"、"cmsis_armcc.h"、"cmsis_compiler.h"、"cmsis_version.h",复制刚刚在工程文件夹里新建的"CORE"文件夹里;

? ? ? ? 小插曲:以前所需要ARM内核的文件仅需要"core_cm3.c"、"core_cm3.h"这两个文件,但是在新版本的Keil5文件夹里找不到"core_cm3.c"文件,然后我就不管了,取了"core_cm3.h"直接编译了一波,根据编译提示错误:缺失了一些文件,结果在"core_cm3.h"所在的文件夹里一一对应都找到了,然后进行添加再次编译后就0Error,0Warning,芜湖。

????????接着在网上搜了一下为什么,搜到的有效信息少之又少,总结了大家的意思大概就是:ARM公司把CMSIS升级到2.0版本时对软件架构进行了调整,去掉了原本的"core_cm3.c",转而新增了其他文件进行替代,有的人说是"core_cmFunc.h"、"core_cmInstr.h"。可能是我所用的版本不一样,我需要新增的是"cmsis_armcc.h"、"cmsis_compiler.h"、"cmsis_version.h"。其实万变不离其中,大家可以在下图的路径,先在"ARM"里找到"core_cm3.h",取过来编译一下看看缺失什么文件,一个一个进行添加即可;

? ? ? ? ?回到"StdPeriph_Driver"把"inc"与"src"搬运到工程文件夹里的"STM32F10x_Driver"里即可;


六、把刚刚收集的固件库文件分类添加到工程里


七、MDK工程配置

? ? ? ? "Output"界面,勾选"Create HEX File"生成HEX文件;

????????"C/C++"界面,在"Define"里添加(USE_STDPERIPH_DRIVER)

? ? ? ? 添加头文件源;

? ? ? ? ?"Debug"界面

  • ①脱离硬件,进行软件仿真时选择;
  • ②需要勾选,在软件仿真时可以显示真实时间;
  • ③STM32F103C8如图进行配置;
  • ④连接硬件在线仿真时选择;
  • ⑤连接硬件在线仿真时选择的工具;

? ? ? ? ?如下图进入"Settings";


八、修改stm32f10x_conf.h文件

? ? ? ? 解除文件只读属性,可以看到文件图标有个锁;

? ? ? ? 在文件夹里找到它,右键->属性;

? ? ? ? 取消"只读",然后点击应用;

? ? ? ? 再次看回Keil5里,文件图标的锁不见了就说明解锁成功了;

? ? ? ? 接下来如下图看到stm32f10x_conf.h文件里大概第27行附近有一行"#include "RTE_Components.h""(由于版本可能不一致,但行数应该是在这附近的),把它删除掉。它其实是有着一些RTE_DEVICE_xxxxxx宏的头文件,我的做法是全部删掉,包括下面的第27~100行内出现的RTE_DEVICE_xxxxxx宏全部删掉。当然你也可以自己新建一个"RTE_Components.h"文件添加进来工程,自己在里面填写所有宏;

? ? ? ? 把第27~100行内出现的RTE_DEVICE_xxxxxx宏全部删掉(只删除宏!对头文件声明请手下留情),修改为如下图所示:


九、编写main.c

? ? ? ? 如下图格式编写main函数;

#include "stm32f10x.h"



int main(void)
{
    
    while(1)
    {
        
    }
}

? ? ? ? 编译工程(如有错误与警告请到评论区进行评论,我会第一时间回复);


十、点灯实验

#include "stm32f10x.h"



#define	LED_GPIO	GPIOB									/**< LED引脚端口号 */
#define	LED_PIN		GPIO_Pin_7								/**< LED引脚编号 */



/*LED引脚配置*/
void LED_GPIO_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	/*打开时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);			

	/*配置GPIO*/
	GPIO_InitStructure.GPIO_Mode	= GPIO_Mode_Out_PP;		/* 模式-推挽输出 */
	GPIO_InitStructure.GPIO_Speed	= GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Pin		= LED_PIN;
	GPIO_Init(LED_GPIO, &GPIO_InitStructure);
	
	/*初始化电平*/
	GPIO_SetBits(LED_GPIO, LED_PIN);						/* 默认输出高电平关闭LED */
}



/*设置LED开关*/
void Set_LEDState(unsigned char state)
{
	GPIO_WriteBit(LED_GPIO, LED_PIN, (BitAction)state);
}



int main(void)
{
	LED_GPIO_Init();										/* LED引脚配置 */
	Set_LEDState(0);										/* 输出低电平点亮LED */
	
	while(1)
	{
		
	}
}

?????????分享先到这里,希望能给大家带来启发与帮助。如果对内容存在疑问或想法,欢迎在评论区留言,我会积极回复大家的问题。在我的“Keil5_MDK”专栏中,还有一些关于Keil的教程,欢迎一起探讨、一起学习。

文章来源:https://blog.csdn.net/Lstatxxx/article/details/132643893
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。