查看: 1868|回复: 0

一个基本的STM32F工程含有哪些文件

[复制链接]
  • TA的每日心情
    慵懒
    2016-11-22 11:58
  • 签到天数: 11 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2016-11-14 09:13:55 | 显示全部楼层 |阅读模式
    分享到:

    上图展示了标准外设库的关系图,由上图可知一个最基本的工程含有三大类的文件:

    • CMSIS文件;
    • 标准外设库文件;
    • 应用层文件(main.c和中断函数)。
    CMSIS文件



    CMSIS是为Cortex-M系列处理器提供硬件抽象的文件,其目的是实现标准化提高程序的一致性。但它又不是一个过于庞大的软件库,并不定义供应商提供的外设库。其架构见下图。CMSIS是由5部分组成:CMSIS-CORE、CMSIS-DSP、CMSIS-RTOS API、CMSIS-SVD和CMSIS-DAP。

    一个基本的工程文件只包含CMSIS-CORE文件。各芯片制造商根据ARM公司提供的模板文件实现CMSIS-CORE文件,这些文件有芯片供应商按照模板移植的,也有ARM公司提供的。见下图。

    注:<device>指芯片型号,如stm32f0xx,<cpu>指内核类型,如cm0
    CMSIS-CORE定义了三部分内容:

    • 实现Cortex-M设备基本的运行功能;
    • 内核的接口;
    • 外设的接口。
    上图的8个文件(不含<user>.c/c++)对应上文提到的三部分内容:

    • startup_<device>.s与system_<device>.c/h实现了设备的基本运行功能
    • core_<cpu>.h、core_cmIstr.h、core_cmFunc.h与core_cm4_simd.h(Cortex-M4设备独有)实现了内核接口
    • <device>.h实现了外设的接口。
    下面详细介绍这几个文件

    • startup_<device>.s定义:1、芯片重启的执行函数;2、中断向量表3、堆栈的配置。


    • system_<device>.c/h定义:设备时钟的初始化。


    • core_<cpu>.h:定义内核寄存器的接入函数


    • core_cmInstr.h:定义CPU特有的指令


    • core_cmFunc.h:定义接入内核的函数


    • <device>.h:定义了一些设备的设置项、设备异常编码、芯片外设的寄存器和寄存器的位定义,<device>.h通过如下方式实现内核和外设的寄存器访问接口:1、定义外设的寄存器结构;2、定义外设的起始寄存器地址;3、实现对外设寄存器的内存地址访问。
    例如:
    typedefstruct{  __IO uint32_t CTRL;  __IO uint32_t LOAD;  __IO uint32_t VAL;  __IO uint32_t CALIB;} SysTick_Type;#define SysTick_BASE (SCS_BASE + 0x0010)#define SysTick ((SysTick_Type *) Systick_BASE)SysTick->CTRL = 0;
    注1:startup_<device>.s中的重启执行函数,执行system_<device>.c中定义的时钟初始化,之后跳转到main()函数。
    注2:为什么system_<device>.c只定义时钟初始化?因为使设备实现最基本的运行只需要初始化时钟。
    注3:<device>.h是个核心头文件,其include多个头文件,在stm32fxxx的工程里其还include stm32f0xx_conf.h,通过这个conf文件实现了对其它外设头文件的include。

    标准外设库文件



    标准外设库是芯片供应商提供的,以CMSIS-CORE中的<device>.h中定义的外设寄存器访问方式和寄存器中对应位的宏定义为基础,实现对外设的设置与操作。以ADC_Cmd 函数介绍外设库如何使用CMSIS-CORE的<device>.h 定义的接口。ADCx->CR与ADC_CR_ADEN是stm32f0xx.h中定义的数据结构与宏定义,函数通过数据结构访问对应的内存地址,并设置相应的位来实现ADCx的开关。
    void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState){  if (NewState != DISABLE)  {    ADCx->CR |= (uint32_t)ADC_CR_ADEN;  }  else  {    ADCx->CR |= (uint32_t)ADC_CR_ADDIS;  }}
    STM32外设库函数的命名规则是stm32fxxx_ppp.c/h。stm32fxxx是设备型号,ppp是外设名称,如stm32f0xx_adc.c/h,是否使用某个外设是由stm32f0xx_conf.h文件设置的。stm32f0xx_conf.h文件又包含在stm32f0xx.h中。所以相对来说标准外设库文件相对简单,其使用<device.h>中定义的接口来实现外设的使用。
    应用层文件



    一个基础工程的应用层文件就更简单了,可以只包含main.c函数,若使用了中断函数,可以将中断函数放到main.c中,也可以按照最上面图中的方式放在stm32fxxx_it.c/h中。
    总结



    一个基础的工程项目主要包含三类文件:1、CMSIS-CORE文件;2、标准外设驱动库;3、应用文件。CMSIS-CORE提供最底层的抽象和设备的基本运行功能,是其它两类文件的基础。在CMSIS-CORE的抽象基础上建立了外设驱动库,而应用层的函数调用驱动库来实现对设备外设的控制,实现相应的工程需求。
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-11-19 14:43 , Processed in 0.124241 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.