• MDK+VS+Eclipse的STM32库V3.5工程模板的建立(二)


    _【@. 目录】

    @.1 开篇

    @.2 MDK工程建立

    @.3 Visual Studio工程建立

    @.4 Eclipse工程建立

    @.5 工程模板实例:标准库GPIO实例讲解、仿真、下载

    @.6 工程模板下载

    【@.2 MDK工程建立】

    (*注:工程模板的目录结构大家完全可以按照自己的项目要求建立,不必要我这里的目录结构。)

    一.建立目录

    @-> 在任意位置新建一个文件夹,取名为"STM32F10x_Temp_Lib3.5",目录下新建"Solution"(工程文件、目标文件),"Libraries"(STM32库),"User"(用户代码)三个文件夹。

    @-> 在"Solution"下新建"LIST","OBJ","MDK","VS","ECL"五个文件夹。

    @->在"User"下新建"inc","scr"两个文件夹。至此文件目录建立完成,如下图所示:↓

    文件目录

    二.拷贝STM32库

    @->将下载后的库文件解压,观察目录结构。其中根目录下有一个chm的用户手册,那是个用Doxygen生成的文档。反正我看着挺纠结的,关于库文件的结构,园子里的这篇文章有比较详细的分析,这里就不重复了。

    @->右击这个文件夹,将其属性中的"只读"去掉。STM32库下载下来默认是只读的,若不去掉将无法修改文件。去掉只读,点击应用,选中"将更改应用于该文件夹、子文件夹和文件"确定。↓

    只读

    image

    @->在固件库根目录"STM32F10x_StdPeriph_Lib_V3.5.0\Libraries"下全部文件拷贝到我们建立的工程目录"STM32F10x_Temp_Lib3.5\Libraries"中。

    @->将"STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template"下的"stm32f10x_it.c"拷贝到我们的工程目录"STM32F10x_Temp_Lib3.5\User\scr"中。另外src文件夹中再新建一个"main.c"文件,以后可将用户代码添加到这里。

    @->将"STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template"下的"stm32f10x_it.h"和"stm32f10x_conf.h"拷贝"STM32F10x_Temp_Lib3.5\User\inc"中。以后自定义的头文件也可以放在这个文件夹下。至此,所有工程文件拷贝完毕。

    三.建立MDK模板

    @->打开Keil 4.60,点击Project->New uVision Project,保存工程路径为"STM32F10x_Temp_Lib3.5\Solution\MDK",取名为"STM32F10x_MDK",也可以另取名字。在CPU中选择STMicroelectronics->STM32F103RB。接下来出现的"Copy STM32 Startup Code to Project Folder and ADD File to Project ?"对话框汇中选择No,因为之后我们需要自己添加STM32库中的启动文件。

    @->在左侧Project窗口中右击Target1,选择Manage Components:↓

    Manage Components-01

    Manage Components-02

    将Project Targets中的Target 1改为一个有意义的名字,比如这里改成"STMF10x_Tar",在之后的Groups里面新建"USER","STM32_LIB","STM32_STARTUP","CMSIS" 四组。↓Manage Components-03

    @->选中USER,点击右侧Add Files,添加工程目录"User\scr"下的"main.c"和"stm32f10x_it.c"两个文件。↓

    Manage Components-04

    @->选中STM32_LIB,点击右侧Add Files,添加工程目录"\Libraries\STM32F10x_StdPeriph_Driver\src"下的"misc.c","stm32f10x_rcc.c","stm32f10x_gpio.c","stm32f10x_usart.c"四个文件。其中这里"misc.c"和"stm32f10x_rcc.c"根据我查阅的资料说一定得加(*有待验证),剩下的文件用到那个功能添加那个。↓

    Manage Components-05

    @->选中STM32_STARTUP,点击右侧Add Files,添加工程目录"Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm"下的"startup_stm32f10x_md.s"文件即为需要的启动代码。这里后缀的md表示中等容量大小,因为我们的芯片是STM32F103RB所以要选这个。↓

    Manage Components-06

    关于STM32的这个分类,可以在"stm32f10x.h"这个入口头文件(现在还没添加到包含路径中)中找到描述注释,当然也可以在网上搜索到具体怎么分类的,但我这里故意黏贴了这个函数里面的描述。要学会利用好手头的资源,很多头文件里的注释很清楚的只是我们不愿意读罢了。读一读就知道我们这个芯片为什么选择后缀为md的启动代码了。↓

    /*!< STM32F10X_LD: STM32 Low density devices */
    /*!< STM32F10X_LD_VL: STM32 Low density Value Line devices */  
    /*!< STM32F10X_MD: STM32 Medium density devices */
    /*!< STM32F10X_MD_VL: STM32 Medium density Value Line devices */  
    /*!< STM32F10X_HD: STM32 High density devices */
    /*!< STM32F10X_HD_VL: STM32 High density value line devices */  
    /*!< STM32F10X_XL: STM32 XL-density devices */
    /*!< STM32F10X_CL: STM32 Connectivity line devices */
    
    /*  
     - Low-density devices are STM32F101xx, STM32F102xx and STM32F103xx microcontrollers
       where the Flash memory density ranges between 16 and 32 Kbytes.
     - Low-density value line devices are STM32F100xx microcontrollers where the Flash
       memory density ranges between 16 and 32 Kbytes.
     - Medium-density devices are STM32F101xx, STM32F102xx and STM32F103xx microcontrollers
       where the Flash memory density ranges between 64 and 128 Kbytes.
     - Medium-density value line devices are STM32F100xx microcontrollers where the 
       Flash memory density ranges between 64 and 128 Kbytes.   
     - High-density devices are STM32F101xx and STM32F103xx microcontrollers where
       the Flash memory density ranges between 256 and 512 Kbytes.
     - High-density value line devices are STM32F100xx microcontrollers where the 
       Flash memory density ranges between 256 and 512 Kbytes.   
     - XL-density devices are STM32F101xx and STM32F103xx microcontrollers where
       the Flash memory density ranges between 512 and 1024 Kbytes.
     - Connectivity line devices are STM32F105xx and STM32F107xx microcontrollers.
      */

    @->最后,选中STM32_STARTUP,点击右侧Add Files,添加工程目录"Libraries\CMSIS\CM3\CoreSupport"下的"core_cm3.c",和工程目录"Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x"下的"system_stm32f10x.c"文件。↓

    Manage Components-07

    于是最终Project下可看到工程目录呈现如图状:↓

    image

    *.MDK工程文件结构说明

    @->USER文件夹下面其中main.c是自己添加的,用于添加用户代码。stm32f10x_it.c是从下载的库文件中的模板里拷贝出来的,这也说明这个文件并不属于标准库中的函数。打开这个文件就可以知道这里定义的是所有中断的服务函数(以'_Handler')结尾,文件里面的所有函数都是空的,用户需要向这里添加自己的中断服务代码,并打开中断,即可使用中断了。STM32中的所有中断服务函数的名字都是在启动代码'startup_stm32f10x_xx.s'中定义过了的,比如'EXTI0_IRQHandler'(外部中断0)、'CAN1_RX1_IRQHandler'(CAN1的接受中断),'所以最好不要自己随便改名字。注意到stm32f10x_it.c并没有将所有中断函数的名字都写出来,只写出了系统内部的中断,所有外设的中断函数名都没有写,需要用户自己添加。

    @->STM32_LIB文件夹下放置的是stm32外设的库函数文件,均位于工程目录'Libraries\STM32F10x_StdPeriph_Driver\src'中。若要添加新的外设只需从此目录中添加对应的c文件即可

    @->STM32_STARTUP文件夹下放置的是启动代码。注意这里的启动代码并不是从Keil里面拷贝出来的,而是从下载的库文件中拷贝的。

    @->CMSIS中放置的是CMSIS标准给出的一个核心文件'core_cm3.c',定义了大量内嵌汇编函数用于连接核心与上层函数;系统配置文件'system_stm32f10x.c'中定义了初始化函数、系统时钟设定等。

    四.配置MDK模板

    @->右击STM32F10x_Tar,选择第一个Options for Target ‘STM32F10x_Tar’即可进入设置↓

    Options for Target

    选中Output选项卡,修改"Name of Excutable"为"ExcSTM32",改其他名也可以,但关键是不能包含下划线,否则JLink仿真会报错(*这也有待验证为什么)。选中"Create Hex File"框将生成最终的.hex文件,否则编译最后仅仅到.axf就结束了。其他设置保留默认:↓

    Options for Target

    之后还是在这一页,点击"Select Folder for Objects..."按钮,将其设置为工程目录"Solution\OBJ"即为目标文件生成的目录。

    @->选中Listing选项卡,点击"Select Folder for Listings...",将其设置为工程目录"Solution\LIST"即为list文件生成的目录。

    Options for Target

    这里默认没有选中"C Compiler Listing: .\.*txt"。也可以选上,在编译时将以txt的形式多输出一份列表文件。

    @->选中C/C++选项卡,点击"Include Paths",添加四条包含路径如下图,这里就包含了所有头文件的目录↓

    Options for Target

    之后在"Preprocessor Symbols"中添加Define“STM32F10X_MD,USE_STDPERIPH_DRIVER”,这是两个预定义,中间用逗号隔开的。其中“STM32F10X_MD"表明使用的是中等容量的CPU,在入口头文件中有很多地方用到了宏判断来进行定义分类,有兴趣可以翻翻头文件"stm32f10x.h"内的宏定义就明白了。"USE_STDPERIPH_DRIVER"的道理也是一样。

    选中"One ELF Section per Function"。若选中了这一项,则在编译时有很多没有被用到的函数将不会被编译。对于库函数来说,实际上我们最终不可能所有函数都会用到,全部编译后的目标文件将会很大,很费资源。所以这里选中项,最终编译时将会达到很大的优化作用,有兴趣可以自己试试选中这项或不选中看看最终生成的文件大小,保准比你调整优化等级"Optimization"来的差别大。

    最终的设置见图↓

    Options for Target

    至此全部MDK的设置完毕。

    @->打开最开始的那个main.c文件,添加如下代码这里的主函数什么都不写↓

    /**
      **************************************************************************
      * @file    main.c
      * @author  apollius
      * @version V0.1
      * @date    Nov.20 2012
      * @brief   用于STM32lib3.5的工程模板,已配置为STM32F103RB芯片
      **************************************************************************
      */
        
    #include "stm32f10x.h"    /*位于当前工程目录下的头文件,即STM32库V3.5中的stm32f10x.h*推荐*/
    //#include <stm32f10x.h>    /*位于MDK安装目录下的头文件stm32f10x.h*/
    
    int main(void)
    {
        return 0;
    }
    
    /**************************      END OF FILE     **************************/

    点击Build(F7),若一切设置正常,编译将不报错。当然到这一步完全可以就开始着手自己的项目的编写了,不过这并不是本次教程的初衷。为了有更好的代码编写体验,接下来将进行一些扩展设置,进一步设置我们的工程模板以适用于Visual Studio或Eclipse编程。

    @.[FIN]      @.date->Nov 20, 2012      @.author->apollius

  • 相关阅读:
    玩转 SpringBoot 2 快速整合 | FreeMarker篇
    微服务简单说
    玩转 SpringBoot 2 快速整合 | JSP 篇
    SpringBoot中获取微信用户信息从未如此简单!
    玩转 SpringBoot 2 快速整合 Filter
    oc语言的Foundation框架(学习笔记1)
    【PyInstaller安装及使用】将py程序转换成exe可执行程序
    【Django】Apache上运行单个Django项目,mod_wsgi配置
    【Django】基于Django架构网站代码的目录结构
    拖延症与自控力
  • 原文地址:https://www.cnblogs.com/apollius/p/2779509.html
Copyright © 2020-2023  润新知