STM32F4xx标准外设固件库

STM32F4的相关资料:http://www.stmcu.org/document/list/index/category-523

一、标准固件库简介

本文下载的是STM32F4xx_DSP_StdPeriph_Lib_V1.5.0,其文件夹如下图所示:

其中Project文件夹为各个开发环境(MDK-ARM、EWARM、TrueSTUDIO)的模板工程,Utilities文件夹为官方评估板的标准固件库应用例程,真正的标准固件库在Libraries文件夹中。

在Libraries文件夹中:CMSIS文件夹主要包含于内核相关的文件;STM32F4xx_StdPeriph_Driver文件夹为STM32F4xx处理器外设相关的底层驱动。

以下为代码移植时CMSIS文件夹中的重要源文件:

core_cm4.h:内核功能的定义,比如NVIC相关寄存器的结构体和Systick配置。在CMSIS/Include中

core_cm4_simd.h:包含与编译器相关的处理。在CMSIS/Include中

core_cmFunc.h:内核核心功能接口头文件。在CMSIS/Include中

core_cmInstr.h:包含一些内核核心专用指令。在CMSIS/Include中

stm32f4xx.h:包含了stm32f4的寄存器结构体的定义(类似于c51的reg52.h)。在CMSIS\Device\ST\STM32F4xx\Include中

system_stm32f4xx.h:system_stm32f4xx.c的头文件。在CMSIS\Device\ST\STM32F4xx\Include中

system_stm32f4xx.c:stm32f4的系统时钟配置。在CMSIS\Device\ST\STM32F4xx\Source\Templates中

startup_stm32f40_41xxx.s:是启动文件,是一个汇编文件。作用包括:设定SP的初始值;设置PC的初始值;设置中断向量表的地址;配置时钟;设置堆栈;调用main。

这个启动文件先调用system_stm32f4xx.c里面的systeminit()在调用main()之前。在CMSIS\Device\ST\STM32F4xx\Source\Templates\arm中

对于STM32F4xx_StdPeriph_Driver,其重要源文件为:

stm32f4xx_ppp.h:外设头文件。这里的ppp只是一个代码,在实际上是具体的外设名字,如ADC,DMA等。在实际使用时根据所需的外设选择性移植。在STM32F4xx_StdPeriph_Driver\inc中

stm32f4xx_ppp.c:外设源文件。这里的ppp只是一个代码,在实际上是具体的外设名字,如ADC,DMA等。在实际使用时根据所需的外设选择性移植。在STM32F4xx_StdPeriph_Driver\src中

stm32f4xx_conf.h:外设驱动配置文件。通过修改该文件中所包含的外设头文件,用户启动或禁用外设驱动。此外,在此文件夹打开宏定义USE_FULL_ASSERT,通过预处理启用或禁用标准外设库运行时的故障检测。

stm32f4xx_it.h:头文件。包括所有中断处理程序原型。

stm32f4xx_it.c:中断源程序模板,中断函数的名称要与启动文件中中断向量表的名称一致。注意:以上三个文件在Project\STM32F4xx_StdPeriph_Templates工程模板中

此外,对于stm32f4的标准外设固件库,在CMSIS文件夹中还有相应的DSP库:DSP_Lib和Lib。DSP_Lib主要为DSP函数库的实例和源码;Lib为编译好的,且对于不同内核的STM32系列MCU所使用的lib文件。

二、标准固件库移植过程中的注意事项(这里以仅以Keil-MDK为例)

1、在stm32f4xx.h文件中通过反注释选择相应的器件以及打开宏定义USE_STDPERIPH_DRIVER。

#if !defined(STM32F40_41xxx) && !defined(STM32F427_437xx) && !defined(STM32F429_439xx) && !defined(STM32F401xx) && !defined(STM32F411xE) &&     !defined(STM32F446xx)
  /* #define STM32F40_41xxx */   /*!< STM32F405RG, STM32F405VG, STM32F405ZG, STM32F415RG, STM32F415VG, STM32F415ZG,
                                      STM32F407VG, STM32F407VE, STM32F407ZG, STM32F407ZE, STM32F407IG, STM32F407IE,
                                      STM32F417VG, STM32F417VE, STM32F417ZG, STM32F417ZE, STM32F417IG and STM32F417IE Devices */

  /* #define STM32F427_437xx */  /*!< STM32F427VG, STM32F427VI, STM32F427ZG, STM32F427ZI, STM32F427IG, STM32F427II,
                                      STM32F437VG, STM32F437VI, STM32F437ZG, STM32F437ZI, STM32F437IG, STM32F437II Devices */

  /* #define STM32F429_439xx */  /*!< STM32F429VG, STM32F429VI, STM32F429ZG, STM32F429ZI, STM32F429BG, STM32F429BI,
                                      STM32F429NG, STM32F439NI, STM32F429IG, STM32F429II, STM32F439VG, STM32F439VI,
                                      STM32F439ZG, STM32F439ZI, STM32F439BG, STM32F439BI, STM32F439NG, STM32F439NI,
                                      STM32F439IG and STM32F439II Devices */

  /* #define STM32F401xx */      /*!< STM32F401CB, STM32F401CC,  STM32F401RB, STM32F401RC, STM32F401VB, STM32F401VC
                                      STM32F401CD, STM32F401RD, STM32F401VD, STM32F401CExx, STM32F401RE and STM32F401VE Devices */

  /* #define STM32F411xE */      /*!< STM32F411CD, STM32F411RD, STM32F411VD, STM32F411CE, STM32F411RE and STM32F411VE Devices */

  /* #define STM32F446xx */      /*!< STM32F446MC, STM32F446ME, STM32F446RC, STM32F446RE, STM32F446VC, STM32F446VE, STM32F446ZC
                                      and STM32F446ZE Devices */
#endif

/* Old STM32F40XX definition, maintained for legacy purpose */
#ifdef STM32F40XX
  #define STM32F40_41xxx
#endif /* STM32F40XX */

/* Old STM32F427X definition, maintained for legacy purpose */
#ifdef STM32F427X
  #define STM32F427_437xx
#endif /* STM32F427X */

/*  Tip: To avoid modifying this file each time you need to switch between these
        devices, you can define the device in your toolchain compiler preprocessor.
  */

#if !defined(STM32F40_41xxx) && !defined(STM32F427_437xx) && !defined(STM32F429_439xx) && !defined(STM32F401xx) && !defined(STM32F411xE) &&     !defined(STM32F446xx)
 #error "Please select first the target STM32F4xx device used in your application (in stm32f4xx.h file)"
#endif

#if !defined  (USE_STDPERIPH_DRIVER)
/**
 * @brief Comment the line below if you will not use the peripherals drivers.
   In this case, these drivers will not be included and the application code will
   be based on direct access to peripherals registers
   */
  /*#define USE_STDPERIPH_DRIVER */
#endif /* USE_STDPERIPH_DRIVER */

2、确定stm32f4xx.h文件中默认的系统外部晶振时钟HSE_VALUE和内部晶振时钟HSI_VALUE。

#if !defined  (HSE_VALUE)
  #define HSE_VALUE    ((uint32_t)16000000) /*!< Value of the External oscillator in Hz */

#endif /* HSE_VALUE */

/**
 * @brief In the following line adjust the External High Speed oscillator (HSE) Startup
   Timeout value
   */
#if !defined  (HSE_STARTUP_TIMEOUT)
  #define HSE_STARTUP_TIMEOUT    ((uint16_t)0x05000)   /*!< Time out for HSE start up */
#endif /* HSE_STARTUP_TIMEOUT */   

#if !defined  (HSI_VALUE)
  #define HSI_VALUE    ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/
#endif /* HSI_VALUE */ 

3、配置system_stm32f4xx.c文件中所选器件有关系统时钟的PLL_M,PLL_Q,PLL_N和PLL_P。对于STM32F40_41xxx,系统时钟为168MHZ,一般只需修改PLL_M的值。

/************************* PLL Parameters *************************************/
#if defined (STM32F40_41xxx) || defined (STM32F427_437xx) || defined (STM32F429_439xx) || defined (STM32F401xx)
/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */
#define PLL_M      16
#else /* STM32F411xE */
#if defined (USE_HSE_BYPASS)
#define PLL_M      8
#else /* STM32F411xE */
#define PLL_M      16
#endif /* USE_HSE_BYPASS */
#endif /* STM32F40_41xxx || STM32F427_437xx || STM32F429_439xx || STM32F401xx */  

/* USB OTG FS, SDIO and RNG Clock =  PLL_VCO / PLLQ */
#define PLL_Q      7

#if defined (STM32F40_41xxx)
#define PLL_N      336
/* SYSCLK = PLL_VCO / PLL_P */
#define PLL_P      2
#endif /* STM32F40_41xxx */

#if defined (STM32F427_437xx) || defined (STM32F429_439xx)
#define PLL_N      360
/* SYSCLK = PLL_VCO / PLL_P */
#define PLL_P      2
#endif /* STM32F427_437x || STM32F429_439xx */

#if defined (STM32F401xx)
#define PLL_N      336
/* SYSCLK = PLL_VCO / PLL_P */
#define PLL_P      4
#endif /* STM32F401xx */

#if defined (STM32F411xE)
#define PLL_N      400
/* SYSCLK = PLL_VCO / PLL_P */
#define PLL_P      4
#endif /* STM32F411xx */

/******************************************************************************/
#if defined (STM32F40_41xxx)
  uint32_t SystemCoreClock = 168000000;
#endif /* STM32F40_41xxx */

#if defined (STM32F427_437xx) || defined (STM32F429_439xx)
  uint32_t SystemCoreClock = 180000000;
#endif /* STM32F427_437x || STM32F429_439xx */

#if defined (STM32F401xx)
  uint32_t SystemCoreClock = 84000000;
#endif /* STM32F401xx */

#if defined (STM32F411xE)
  uint32_t SystemCoreClock = 100000000;
#endif /* STM32F401xx */

4、若需要使用stm32f40_41xxx的FPU,则还需要在SystemInit函数开头添加相关语句:

/* FPU settings ------------------------------------------------------------
     * If no this settings,it maybe enter HardFault_Handler() interrupt when mdk complier chose "Use FPU" to use FPU instruction. */
  #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
    SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */
  #endif
时间: 2024-08-14 18:32:03

STM32F4xx标准外设固件库的相关文章

STM32Cube_FW_F4_V1.16.0固件库文件配置

启动文件:STM32Cube_FW_F4_V1.16.0\Drivers\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm\startup_stm32f429xx.s 外设寄存器定义文件:STM32Cube_FW_F4_V1.16.0\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f429xx.h 系统初始化文件:STM32Cube_FW_F4_V1.16.0\Drivers\CMSIS\Device\S

STM32借用固件库使用外设的说明

在选择使用哪些外设的的时候,是去更改从官方模版中拷贝过来的stm32f10x_conf.h文件的27-48行,把我们要用的外围的头文件包含进来,不用的外围的头文件注释掉,但是你是否发现我们根本没有在用户主程序文件中包含stm32f10x_conf.h这个文件.那我们的修改这个文件怎么进入主程序文件的呢?答案只有一个,它包含在stm32f10x.h这个文件中,因为在用户主文件main.c中我们第一句就使用了#include "stm32f10x.h",所以应该是stm32f10x.h这个

STM32 固件库与 CMSIS 标准如何理解?

一: STM32 固件库就是函数的集合,那么对这些函数有什么要求呢??这里就涉及到一个 CMSIS 标准的基础知识,这部分知识可以从<Cortex-M3 权威指南>中了解到,我们这里只是对权威指南的讲解做个概括性的介绍.经常有人问到 STM32 和 ARM 以及 ARM7是什么关系这样的问题,其实 ARM 是一个做芯片标准的公司,它负责的是芯片内核的架构设计,而 TI,ST 这样的公司,他们并不做标准,他们是芯片公司,他们是根据 ARM 公司提供的芯片内核标准设计自己的芯片.所以,任何一个做

第11章 GPIO输出-使用固件库点亮LED—零死角玩转STM32-F429系列

第11章 ????GPIO输出-使用固件库点亮LED 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/firege ? 本章参考资料:<STM32F4xx参考手册>.库帮助文档<stm32f4xx_dsp_stdperiph_lib_um.chm>. 利用库建立好的工程模板,就可以方便地使用STM32标准库编写应用程序了,可以说从这一章我们才开始迈入STM32开发的大门. LE

第9章 初识STM32固件库—零死角玩转STM32-F429系列

第9章 ????初识STM32固件库 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/firege ? 本章参考资料:<STM32F4xx参考手册>.<STM32F4xx规格书>.<Cortex-M3权威指南>, STM32标准库帮助文档:<stm32f4xx_dsp_stdperiph_lib_um.chm>. 在上一章中,我们构建了几个控制GPIO外

第9章 初识STM32固件库

第9章     初识STM32固件库 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/firege 本章参考资料:<STM32F4xx参考手册>.<STM32F4xx规格书>.<Cortex-M3权威指南>, STM32标准库帮助文档:<stm32f4xx_dsp_stdperiph_lib_um.chm>. 在上一章中,我们构建了几个控制GPIO外设的

第11章 GPIO输出—使用固件库点亮LED

第11章     GPIO输出-使用固件库点亮LED 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/firege 本章参考资料:<STM32F4xx参考手册>.库帮助文档<stm32f4xx_dsp_stdperiph_lib_um.chm>. 利用库建立好的工程模板,就可以方便地使用STM32标准库编写应用程序了,可以说从这一章我们才开始迈入STM32开发的大门. LED灯

STM32固件库详解

本文转自http://www.cnblogs.com/emouse/archive/2011/11/29/2268441.html 1.1 基于标准外设库的软件开发 1.1.1 STM32标准外设库概述 STM32标准外设库之前的版本也称固件函数库或简称固件库,是一个固件函数包,它由程序.数据结构和宏组成,包括了微控制器所有外设的性能特征.该函数库还包括每一个外设的驱动描述和应用实例,为开发者访问底层硬件提供了一个中间API,通过使用固件函数库,无需深入掌握底层硬件细节,开发者就可以轻松应用每一

STM32F407 新建基于固件库的项目模板

1.新建文件夹如图: 2.新建项目在USER文件夹中,选cpu如图: 若再弹出窗口, 直接点cancel 3.删了这俩文件夹: 4.复制文件到fwlib: src 存放的是固件库的.c 文件, inc 存放的是对应的.h 文件,每个外设对应一个.c 文件和一个.h 头文件 5.复制文件到core 很玄学的变了名字.. 6.复制文件到user 7.把源文件添加到工程 在keil中,左边一栏,对着target右键,manage project items FWLIB 选src里所有文件,删一个: c