目录
方法一(少量文件添加推荐):直接在左侧"Project"添加
? ? ? ? 在任意盘下先新建一个文件夹,可命名格式为项目名+版本号+主题内容,如下图我命名为"ProjectTemplate_v1_0_0_工程模版"。接着在里面再新建两个文件夹"Drivers"与"MDK","Drivers"用于存放程序文件,"MDK"用于存放MDK的工程文件。把程序文件与工程文件分开,是因为考虑到后续可能使用不同的IDE,如"VScode"、"IAR"等,有利于项目文件的整理;
? ? ? ? 打开Keil5,在上方找到"Project",然后点击"New μVision Project..."
? ? ? ? 找到刚刚创建好的文件夹"MDK",然后填写工程名字,接着点击"保存";
? ? ? ? 选择芯片,在"STMicroelectronics"类别中找到并点击选择"STM32F103C8",然后点击"OK"。如果没有目标芯片,那就是没有下载对应固件支持包,先移步到手把手教学一文安装Keil5(MDK)固件支持包先按步骤下载对应固件支持包。
? ? ? ? 直接右上角退出软件包导入界面,我们选择从外部导入的方式(外部导入方式有利于移植与工程转移);
? ? ? ? 左侧"Project"出现下图内容即创建工程成功;
? ? ? ? 找到刚刚新建的文件夹"Drivers",我在里面又新建了一个"User"用来存放这个新命名为"main.c"的文件,然后点击"保存";
????????编辑文件夹名,直接单击文件夹;
????????添加文件,?双击文件夹,选择文件添加;
????????查看是否添加成功,然后直接退出即可;
????????新建文件夹,右键点击目标工程1,然后点击"Add Group...";
????????单击"品"字;
? ? ? ? 在"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"里即可;
? ? ? ? "Output"界面,勾选"Create HEX File"生成HEX文件;
????????"C/C++"界面,在"Define"里添加(USE_STDPERIPH_DRIVER)
? ? ? ? 添加头文件源;
? ? ? ? ?"Debug"界面
? ? ? ? ?如下图进入"Settings";
? ? ? ? 解除文件只读属性,可以看到文件图标有个锁;
? ? ? ? 在文件夹里找到它,右键->属性;
? ? ? ? 取消"只读",然后点击应用;
? ? ? ? 再次看回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函数;
#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的教程,欢迎一起探讨、一起学习。