【Birch开发板系列教程】(一)如何快速为STM32创建工程模板(基于Keil、标准库)

提示

  文章中操做基于Keil MDK5.2三、STM32F1和标准库V3.5,建议读者阅读前确保本身已经安装好Keil和STM32F1系列的Pack。html

  同时,若是但愿照着本文操做的话,请准备好标准库的库文件,可在官网下载,地址:连接,下载须要注册,嫌麻烦也能够找别人分享的资源。git

(这里也给出一份:连接electron

  另外,本教程是为校科协电子部的Birch系列开发板准备的配套文档之一,因此,使用STM32F103C8T6这颗芯片进行演示。函数

写在前面

  在网上搜索STM32新建工程模板的方法的话,大部分教程都比较繁琐,主要缘由在于大部分人只是照抄官方的指南、原子或者野火的教程什么的,甚至不明白本身在搬运一些什么文件,天然不会去想着简化步骤。工具

  可是已经0202年了嘛,各类开发工具愈来愈强大,开发者在实现想法时须要面对的困难应该愈来愈少才是(合理使用工具的话)。因此呢,在这里我准备分享一下这段时间总结的一个快速创建工程模板的方法。学习

步骤

1、新建文件夹

  • 首先,新建一个文件夹来存放咱们的工程模板。起个描述用途的名字,好比“F103_Template”什么的。
  • 而后,打开新建的文件夹,在里面新建“Doc”“Lib”“Project”“User”四个文件夹分别用于存放用户添加的文档、库文件、工程文件、用户代码等等

P1.jpg

2、新建工程

  • 打开Keil,依次选择“Project -> New uVision Project”
  • 而后呢,会弹出一个窗口,用于指定工程文件的所在目录和名称,选择咱们以前创建的“Project”文件夹,而后,给工程文件起个“容易从名称上明白含义含义”的名字,好比“F103_Template”什么的,保存。
  • 而后你会看到这样的界面,在这里,应当选择一个芯片型号,以便IDE为你准备芯片须要的启动文件等等。

P2.jpg

显然,为了方便,应该在Search后面的框内输入信息以搜索本身须要的型号而不是点加号展开列表慢慢找。开发工具

P3.jpg

选中后点击OK确认。测试

  • 而后会来到配置运行时环境的界面,在通常的新建工程教程中,大部分藏得很深的、要在文件夹里翻找半天才能看见的文件基本都是和芯片的内核、启动、各项配置等相关的,合理配置运行时环境能够大大简化这一步骤。

    (如图勾选而后确认便可,做用是添加内核相关的文件和启动相关的文件)ui

P4.jpg

(其实在这个界面下能够直接勾选须要的组件来配置标准外设库,可是因为库文件不会被复制到工程中,有时会出一些问题。而选择Core和Startup时,Keil软件会在工程文件所在文件夹(咱们以前创建的“Project”)下新建一个“RTE”文件夹并复制相关资源到这里,因此工程移动到其余安装合适版本的Keil的PC上以后这部分也能正常编译)spa

3、分组、添加文件

  • 以前创建文件夹的时候是给文件分了类的,可是,刚刚创建的工程里面可没有咱们规整的划分,打开一看,孤零零一个“Target_1”,(点加号)展开是下面这样的:

P5.jpg

嗯,不对劲,得改。

  • 因此,在"Target_1"那里单击右键,而后选择“Manage Project Items”

P6.jpg

  • 弹出一个这样的界面,在这里管理不一样文件所属的分组。

P7.jpg

很明显,点击叉叉能够删除当前选中的组。不过,点叉叉左边的符号(而后输入名字)能够新建分组,这一点却是不太明显。

  • 删掉默认的分组,新建分组“App”“Hardware_Driver”"Lib""Doc"四个分组,分别用于存放用户的应用层级代码文件、硬件驱动相关的代码文件、库文件、文档(而后,记得点OK来确认修改)。

    而后就要准备添加文件到相应分组。不过,我们的“模板”里面尚未库文件呢,因此咱们得来添加一下。

  • 解压以前下载的STM32F1的标准外设库压缩包,按照“STM32F10x_StdPeriph_Lib_V3.5.0 -> Libraries”的顺序打开文件夹,而后复制“Libraries”目录下的“STM32F10x_StdPeriph_Driver”文件夹到咱们准备的工程模板的“Lib”文件夹里。这样,工程模板的文件目录下就有须要的库文件了。
  • 以后回到Keil软件,在左边工程结构里的“Lib”上单击右键,选择“Add Exsiting File ····”来添加文件(进入以前的“Manage Project Items”而后选中对应的组来添加文件也是同样的)。

P8.jpg

添加文件的时候,进入咱们工程模板的Lib文件夹下,打开“STM32F10x_StdPeriph_Driver”这个咱们添加的文件夹,你会看到两个分别叫“src”和“inc”的文件夹,“src”表示“source”,用于存放代码文件,点开会发现一堆“xxx.c”,这些文件须要添加到工程;“inc”表示“include”,即程序应该包含的头文件,打开会发现一堆“xxx.h”,这些文件不须要添加到工程,但须要在软件中添加他们的路径让编译器可以顺利找到这些文件。

  • 因此,在打开了“STM32F10x_StdPeriph_Driver”以后,你须要作的就是,打开”src”文件夹,全选里面的文件,点击“Add”而后退出(没有确认给你点)。以后你就能看到“lib”这一项的左边多出一个加号,展开后就是添加的一堆文件。
  • 搞定src以后,还得处理inc,此次不须要添加文件,而是须要添加路径。

    在“Target_1”处右键,而后选择“Options for Target···”

P9.jpg

  • 在弹出的菜单中选择“C/C++”选项卡,而后,在添加路径以前(既然都到这来了),先来添加一个宏定义,

    在Define后边的文本框中输入一串字符“STM32F10X_MD,USE_STDPERIPH_DRIVER”,以下图:

P10.jpg

在Define文本框中输入的内容会被做为全局的宏,不一样的宏之间应该以英文逗号分隔(虽然看起来像句号,但那是个逗号)。

为嘛要用宏呢,咱们知道,C语言里面宏定义重要做用是用来进行添加编译,写一个

#ifdef  XXX //若是定义了叫"XXX"的宏
    //do something here.
#elif defined XXXX
    //do something here.
#endif

这样的结构就能够根据不一样条件编译不一样内容。

咱们这里有两个宏,第一个是XXX_MD是“中容量产品”的意思,咱们使用的芯片STM32F103C8T6的Flash存储器(做为芯片的ROM)容量为64KB(8 -> 64K),属于ST划分的F1系列下的“中容量产品”,若是是STM32F103ZET6这样的“大容量产品”的话(E -> 512K),M就得改为H(High)了。另外一个宏就很好理解了,使用标准库的意思。

  • 而后,点击“Include Paths”右侧的“···”(如图)

P11.jpg

  • 在弹出的界面中,嗯,你应该知道点哪一个东西来添加条目,选择inc目录并添加,效果以下图,退出时记得点OK。

P12.jpg

敲黑板

  到这里,虽然模板还不完善,可是你已经了解过全部的步骤,而且大体知道为何要这么作了,以后的讲解中如遇相似操做,细节再也不赘述。

添加用户代码等等

  咱们的用户文件夹“User”如今仍是空空的,以前分组的时候咱们试图用分组让文件的存储更有条理,添加库文件和路径的时候咱们发现库文件分了src和inc两个文件夹分别存储.c和.h文件,仔细一想这样好像挺不错的,因此咱们的User文件夹里的内容也能够如此放置。

  • 在工程模板的User文件夹下新建“Application”"BSP""Hardware_Driver"三个文件夹(BSP,即板级支持包,一般用于提供一些与特定开发板相关的接口函数),并分别在每一个文件夹下新建src文件夹和inc文件夹。

    (舒适提示:win下新建文件夹的快捷键为Ctrl + Alt + N)

  • 回到Keil软件界面,从顶部菜单依次选择“File -> New”新建一个空白文件,而后保存为“main.c”,保存的地方选择"User -> Application -> src"(类型选择默认的allfile便可,".c"不要省去)。
  • 而后,把main文件添加到“App”这个分组下(如今你应该会这个操做)。
  • 对了,到这还有个补充的操做,须要你回到以前解压出来的外设标准库文件夹下找点东西,请依次打开“STM32F10x_StdPeriph_Lib_V3.5.0 -> Project -> STM32F10x_StdPeriph_Template”,看名字就知道这是一个官方提供的工程模板,不过结构不是很适合咱们,因此咱们拿点东西就走。
  • 把该文件夹下的“stm32f10x_it.c”复制到"User -> Application -> src"下;“stm32f10x_it.h”复制到"User -> Application -> inc",而后C文件添加到Keil工程里的App分组下,inc的路径记得添加一下,这个操做你会的(笑)。
  • 仍是获取“stm32f10x_it.c”的那个文件夹,把“stm32f10x_conf.h”复制到"User -> Application -> inc"下,添加过的路径不一样重复添加(既然在同一文件夹下)。

    OK,这个教程里面咱们就搬这几回东西。

测试与完善

  作完以前的步骤后,咱们创建了一个简单但有序的空白工程,可是还不知道是否能用、好用,并且也缺少一些平时常用到的内容,接下来咱们就对这个工程进行一些测试和完善。

  首先,在main.c文件中输入以下代码:

#include "stm32f10x.h"
#include "stm32f10x_conf.h"

int main()
{
    return 0;
}

  (这部分代码什么也没有执行)

  使用快捷键F7能够进行编译(无效的话按Fn + Esc能够切换热键的状态),或者点击顶部菜单里的"Build"也行,以下图:

P13.jpg

  编译完成后工做区域的底部应有相似下图的提示:

P14.jpg

  可能会有一些warning(s),可是没有Error的话就说明以前新建的空白工程基本没问题。

  接下来就能够编写程序测试这个工程模板是否真的能用了。

  固然咱们会为还在学习怎么创建工程模板的童鞋提供代码的,复制下面内容到main.c就能够了(覆盖原来的)。

#include "stm32f10x.h"
#include "stm32f10x_conf.h"

void delay_ms_test(uint32_t delay_time);

void Board_LED_Init(void);
void Board_LED_ON(void);
void Board_LED_OFF(void);

int main()
{
    Board_LED_Init();
    
    while(1)
    {
        Board_LED_ON();
        
        delay_ms_test(200);
        
        Board_LED_OFF();
        
        delay_ms_test(200);
    }
    return 0;//程序不会运行到这里
}

void delay_ms_test(uint32_t delay_time)
{
    for(int i=0;i<delay_time;i++) 
    {
        for(int j=0;j<11450;j++) 
        {
            __nop();//do nothing
        }
    }
}

void Board_LED_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    
    GPIO_Init(GPIOC, &GPIO_InitStructure);
    
}

void Board_LED_ON(void)
{
    GPIO_WriteBit(GPIOC,GPIO_Pin_13,0);
}

void Board_LED_OFF(void)
{
    GPIO_WriteBit(GPIOC,GPIO_Pin_13,1);
}

  这部分程序实现的功能是让核心板上PC13引脚链接的LED进行闪烁,一般STM32核心板都会有至少一个的板载LED,并且默认烧录一个闪灯的代码来测试,咱们用的“BluePill”也是这样,为了与本来的程序相区别,我把闪烁的频率调快了一些。

  F7以后,编译没问题的话就能够准备下载了,工程默认的下载器是ulink,不经常使用。这里咱们使用STlink进行下载。固然,ISP下载也是能够的,不过这里不作讲解。

  • 打开下图界面,进入“debug”选项卡,在图示下拉列表中选择ST-Link,而后点击右侧的“Settings”。

P15.jpg

  • 而后在弹出的菜单中选择“Flash Download”选项卡,在该界面下勾选“Reset and Run”。很明显,这个设置是让下载器完成下载后帮你复位芯片以运行新下载的程序,省去手动复位的麻烦。

P16.jpg

  • 而后,F8下载,或者点击顶部菜单里的“Load”,以下图:

P17.jpg

  若是没有意外的话,核心板上的与“PC13”字样相邻的LED将会以必定频率闪烁,咱们的工程模板实现了“能用”的阶段性目标,不过,若是没有顺利实现预期效果也不要放弃,这里提供一份作好的工程模板以供不顺利的童鞋查对,地址:连接

  固然了,目前这个工程模板极不完善,缺乏不少经常使用的功能,好比准确的延时函数什么的,要让它变得“好用”,还须要继续完善,不过,那是应该是下一篇文章的内容了。

(PS:如今能够试着基于已有的工程模板让LED发送“SOS”求救信号,并把操做封装成一个函数)

相关文章
相关标签/搜索