• stm32开发笔记一:使用固件库在RealView-MDK中新建工程(上)


           很久没有碰单片机了,两年了吧,因为项目需要,最近入手一块红牛的开发板,核心为STM32F103ZE。虽然以前做过大概半年的stm32的开发,现在天天在.net平台下写代码,已经忘记的差不多,恰逢周末,补补课,以后用的时候也方便点。

           ST推出的FW大大提高了单片机SW的开发效率,所以在新建工程前先来了解下这个SDK。我使用的是最新的v3.5固件库,这个固件库可以分为三个部分:

    1、内核支持(..STM32F10x_StdPeriph_Lib_V3.5.0LibrariesCMSISCM3CoreSupport)

    2、硬件系统支持(..STM32F10x_StdPeriph_Lib_V3.5.0LibrariesCMSISCM3DeviceSupportSTSTM32F10x)

    3、外设支持(..STM32F10x_StdPeriph_Lib_V3.5.0LibrariesSTM32F10x_StdPeriph_Driversrc)

    4、评估板支持(..STM32F10x_StdPeriph_Lib_V3.5.0UtilitiesSTM32_EVAL)

    下图为这个几个支持模块之间的关系


    一、关于内核支持模块

    这个模块由文件core_cm3.c和core_cm3.h构成。这部分代码完全由汇编写就,主要完成一些底层操作的基本功能,包括一些加减乘除,移位和拷贝等的一些基本运算。

    二、关于硬件系统支持


    这个模块的代码包括用于系统的启动代码(startup),和代码编译运行前的初始设置的代码(stm32f10x.h)

    stm32f10x.h这个文件,定义了各个寄存器的地址,配置了我们使用的核心类型,是否使用固件库等信息,打开该文件,第95行代码如下

    #if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_HD_VL) && !defined (STM32F10X_XL) && !defined (STM32F10X_CL)
     #error "Please select first the target STM32F10x device used in your application (in stm32f10x.h file)"
    #endif
    


    这几行代码告诉我们,如果没有定义自己使用的芯片类型,将无法编译通过,我们可以通过修改第66行的代码定义自己的处理器,也可以通过开发环境设置自己定义的处理器。

    该文件第8296行代码如下

    #ifdef USE_STDPERIPH_DRIVER
      #include "stm32f10x_conf.h"
    #endif
    

    这三行的代码显示,如果我们使用固件库必须定义

    USE_STDPERIPH_DRIVER

    这样他会把stm32f10x_conf.h文件包含进来。该文件包含了各个外设的头文件。

    因此,假如我们在文件stm32f10x.h中定义了USE_STDPERIPH_DRIVER, 编写的源文件时,只需要通过包含stm32f10x.h这个文件,便可以方便使用固件库定义的方法访问和操作外设。

    三、关于外设支持

    每种外设对应了两个文件,一个头文件和一个源文件,他们定义和实现了外设操作的基本功能

    四、关于评估板支持

    ST应该是给出集中不同的评估板类型,不同的类型,只要是评估板上的资源不一样,这几个类型通过打开文件stm32_eval.h,查看58行开始的代码,便一目了然。

     =================================================================================================================+
        STM32 EVAL     | LED | Buttons  | Com Ports |    LCD    | IOE  | sFLASH | sEE | TSENSOR | SD (SPI) | SD(SDIO)  |
      =================================================================================================================+
       STM3210B-EVAL   |  4  |    8     |     2     | YES (SPI) | NO   |  YES   | NO  |   YES   |    YES   |    NO     |
      -----------------------------------------------------------------------------------------------------------------+
       STM3210E-EVAL   |  4  |    8     |     2     | YES (FSMC)| NO   |  YES   | NO  |   YES   |    NO    |    YES    |
      -----------------------------------------------------------------------------------------------------------------+
       STM3210C-EVAL   |  4  |    3     |     1     | YES (SPI) | YES  |  NO    | YES |   NO    |    YES   |    NO     |
      -----------------------------------------------------------------------------------------------------------------+
       STM32100B-EVAL  |  4  |    8     |     2     | YES (SPI) | NO   |  YES   | NO  |   YES   |    YES   |    NO     |
      -----------------------------------------------------------------------------------------------------------------+
       STM32L152-EVAL  |  4  |    8     |     2     | YES (SPI) | NO   |  NO    | NO  |   YES   |    YES   |    NO     |
      -----------------------------------------------------------------------------------------------------------------+
       STM32100E-EVAL  |  4  |    8     |     2     | YES (FSMC)| YES  |  YES   | YES |   YES   |    YES   |    NO     |
      =================================================================================================================+


    查看该文件的150行可看到如下代码

    #ifdef USE_STM32100B_EVAL
     #include "stm32f10x.h"
     #include "stm32100b_eval/stm32100b_eval.h"
    #elif defined USE_STM3210B_EVAL
     #include "stm32f10x.h"
     #include "stm3210b_eval/stm3210b_eval.h" 
    #elif defined USE_STM3210E_EVAL
     #include "stm32f10x.h"
     #include "stm3210e_eval/stm3210e_eval.h"
    #elif defined USE_STM3210C_EVAL
     #include "stm32f10x.h"
     #include "stm3210c_eval/stm3210c_eval.h"
    #elif defined USE_STM32L152_EVAL
     #include "stm32l1xx.h"
     #include "stm32l152_eval/stm32l152_eval.h" 
    #elif defined USE_STM32100E_EVAL
     #include "stm32f10x.h"
     #include "stm32100e_eval/stm32100e_eval.h"
    #else 
     #error "Please select first the STM32 EVAL board to be used (in stm32_eval.h)"
    #endif                      


    这几行代码告诉我们,如果我们定义不同的开发板类型,他将会包含不同的文件以适合你所选的开发板。


    今天先简单的将FW简介下,想要深入了解,可以阅读它的源码,对于提高自己的嵌入式代码的质量是非常有帮助的。下章将介绍使用固件库新建工程。。。。。



  • 相关阅读:
    变量在函数内外的作用域 3
    php中用大括号把?>和<?php框起来的作用
    变量在函数内外的作用域 2
    变量在函数内外的作用域
    字母大小写对变量和函数的区别
    require()和include()代码重用
    str_place()替换函数
    【开源框架】Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发,欢迎各位网友补充完善
    android SQLite使用SQLiteOpenHelper类对数据库进行操作
    tomcat设置IP地址或者域名访问
  • 原文地址:https://www.cnblogs.com/riskyer/p/3237038.html
Copyright © 2020-2023  润新知