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_cmFunc.h    :内核核心功能接口头文件。在CMSIS/Include中

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

core_cmSimd.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,通过预处理启 用或禁用标准外设库运行时的故障检测。

在Project\STM32F4xx_StdPeriph_Templates中。

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

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。

  1. #if !defined(STM32F40_41xxx) && !defined(STM32F427_437xx) && !defined(STM32F429_439xx) && !defined(STM32F401xx) && !defined(STM32F411xE) && \ !defined(STM32F446xx)
  2. #define STM32F40_41xxx /*!< STM32F405RG, STM32F405VG, STM32F405ZG, STM32F415RG, STM32F415VG, STM32F415ZG,
  3. STM32F407VG, STM32F407VE, STM32F407ZG, STM32F407ZE, STM32F407IG, STM32F407IE,
  4. STM32F417VG, STM32F417VE, STM32F417ZG, STM32F417ZE, STM32F417IG and STM32F417IE Devices */
  5.  
  6. /* #define STM32F427_437xx */ /*!< STM32F427VG, STM32F427VI, STM32F427ZG, STM32F427ZI, STM32F427IG, STM32F427II,
  7. STM32F437VG, STM32F437VI, STM32F437ZG, STM32F437ZI, STM32F437IG, STM32F437II Devices */
  8.  
  9. /* #define STM32F429_439xx */ /*!< STM32F429VG, STM32F429VI, STM32F429ZG, STM32F429ZI, STM32F429BG, STM32F429BI,
  10. STM32F429NG, STM32F439NI, STM32F429IG, STM32F429II, STM32F439VG, STM32F439VI,
  11. STM32F439ZG, STM32F439ZI, STM32F439BG, STM32F439BI, STM32F439NG, STM32F439NI,
  12. STM32F439IG and STM32F439II Devices */
  13.  
  14. /* #define STM32F401xx */ /*!< STM32F401CB, STM32F401CC, STM32F401RB, STM32F401RC, STM32F401VB, STM32F401VC
  15. STM32F401CD, STM32F401RD, STM32F401VD, STM32F401CExx, STM32F401RE and STM32F401VE Devices */
  16.  
  17. /* #define STM32F411xE */ /*!< STM32F411CD, STM32F411RD, STM32F411VD, STM32F411CE, STM32F411RE and STM32F411VE Devices */
  18.  
  19. /* #define STM32F446xx */ /*!< STM32F446MC, STM32F446ME, STM32F446RC, STM32F446RE, STM32F446VC, STM32F446VE, STM32F446ZC
  20. and STM32F446ZE Devices */
  21. #endif
  22.  
  23. /* Old STM32F40XX definition, maintained for legacy purpose */
  24. #ifdef STM32F40XX
  25. #define STM32F40_41xxx
  26. #endif /* STM32F40XX */
  27.  
  28. /* Old STM32F427X definition, maintained for legacy purpose */
  29. #ifdef STM32F427X
  30. #define STM32F427_437xx
  31. #endif /* STM32F427X */
  32.  
  33. /* Tip: To avoid modifying this file each time you need to switch between these
  34. devices, you can define the device in your toolchain compiler preprocessor.
  35. */
  36.  
  37. #if !defined(STM32F40_41xxx) && !defined(STM32F427_437xx) && !defined(STM32F429_439xx) && !defined(STM32F401xx) && !defined(STM32F411xE) && \ !defined(STM32F446xx)
  38. #error "Please select first the target STM32F4xx device used in your application (in stm32f4xx.h file)"
  39. #endif
  40.  
  41. #if !defined (USE_STDPERIPH_DRIVER)
  42. /**
  43. * @brief Comment the line below if you will not use the peripherals drivers.
  44. In this case, these drivers will not be included and the application code will
  45. be based on direct access to peripherals registers
  46. */
  47. #define USE_STDPERIPH_DRIVER
  48. #endif /* USE_STDPERIPH_DRIVER */

2、根据实际的外部晶振修改stm32f4xx.h文件中默认的系统外部晶振时钟HSE_VALU。在本例中使用了16MHz的外部晶振,因此设为16000000。

  1. #if defined(STM32F40_41xxx) || defined(STM32F427_437xx) || defined(STM32F429_439xx) || defined(STM32F401xx) || defined(STM32F411xE)
  2. #if !defined (HSE_VALUE)
  3. #define HSE_VALUE ((uint32_t)16000000) /*!< Value of the External oscillator in Hz */
  4. #endif /* HSE_VALUE */
  5. #elif defined(STM32F446xx)
  6. #if !defined (HSE_VALUE)
  7. #define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
  8. #endif /* HSE_VALUE */
  9. #endif /* STM32F40_41xxx || STM32F427_437xx || STM32F429_439xx || STM32F401xx || STM32F411xE */
  10. /**
  11. * @brief In the following line adjust the External High Speed oscillator (HSE) Startup
  12. Timeout value
  13. */
  14. #if !defined (HSE_STARTUP_TIMEOUT)
  15. #define HSE_STARTUP_TIMEOUT ((uint16_t)0x05000) /*!< Time out for HSE start up */
  16. #endif /* HSE_STARTUP_TIMEOUT */
  17.  
  18. #if !defined (HSI_VALUE)
  19. #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/
  20. #endif /* HSI_VALUE */

3、修改system_stm32f4xx.c文件中PLL_M,PLL_Q,PLL_N和PLL_P。

对于STM32F40_41xxx,系统时钟为168MHZ,一般只需修改PLL_M的值,PLL_N默认为336(若主时钟为168MHz则N值默认336,若主时钟为180MHz则N值默认360),PLL_P默认为2,PLL_Q默认为7。

  1. /************************* PLL Parameters *************************************/
  2. #if defined(STM32F40_41xxx) || defined(STM32F427_437xx) || defined(STM32F429_439xx) || defined(STM32F401xx)
  3. /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */
  4. #define PLL_M 16
  5. #elif defined (STM32F446xx)
  6. #define PLL_M 8
  7. #elif defined (STM32F411xE)
  8.  
  9. #if defined(USE_HSE_BYPASS)
  10. #define PLL_M 8
  11. #else
  12. #define PLL_M 16
  13. #endif /* USE_HSE_BYPASS */
  14.  
  15. #endif /* STM32F40_41xxx || STM32F427_437xx || STM32F429_439xx || STM32F401xx */
  16.  
  17. /* USB OTG FS, SDIO and RNG Clock = PLL_VCO / PLLQ */
  18. #define PLL_Q 7
  19.  
  20. #if defined(STM32F446xx)
  21. /* PLL division factor for I2S, SAI, SYSTEM and SPDIF: Clock = PLL_VCO / PLLR */
  22. #define PLL_R 7
  23. #endif /* STM32F446xx */
  24.  
  25. #if defined(STM32F40_41xxx) || defined(STM32F427_437xx) || defined(STM32F429_439xx) || defined(STM32F446xx)
  26. #define PLL_N 336
  27. /* SYSCLK = PLL_VCO / PLL_P */
  28. #define PLL_P 2
  29. #endif /* STM32F40_41xxx || STM32F427_437x || STM32F429_439xx || STM32F446xx */
  30.  
  31. #if defined(STM32F401xx)
  32. #define PLL_N 336
  33. /* SYSCLK = PLL_VCO / PLL_P */
  34. #define PLL_P 4
  35. #endif /* STM32F401xx */
  36.  
  37. #if defined(STM32F411xE)
  38. #define PLL_N 400
  39. /* SYSCLK = PLL_VCO / PLL_P */
  40. #define PLL_P 4
  41. #endif /* STM32F411xx */
  42.  
  43. /******************************************************************************/
  1. #if defined(STM32F40_41xxx)
  2. uint32_t SystemCoreClock = 168000000;
  3. #endif /* STM32F40_41xxx */
  4.  
  5. #if defined(STM32F427_437xx) || defined(STM32F429_439xx) || defined(STM32F446xx)
  6. uint32_t SystemCoreClock = ;
  7. #endif /* STM32F427_437x || STM32F429_439xx || STM32F446xx */
  8.  
  9. #if defined(STM32F401xx)
  10. uint32_t SystemCoreClock = ;
  11. #endif /* STM32F401xx */
  12.  
  13. #if defined(STM32F411xE)
  14. uint32_t SystemCoreClock = ;
  15. #endif /* STM32F401xx */

4、若需要使用FPU,则还需要在system_stm32f4xx.c中的SystemInit函数开头添加相关语句,并在keil工程配置中选择use FPU(Use Single Precision)

注意:__FPU_PRESENT == 1在stm32f4xx.h中已默认设置,__FPU_USED == 1在core_cm4.h中已默认设置。

  1. /* FPU settings ------------------------------------------------------------
  2. * If no this settings,it maybe enter HardFault_Handler() interrupt when mdk complier chose "Use FPU"(or "Use Single Precision") to use FPU instruction. */
  3. #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
  4. SCB->CPACR |= ((3UL << *)|(3UL << *)); /* set CP10 and CP11 Full Access */
  5. #endif

stm32f4xx标准外设固件库的更多相关文章

  1. GPIO 输出—使用固件库点亮 LED

    编程要点 1. 使能 GPIO 端口时钟:  2. 初始化 GPIO 目标引脚为推挽输出模式:  3. 编写简单测试程序,控制 GPIO 引脚输出高.低电平. LED的电路图 过程: 1.拷贝一个库函 ...

  2. 关于 CMSIS 标准 及 STM32F10x的固件库

    CMSIS 标准英文全称是Cortex MicroController Software Interface Standard,翻译为中文意思就是 ARM Cortex 微控制器软件接口标准. 由于基 ...

  3. 第9章 初识STM32固件库

    第9章     初识STM32固件库 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fire ...

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

    第11章     GPIO输出—使用固件库点亮LED 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku. ...

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

    第11章     GPIO输出—使用固件库点亮LED 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku. ...

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

    第9章     初识STM32固件库 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fire ...

  7. STM32 之 HAL库(固件库) _

    1 STM32的三种开发方式 通常新手在入门STM32的时候,首先都要先选择一种要用的开发方式,不同的开发方式会导致你编程的架构是完全不一样的.一般大多数都会选用标准库和HAL库,而极少部分人会通过直 ...

  8. STM32 之 HAL库(固件库)

    1 STM32的三种开发方式 通常新手在入门STM32的时候,首先都要先选择一种要用的开发方式,不同的开发方式会导致你编程的架构是完全不一样的.一般大多数都会选用标准库和HAL库,而极少部分人会通过直 ...

  9. STM32固件库

    一.STM32固件库开发和传统寄存器开发方式的区别 二.CMSIS标准 CMSIS标准--Cortex Microcontroller Software Interface Standard,是ARM ...

随机推荐

  1. ant-design form

    表单配置 示例代码 import { Form } from 'antd'; const FormItem = Form.Item; class NormalLoginForm extends Rea ...

  2. microbiom github reference

    https://github.com/SchlossLab https://github.com/crazyhottommy

  3. spring之HttpInvoker

    一.HttpInvoker是常用的Java同构系统之间方法调用实现方案,是众多Spring项目中的一个子项目.顾名思义,它通过HTTP通信即可实现两个Java系统之间的远程方法调用,使得系统之间的通信 ...

  4. python 解决url编译

    from urllib import parse s = parse.unquote("%7B%22name%22%3A%22joe%22%2C%22age%22%3A%2223%22%7D ...

  5. Filter配置多个url-pattern

    java开发中会用的Filter过滤器,有时候开发需要,在一个Filter中需要配置多个过滤地址,即<url-pattern>,下面就说一下一个Filter过滤器中多个<url-pa ...

  6. create-react-app创建react项目 css模块化处理

    用的css预处理器用sass,其他大同小异. 用create-react-app创建项目,执行npm run eject弹出配置文件(此操作不可逆): 配置sass,用的最新的CRA,webpack4 ...

  7. WEB安全基础之sql注入基础

    1.基础sql语句 注释 单行注释# %23--+ --加空格多行注释/**/ SELECT(VERSION()) SELECT(USER()) SELECT(database()) 查数据库 SEL ...

  8. MySQL☞lower函数

    lower(列名/字符串):将大写字母改成小写字母 格式: select  lower(列名/字符串)  from  表名 如下图:

  9. 跟浩哥学自动化测试Selenium -- 浏览器的基本操作与元素定位(3)

    浏览器的基本操作与元素定位 通过上一章学习,我们已经学会了如何设置驱动路径,如何创建浏览器对象,如何打开一个网站,接下来我们要进行一些复杂的操作比如先打开百度首页,在打开博客园,网页后退,前进等等,甚 ...

  10. 消费者用nginx做负载均衡,提供者用zookeeper自带功能实现负载均衡

    公司的项目基于阿里的Dubbo微服务框架开发.为了符合相关监管部门的安全要求,公司购买了华东1.华东2两套异地服务器,一套是业务服务器,一套是灾备服务器.准备在这两套服务器上实现Dubbo的分布式服务 ...