stm32f4_stm32f405 - CSDN
stm32f4 订阅
STM32F4是由ST(意法半导体)开发的一种高性能微控制器系列。其采用了90nm的NVM工艺和ART技术(自适应实时存储加速器,Adaptive Real-Time MemoryAccelerator™)。 展开全文
STM32F4是由ST(意法半导体)开发的一种高性能微控制器系列。其采用了90nm的NVM工艺和ART技术(自适应实时存储加速器,Adaptive Real-Time MemoryAccelerator™)。
信息
开发公司
ST(意法半导体)
类    型
高性能微控制器
工    艺
90nm的NVM工艺
外文名
STM32F4
STM32F4简介
ST(意法半导体)推出了以基于ARM® Cortex™-M4为内核的STM32F4系列高性能微控制器,其采用了90 纳米的NVM 工艺和ART(自适应实时存储器加速器,Adaptive Real-Time MemoryAccelerator™)。ART技术使得程序零等待执行,提升了程序执行的效率,将Cortext-M4的性能发挥到了极致,使得STM32 F4系列可达到210DMIPS@168MHz。自适应实时加速器能够完全释放Cortex-M4 内核的性能;当CPU 工作于所有允许的频率(≤168MHz)时,在闪存中运行的程序,可以达到相当于零等待周期的性能。STM32F4系列微控制器集成了单周期DSP指令和FPU(floating point unit,浮点单元),提升了计算能力,可以进行一些复杂的计算和控制。STM32 F4系列引脚和软件兼容于当前的STM32 F2系列产品。
收起全文
精华内容
参与话题
  • STM32F4学习笔记(基础介绍篇)

    千次阅读 2019-07-08 11:11:10
    这里我们学习的开发板芯片具体型号是STM32F407ZGT6,采用工作频率为168 MHz的Cortex™-M4内核,性能较强。 本篇包含的内容: 固件库简介 开发环境的简介 开发板的基础知识 一、固件库的介绍: 前言: 在51单片机中...

    来自官网的简介
    这里我们学习的开发板芯片具体型号是STM32F407ZGT6,采用工作频率为168 MHz的Cortex™-M4内核,性能较强。
    本篇包含的内容:

    1. 固件库简介
    2. 开发环境的简介
    3. 开发板的基础知识

    一、固件库的介绍:

    前言: 在51单片机中,我们经常是直接操作 寄存器:

    P0=0x11;  //通过16进制数赋值0,1直接设置寄存器每一位开启关闭
    

    在STM32中,面对大量的寄存器,很难全部记住并通过直接赋值来操作,开发效率太低且维护起来很麻烦,于是可以通过函数的方式将对寄存器的操作封装起来,我们大多数时候只需要使用函数调用接口(API):

    /**库函数控制电平的翻转
      *void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
      *{
      *	GPIO->BSRRL = GPIO_Pin;  //实际上还是控制寄存器,可以自行查询源码
      *}
      */
    //我们控制BSRRL寄存器实现电平控制只需要如下操作:
    GPIO_SetBits(GPIOF,GPIO_Pin_10);   //LED1对应引脚GPIOF.10,拉高电平表示灯灭
    

    在这里插入图片描述
    CMSIS标准:
    上面我们得知,固件库的存在实际上在一定程度上使得硬件与软件相分离,如果对于不同的硬件我们都使用同一个标准(比如,规范统一的命名,相同的结构层次)就能够实现较好的软件可移植性或者实现较好的兼容性
    arm公司为实现不同芯片公司生产的Cortex-M4芯片软件上的兼容,提出了CMSIS标准(Cortex Microcontroller Software Interface Standard)。可以简单理解为为了实现接口的规范统一。
    在这里插入图片描述
    以后我们还会知道其他如HAL、LL库等的使用,基本概念原理是一样的,此处不做讲解。

    STM32官方固件库讲解:
    下载连接(提取1234)
    在一个工程中,固件库之间的相互关系如下图:
    在这里插入图片描述
    1、Application.c:也就是main.c,程序的主逻辑文件。
    2、stm32f4xx.h:片上外设访问头文件,里面包含大量结构体和宏定义(寄存器定义声明及内存访问操作的封装)。
    3、system_stm32f4xx.h:包含SystemInit()函数的声明,用于系统启动时调用来设置整个系统和总线时钟
    4、stm32f4xx_it.c:编写中断服务函数,当然也可以将其编写在其他文件中比如各个硬件的驱动文件里面。
    5、stm32f4xx_conf.h:外设驱动配置文件,可以根据需要include相关的外设头文件。
    6、启动文件(startup_stm32f40_41xxx.s):堆栈的初始化、中断向量表以及中断函数定义。

    (加粗部分为我们经常需要打交道的地方)

    二、开发环境的简介

    前言: 我们使用MDK5(提取1234)进行软件的开发:
    软件的组成结构如下:
    在这里插入图片描述
    一般来说,第一次打开软件表观认识最多的应该是IDE Editer也就是代码编辑界面,其次如果首次使用某款芯片,会提示安装相关支持库,会使用到包安装器,对于软件其他部分可以在使用中慢慢感受(只需要明白MDK5不是简单的代码编辑器而已,是一个软件集合)。

    1、工程模板的建立:
    工程模板的建立是为了代码组织的清晰以及软件维护的方便。
    我们先看下ST官方库给出的工程模板包含的文件

      - Template/system_stm32f4xx.c   STM32F4xx 系统时钟配置文件
      - Template/stm32f4xx_conf.h     固件库配置文件
      - Template/stm32f4xx_it.c       中断处理文件
      - Template/stm32f4xx_it.h       中断处理头文件
      - Template/main.c               Main program
      - Template/main.h               Main program header file
    

    我们观察下对应工程模板在MDK5上的头文件路径设置:
    在这里插入图片描述
    第一步就是要搞明白,一个工程包含使用了哪些文件,我们对这些文件分类管理,创建出属于自己的工程模板。
    通过对比正点原子、st官方模板、cubeMx创建的模板,可以知道,完整的工程需要:

    1、core_cm4.h	//内核功能的定义,比如NVIC相关寄存器的结构体和Systick配置;
    2、core_cm4_simd.h	//包含与编译器相关的处理
    3、core_cmFunc.h	//内核核心功能接口头文件
    4、core_cmInstr.h	//包含一些内核核心专用指令
    
    5、startup_stm32f40_41xxx.s	//devices vector table for MDK-ARM toolchain
    6、stm32f4xx.h	//contains all the peripheral register's definitions, bits definitions 
    				//and memory mapping for STM32F4xx devices
    7、system_stm32f4xx.c	//contains the system clock configuration for STM32F4xx devices,
    						//关键函数SystemInit(),系统启动文件startup_stm32f40_41xxx.s里面调用
    8、stm32f4xx_conf.h	//里面包含了我们需要使用的标准库,对于需要使用的库需要在其中加以说明include,		
    					//stm32f4xx.h里面可以看到对其include
    					
    9、stm32f4xx_it.c	//provides template for all exceptions handler and 
              			// peripherals interrupt service routine.
    10、main.c		//主程序
    11、led.c 	//对于关键使用硬件的驱动配置文件
    

    对此我们对上面的文件分类存放管理:
    在这里插入图片描述
    我们创建这样一个目录结构后,导入相关文件,使用MDK5以该文件夹创建工程,然后将相关头文件路径进行设置好,一个工程模板就完成了(自己最好找到一个工程模板,将上述文件找到,并理清各个文件间的调用关系)。

    2、程序的下载调试:
    程序的下载方式:USB、串口(通常使用USB转成串口)、JTAG、SWD等。

    • 使用串口下载时,首先需要电脑安装相关的驱动(CH340驱动),然后使用flymcu选择相关hex文件下载到开发板中。
    • 使用JLINK下载:串口下载较为缓慢(每次都要全片擦除)且不能使用调试工具实时跟踪调试,使用JLINK、ULINK、STLINK等可以快速下载并实现程序跟踪调试。使用JLINK下载调试时需要注意设置为SW调试模式(JTAG模式会占用较多I/O口使得部分外设无法使用),相关驱动的安装不做详述。

    程序的调试:
    (注意:开发板上B0与B1要设置到GND以便代码下载后自动运行)
    按下debug键进入仿真调试模式(Load键会直接下载执行而不进入调试模式)
    在这里插入图片描述

    三、基础知识入门

    1、关于STM32系统总线架构:
    首先需要认识什么是总线以及总线的分类(联系计算机基础中学到的DB、CB、AB总线)。
    可以简单的认为总线就是信息的传递通道,连接各种外设和芯片,详细的介绍可以看这里
    一般说来,有系统总线AHB和外设总线APB,在STM32F4中,总线矩阵实现8条主控总线和7条被控总线之间的互连并完成相互间访问的仲裁(可以当成交警,指挥疏导交通运输)。不同速率要求的外设会挂载在不同的总线上组成相互之间的通信网络。
    在这里插入图片描述
    2、时钟系统:
    学习之前首先想一下为什么要时钟(看数电)?STM32时钟为什么那么多?时钟树是什么?
    首先考虑到不同外设需要的时钟频率以及时钟精度并不一致,我们对于不同的外设使用不同的时钟可以有效降低能耗并提高系统稳定性。
    时钟树就是对时钟源进行一系列的倍频和分频得到不同的频率时钟信号(如图一棵树,由根部向上分出枝干)。
    可以参考这篇博文学习(CLICK

    2.1 系统时钟SYSCLK的初始化:
    系统时钟的配置是在SystemInit()函数中完成的(system_stm32f4xx.c文件),配置完寄存器后该函数会调用SetSysClock函数。
    SystemInit()调用是在启动文件(startup_stm32f40_41xxx.s文件)中设置的:系统启动后,进入main之前会调用SystemInit()对系统时钟进行初始化,比如对外部晶振的时钟进行分频倍频得到不同的时钟源初始值。

    2.2 时钟的使能和配置:
    系统初始化完成后可能会需要修改某些时钟的默认配置或者使能外设时钟以便使用相关外设,这便需要使用到 stm32f4xx_rcc.h 文件。
    对于时钟的很多操作都是定义在 stm32f4xx_rcc.h 文件里,该文件的函数大致分类如下:

    • 时钟使能函数(外设使能与时钟源使能)
    • 外设复位函数(与上面的使能相对应,使用类似)
    • 时钟源选择和分频因子配置函数

    下面对这几类函数做简单讲解:
    +++ 首先我们从功耗角度考虑假定:任何时钟,你不设置它,默认为关闭。
    +++ 然后明确基本知识:

    • 我们有5条总线AHB1、AHB2、AHB3、APB1、APB2,下面分别挂载了不同的外设(具有不同的时钟)。
    • 我们有5大类时钟源(形象点:5个时钟树相互交叉在一起)

    在这里插入图片描述
    做个不严谨的比喻:我们可以认为时钟源就是一个大的水源,外设时钟是一个个小水库,有的水库可以有多个水源的水补充(比如系统时钟),水库周围的人(外设)要用水,就要打开水库(使能外设时钟),想喝多少(分频因子设置函数),喝哪里的水(时钟源选择函数)都可以选择。
    我们不可能一直开着水闸(浪费,所以设置一堆使能函数);
    不同的人不同用途对水的要求不一样(所以可以选择水库的水的来源,给你一堆时钟源配置函数)。
    现在你在回头看看这三个函数类别,是不是有点理解了?
    挨着顺序举个例:
    我们使用串口1,首先就要打开时钟:

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);  //串口1挂载在APB2总线,函数使用要对应其挂载的总线。
    

    然后再对串口1做相关的初始化参数配置就可以使用串口1了(不做展开)。
    时钟复位函数用法一致,不做举例。
    对于时钟源的开关,我们也有相关函数可以控制(5大类,6个函数):

    void        RCC_HSICmd(FunctionalState NewState);
    void        RCC_LSICmd(FunctionalState NewState);
    void        RCC_PLLCmd(FunctionalState NewState);
    void        RCC_PLLI2SCmd(FunctionalState NewState);
    void        RCC_PLLSAICmd(FunctionalState NewState);
    void        RCC_RTCCLKCmd(FunctionalState NewState);
    

    时钟源的选择(配置):

    void        RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource);  //配置系统时钟的来源,可以查看相关函数定义了解细节
    

    有的传入参数是分频,有的是时钟源,这样Config函数根据参数一般分为时钟源设置和分频设置或者兼具,具体可以查看函数定义,一般函数定义会有对参数有效性判断的函数,进入这个函数就可以清晰明白函数的真正用途(结合时钟树可以加深理解)。

    void RCC_PCLK1Config(uint32_t RCC_HCLK)
    {
      uint32_t tmpreg = 0;
    
      /* Check the parameters */
      assert_param(IS_RCC_PCLK(RCC_HCLK));   //查看这里的IS_RCC_PCL函数定义,如下
    	......  // 省略部分内容
    }
    
    #define RCC_HCLK_Div1                    ((uint32_t)0x00000000)
    #define RCC_HCLK_Div2                    ((uint32_t)0x00001000)
    #define RCC_HCLK_Div4                    ((uint32_t)0x00001400)
    #define RCC_HCLK_Div8                    ((uint32_t)0x00001800)
    #define RCC_HCLK_Div16                   ((uint32_t)0x00001C00)
    #define IS_RCC_PCLK(PCLK) (((PCLK) == RCC_HCLK_Div1) || ((PCLK) == RCC_HCLK_Div2) || \
                               ((PCLK) == RCC_HCLK_Div4) || ((PCLK) == RCC_HCLK_Div8) || \
                               ((PCLK) == RCC_HCLK_Div16))
    //看名字就可以知道这里是提高分频设置的
    

    3、I/O引脚复用与映射:
    一个芯片会有很多引脚,一块板子上面有很多外设,外设是需要与芯片引脚相连实现特定功能的,而我们又需要GPIO的存在(像我们点个灯啊,简单输入输出高低电平啥的),如果各自都单独使用,引脚会存在浪费情况(毕竟不是所有外设同时使用),所以一个引脚我们设置成可以复用为GPIO和多个内置外设的功能引脚。
    具体一个引脚作为什么功能用,可以通过寄存器控制参数(这里就讲讲相关设置的函数就行了,具体可以自己查阅相关寄存器功能列表和函数实现)。
    举个使用GPIOA.9以及GPIOA.10作为串口1的复用例子(串口需要收发就要两个引脚):

    /*1、如同前面所说,使用一个外设就要首先使能时钟,这里我们使能GPIO时钟以及串口的外设时钟*/
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); 
    
    /*2、初始化GPIOA的Pin9和Pin10引脚,配置为复用功能*/
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;  //这里配置为复用功能,其他还有输入输出等选项
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化GPIOA的两个引脚
    
    /*3、使用GPIO_PinAFConfig配置复用功能为串口1,具体是什么功能要看手册或者查源码(编辑器自动查看)*/
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);  //配置Pin9为TX端
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);  //配置Pin10为RX端
    

    这样我们就完成了GPIO的复用环节了,可能大家注意到我们对GPIOA做了初始化(步骤2),但没有对串口初始化,因为这里只是讲解初始化GPIOA作为复用功能,对于串口的使用(如何配置,后续再做讲解)。

    4、NVIC中断优先级管理:
    4.1 一些简单的补充:
    中断: 计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。STM32将中断分为内核中断和外部中断,可以就简单区别为内核中断是最高有限级的,不能打断(比如复位,非屏蔽中断,硬件错误等),而外部中断是我们主要操作对象,如外设发出的中断请求(IQR)我们可以设置优先级,可以直接屏蔽等。
    优先级: 分为抢占优先级和响应优先级。顾名思义,抢占的意思就是可以强制打断正在执行的中断响应(第一时间得到处理),而响应优先即就是简单的谁级别高谁就优先得到响应(排队排的快),但是不能打断正在执行的中断(别人已经再接收服务,自己来晚了你就不能让别人下来)。
    中断向量表: 一个中断向量占据4字节空间,是指中断服务程序入口地址的偏移量与段基值。中断向量表占据一个特定存储空间,它的作用就是按照中断类型号从小到大的顺序存储对应的中断向量。在中断响应过程中,CPU通过从接口电路获取的中断类型号(中断向量号)计算对应中断向量在表中的位置,并从中断向量表中获取中断向量,将程序流程转向中断服务程序的入口地址。

    4.2 言归正传:
    STM32F40xx/STM32F41xx总共有92个中断,包含10个内核中断和82个可屏蔽中断,具有16级可编程的中断优先级。
    Nested Vectored Interrupt Controller (NVIC)相关的寄存器定义在core_cm4.h文件内,可以看到里面很多位是保留的,M4内核提供的中断数量以及相关功能在STM32F40xx/STM32F41xx中只使用到一部分。我们对于中断的控制就是通过对下面这些寄存器操作实现的。

    /** \brief  Structure type to access the Nested Vectored Interrupt Controller (NVIC).
     */
    typedef struct
    {
      __IO uint32_t ISER[8];                 /*!< Offset: 0x000 (R/W)  Interrupt Set Enable Register           */
           uint32_t RESERVED0[24];
      __IO uint32_t ICER[8];                 /*!< Offset: 0x080 (R/W)  Interrupt Clear Enable Register         */
           uint32_t RSERVED1[24];
      __IO uint32_t ISPR[8];                 /*!< Offset: 0x100 (R/W)  Interrupt Set Pending Register          */
           uint32_t RESERVED2[24];
      __IO uint32_t ICPR[8];                 /*!< Offset: 0x180 (R/W)  Interrupt Clear Pending Register        */
           uint32_t RESERVED3[24];
      __IO uint32_t IABR[8];                 /*!< Offset: 0x200 (R/W)  Interrupt Active bit Register           */
           uint32_t RESERVED4[56];
      __IO uint8_t  IP[240];                 /*!< Offset: 0x300 (R/W)  Interrupt Priority Register (8Bit wide) */
           uint32_t RESERVED5[644];
      __O  uint32_t STIR;                    /*!< Offset: 0xE00 ( /W)  Software Trigger Interrupt Register     */
    }  NVIC_Type;
    

    中断管理函数主要是在misc.c文件里面:
    中断优先级分组函数(这里的分组是设置IP[240]里面我们使用的82个可屏蔽中断的抢占和响应优先级各占8 bit中的几位):

    void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
    {
      /* Check the parameters */
      assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));
      
      /* Set the PRIGROUP[10:8] bits according to NVIC_PriorityGroup value */
      SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;
    }
    

    设置好优先级分组后,就需要设置抢占优先级和响应优先级对应各自具体优先级大小(区别前面的分组和这里具体设置优先级的关系):
    这就要使用中断初始化函数

    void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
    typedef struct
    {
      uint8_t NVIC_IRQChannel;                    /*!< Specifies the IRQ channel to be enabled or disabled.
                                                       This parameter can be an enumerator of @ref IRQn_Type 
                                                       enumeration (For the complete STM32 Devices IRQ Channels
                                                       list, please refer to stm32f4xx.h file) */
    
      uint8_t NVIC_IRQChannelPreemptionPriority;  /*!< Specifies the pre-emption priority for the IRQ channel
                                                       specified in NVIC_IRQChannel. This parameter can be a value
                                                       between 0 and 15 as described in the table @ref MISC_NVIC_Priority_Table
                                                       A lower priority value indicates a higher priority */
    
      uint8_t NVIC_IRQChannelSubPriority;         /*!< Specifies the subpriority level for the IRQ channel specified
                                                       in NVIC_IRQChannel. This parameter can be a value
                                                       between 0 and 15 as described in the table @ref MISC_NVIC_Priority_Table
                                                       A lower priority value indicates a higher priority */
    
      FunctionalState NVIC_IRQChannelCmd;         /*!< Specifies whether the IRQ channel defined in NVIC_IRQChannel
                                                       will be enabled or disabled. 
                                                       This parameter can be set either to ENABLE or DISABLE */   
    } NVIC_InitTypeDef;
    

    举个具体例子:

    NVIC_InitTypeDef   NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//外部中断0
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;//抢占优先级0
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子优先级2
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
    NVIC_Init(&NVIC_InitStructure);//配置
    

    注:
    这里我们只是讲解了中断控制相关文件里面的中断优先级设置,还有一些不常用的函数可以自行查看misc.c文件,这里不做展开。
    需要明白的是:前面的是对所有中断都必须的通用的操作,而具体使用某一个外设中断,还需要设置对应的外设中断触发方式,清除中断标准,配置响应函数等等需要去查看对应的外设库文件。

    四、总结:

    在STM32库函数开发中,可以看到,对于开发板各个功能的实现还是类似51单片机一样对寄存器的操作。只不过,为了开发的方便快速,代码组织的清晰性,对各个寄存器使用结构体 组织在一起,对寄存器的操作变成了使用各种封装好的函数来对结构体赋值实现对寄存器的各个位的设置。
    平时可以多去看看固件库的源码,看看各个函数、结构体是怎么分类组织在各个文件中,各个文件在一个工程项目中的相互关系是怎么样的,可以找一个工程在脑海里思考下这个工程执行的时候各个文件函数是怎么样的执行顺序、调用关系。

    展开全文
  • STM32F4全套例程

    2020-07-30 23:32:03
    STM32F4系列芯片的全套例程,包含各个常用的外设功能。是学习和开发很好的参考源码。
  • STM32F4教程从零开始1——建工程

    万次阅读 2014-10-21 20:33:14
    今天,新买的机械到手,很开心,用得很爽,所以

    今天,新买的机械到手,很开心,用得很爽,所以决定再写一篇,话说这是我第一次买机械键盘,我现在也支持程序员可以没有一个好的电脑,但必须有一个好的键盘的说法了。。。

    接着,开始我们的游戏吧。

    建工程分成5个阶段:

    建目录——复制文件——MDK建工程——下载器设置

    第一个阶段——建目录

    1、在一个干净的文件夹里,见一个新文件夹F407,然后把下载好的固件库复制过来


    2、在F407里面建5个目录(我们先来必须的,具体工程应用时目录更多,随着这系列的教程的继续会持续增加。。)

    CMSIS:用于存放STM32的CPU核心相关的文件

    Library:存放STM32的外设库,这是STM32好入门的关键,大大简化了编程

    Driver:存放芯片级的驱动文件,如Bsp.c(板级支持包)、中断处理函数的文件、外设库的配置文件

    User:用户的文件夹,存放如main..c、Global.h、用户新建的其他文件

    Prj:MDK工程相关的目录,存放编译生成的中间文件,KEIL工程相关的文件


    然后在Prj目录下新建Output目录和List目录,把编译生成的临时文件放在Output里面,备份或者拷给别人的时候,把Output里面的文件删掉可以大大减小压缩包的容量。


    3、解压缩固件库到当且目录


    这个目录里面我们主要用Libraries和Project里面的文件,那个chm是这个固件库的说明文档,里面有大量的例程。

    然后,把我们的工程目录和固件库目录在桌面上并排方便操作


    然后进入下一个阶段

    第二阶段——复制文件

    1、复制CMSIS里面的文件,也就是CPU相关的文件

    都在固件库的\Libraries\CMSIS目录下

    \Libraries\CMSIS\Device\ST\STM32F4xx\Include下的system_stm32f4xx.h和stm32f4xx.h

    \Libraries\CMSIS\Device\ST\STM32F4xx\Source\Templates下的system_stm32f4xx.c

    \Libraries\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm下的startup_stm32f40xx.s,这个目录下文件要根据所用的芯片选择,我们用的是F407所以。。。

    \Libraries\CMSIS\Include\下的core_cm4.h和core_cm4_simd.h和core_cmFunc.h和core_cmInstr.h,STM32F1XX的小伙伴们注意选带cm3的。。。

    这样CMSIS目录下共有8个文件


    2、复制Library里的文件

    这个简单,把\Libraries\STM32F4xx_StdPeriph_Driver下的src目录和inc目录复制过去就可以了

    3、复制到Driver里的文件

    \Project\STM32F4xx_StdPeriph_Templates下的stm32f4xx_conf.h和stm32f4xx_it.c和stm32f4xx_it.h

    并且在目录下新建文件Bsp.c和Bsp.h(暂时不用,也可以不建)

    4、复制到User里的文件

    \Project\STM32F4xx_StdPeriph_Templates下的main.c和main.h

    这个就不用截图了吧,复制结束,进入下一关

    第三阶段——MDK建工程

    1、启动MDK,也就是KEIL,我用是MDK5.1,并点击Project->New u.......不打了

    2、目录选择到我们的工程的Prj目录下,敲入工程名F407,点确定

    3、芯片选择F407VG,脑残级操作,把后来弹出来的窗口关了,没有弹出来的就算了

    4、点工具栏上那个三个正方形的图标

    5、添加目录,并添加响应文件夹里的文件,

    注意添加CMSIS里面的文件的时候要把文件类型选成.*,避免漏掉.s文件,Library目录只需要添加src里面的文件就行了,那个Bsp就不用加了,还没写呢。。

    6、工程设置,点击工具栏上的魔术棒图标

    7、设置Output到Output目录,List到List目录

    8、切换到C/C++选项卡,填入define内容

    USE_STDPERIPH_DRIVER STM32F40XX(注意XX是大写的,就是跟CMSIS里面的.s文件一样,后来发现截图错了,懒得改了)

    然后,点include paths后面的按钮,进入include设置窗口

    9、添加工程的所有目录,除了Prj以外,Library里添加的是inc目录等其他目录,然后点OK


    10、编译,点工具栏上的编译按钮

    应该是没有错误或者有两个错误,用官方的纯净的固件库是没有错误的,如果用disvovery的包的话是会有两个错误的。就是没有选用是那块板子。。

    这个时候,把main.h里面的

    #if defined (USE_STM324xG_EVAL)
      #include "stm324xg_eval.h"
      #include "stm324xg_eval_lcd.h"
    
    #elif defined (USE_STM324x7I_EVAL) 
      #include "stm324x7i_eval.h"
      #include "stm324x7i_eval_lcd.h"
    
    #else
     #error "Please select first the Evaluation board used in your application (in Project Options)"
    #endif
    删了,注释比较保险。。

    把main.c里面的

    #if defined (USE_STM324xG_EVAL)
      #define MESSAGE1   "     STM32F40xx     "
      #define MESSAGE2   " Device running on  " 
      #define MESSAGE3   "   STM324xG-EVAL    "
    
    #else /* USE_STM324x7I_EVAL */ 
      #define MESSAGE1   "     STM32F427x     "
      #define MESSAGE2   " Device running on  " 
      #define MESSAGE3   "  STM324x7I-EVAL    "
    #endif 
    删了,main函数也删了,重新写一个,哪些代码都是用官方的板子实现的,我们一般不用哪些代码

    重新写一个main函数

    int main(void)
    {
      RCC_GetClocksFreq(&RCC_Clocks);
      SysTick_Config(RCC_Clocks.HCLK_Frequency / 100);
     while(1)
     {
     }
    }

    重新编译,不会报错了吧,可能有一个waring,暂时忽略。

    这样一个工程就建好了。

    第四阶段——下载器设置

    我用的是st-LINK,jlink同理,但是jlink一般用jtag接口下载,而st-link一般用swd接口下载。jlink也是支持swd的。。。

    1、点那个工具栏上的魔术棒按钮,然后点debug选项卡,选择合适的下载器,jlink之类的,然后点setting

    2、选择swd模式,看自己需求,用jtag接口的就不用改了,jtag一般用20pin那种,swd只有4-6根线。。

    3、点flash download选项卡,把reset打上勾,然后点adding

    4、选择合适的flash,看芯片说明

    5、然后一路oK就OK了。

    最后点工具栏上的下载按钮,下进去了,是不是很有成就感。哇咔咔。

    最后,说一点,STM32F4一般配8M或者25M的晶振,这个需要根据实际情况修改库文件

    在CMSIS下的stm32f4xx.h和system_stm32f4xx.c,有一个是只读的需要设置属性,去掉只读。

    stm32f4xx.h第100行

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

    我的板子是8M的,所以把25改成8

    system_stm32f4xx.c的第155行

    #define PLL_M      25

    我的板子是8M的,所以把25改成8

    OK,这样就差不多了。好累啊。。。

    有空把我工程发上来。。

    工程链接:




    展开全文
  • STM32F407--芯片解读

    万次阅读 多人点赞 2018-12-26 18:21:17
    注:博主使用的是STM32F4探索者   一、参考资料 1、STM32F4数据手册:STM32F407ZGT6.pdf 2、STM32F4中文手册:STM32F4xx中文参考手册.pdf 3、开发板原理图:Explorer STM32F4_Vxx_SCH.pdf   二、芯片内部...

    注:博主使用的是STM32F4探索者

     

    一、参考资料

    1、STM32F4数据手册:STM32F407ZGT6.pdf

    2、STM32F4中文手册:STM32F4xx中文参考手册.pdf

    3、开发板原理图:Explorer STM32F4_Vxx_SCH.pdf

     

    二、芯片内部资源

    1、芯片实物图片

    2、芯片对应的参数表

    3、内核

    (1)32位 高性能ARM Cortex-M4处理器

    (2)时钟: 高达168MHz,实际还可以超频一点点

    (3)支持FPU(浮点运算)和DSP指令

    4、IO口

    (1)STM32F407ZGT6:144引脚 114个IO口

    (2)大部分IO口都耐 5V (模拟通道除外)

    (3)支持调试: SWD和JTAG,SWD只要2根数据线

    5、存储器

    (1)存储器容量: 1024K FLASH, 192K SRAM

    6、时钟、复位和电源管理

    (1)1.8~3.6V电源和IO电压

    (2)上电复位,掉电复位和可编程的电压监控

    (3)强大的时钟系统

            - 4~26M的外部高速晶振

            - 内部16MHz的高速RC振荡器

            - 内部锁相环(PLL,倍频),一般系统时钟都是外部或者是内部高速时钟经过PLL倍频后得到

            - 外部低速32.768K的晶振,主要做RTC时钟源

    7、低功耗

    (1)睡眠、停止和待机三种低功耗模式

    (2)可用电池为RTC和备份寄存器供电

    8、AD

    (1)3个12位AD[多达24个外部测试通道]

    (2)内部通道可以用于内部温度测量

    (3)内置参考电压

    9、DA

    (1)2个12位DA

    10、DMA

    (1)16个DMA通道,带FIFO和突发支持

    (2)支持外设:定时器、ADC、DAC、SDIO、I2S、SPI、I2C和USART

    11、定时器多达17个

    (1)10个通用定时器(TIM2和TIM5是32位)

    (2)2个基本定时器

    (3)2个高级定时器

    (4)1个系统定时器

    (5)2个看门狗定时器

    12、通信接口多达17个

    (1)3个I2C接口

    (2)6个串口

    (3)3个SPI接口

    (4)2个CAN2.0

    (5)2个USB OTG

    (6)1个SDIO

     

    三、芯片内部结构图

    数据手册P17

     

    四、芯片引脚和功能怎么对应

    1、芯片内部结构图

    2、数据手册引脚功能表

     

    五、STM32最小系统--看原理图

     

     

     

     

     

     

     

     

     

     

    展开全文
  • 作为Cortex M3市场的最大占有者,ST公司在2011年又推出基于Cortex M4内核的STM32F4系列产品,相对与STM32F1/F2等Cortex M3产品,STM32F4最大的优势,就是新增了硬件FPU单元以及DSP指令,同时,STM32F4的主频也提高了...
  • STM32F4—初次搭建工程

    千次阅读 2018-05-15 17:08:24
    程序小白的我从安装mdk5.14搭建平台到更新至V5.25搭建平台,并配置相关参数,发现了一些问题,并查看一些博友的文章最终得以解决,以供以后如有类似情况可以查看解决。 如图所示,建立相关文件夹。...

            程序小白的我从安装mdk5.14搭建平台到更新至V5.25搭建平台,并配置相关参数,发现了一些问题,并查看一些博友的文章最终得以解决,以供以后如有类似情况可以查看解决。

            如图所示,建立相关文件夹。打开MDK,Project->New uVision Project

                                                  

                    

                此处注意的是需要选择相应的芯片,我们选择的是STM32F407ZGT6,一定要安装相应的pack安装包才可以建立工程文件。    接着,我们添加相应的启动代码(startup_stm32f40_41xxx.s)。

            启动代码的主要作用如下:    

                1.堆栈(SP)的初始化;

                2.初始化程序计算器(PC);

                3.设置向量表异常事件的入口地址;

                4.调用main函数。

            其中我们修改了启动文件的Reset_handler函数,该段代码主要加入了开启STM32F4硬件FPU的代码,以使能STM32F4的浮点运算单元。

            其中的0xE000ED88为协处理器控制寄存器(CPACR)的地址,该寄存器的第20~23位用来控制是否支持浮点运算,此处全部设置为1,以支持浮点运算。

            mdk的target Code Generation 选用Use FPU    (V5.25 版本显示为 Single Precision)   。(mdk默认STM32F4外部晶振为12M,此处Xtal(Mhz)设置为8.0M)

            然后在Target目录树打开Manage Project Items进行目录创建和文件添加。

           接着就是设置OBJ输出目录,将生成的hex文件放置在OBJ目录里。Options for Target->Output->Create Hex File->Select Folder For Objects->找到OBJ文件夹->OK

            头文件相关处理在Options for Target->C/C++选项中

            Define  :  STM32F40_41xxx

            Optimization :    -O0   

            Inlcude  Paths   添加相应的头文件路径

            Jlink相关驱动建议调用以往支持的Segger目录。


    展开全文
  • stm32F4编程指南

    2020-07-30 23:31:51
    STM32F407xx, STM32F415xx, and STM32F417xx microcontrollers. For convenience, these will be referred to as STM32F40x and STM32F41x, throughout the document unless otherwise specified.
  • stm32f4官方库文件,亲测可用。stm32f4官方库文件,亲测可用。
  • 【干货】老外的GitHub整理的stm32f4驱动库

    千次阅读 热门讨论 2019-08-17 17:24:22
    昨晚在github发现了一个老外自己整理的封装库,有很多,比如一些通讯啊啥的,一些显示屏驱动...Here are listed all libraries for STM32F4 devices.Libraries are designed to work with STM32F4xx series of MCU. ...
  • STM32F4开发-新建工程

    千次阅读 2019-05-04 20:43:31
    一、总述 之前买了一块STM32F407ZG的核心板,以及和它配套的TFT显示屏,学了很久了吧。最近同学让我教他STM32开发,于是就想写点...(为了减小开发负担,在这里使用了STM32F4的StdPeriph固件库) 二、第一步—...
  • STM32F4STM32F1的区别

    万次阅读 2017-01-09 13:20:42
    作为Cortex M3市场的最大占有者,ST公司在2011年又推出基于Cortex M4内核的STM32F4系列产品,相对与STM32F1/F2等Cortex M3产品,STM32F4最大的优势,就是新增了硬件FPU单元以及DSP指令,同时,STM32F4的主频也提高了...
  •  不同的STM32系列有不同数量的定时器,针对现在学习的STM32F40x系列总共有14个定时器,针对这14个定时器可以将其分为3类,高级定时器、通用定时器和基本定时器,三种定时器大同小异,下边会针对通用定时器来介绍...
  • STM32F1和STM32F4 区别

    万次阅读 2018-08-22 15:28:48
    原文地址 http://www.51testing.com/html/54/238554-858686.html STM32F4相对于STM32F1的改进不只一点点,为了便于初学者了解,我们比对相关资料将改进点进行了汇总。 STM32F1和STM32F4 区别 &nb...
  • 从大二到现在玩stm32也有年了,估计以后用stm32
  • stm32F4xx中文参考手册

    千次阅读 2019-08-04 11:23:07
    本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、 STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。 添加链接描述 提取码滴滴我 ...
  • 之前学习STM32F1,由于f1在国内太热门,资料漫天飞,
  • keil 5 如何安装stm32f4的库

    万次阅读 2019-03-11 21:26:50
    最近要用stm32f407芯片写程序,但是我的keil5之前只用过stm32f1系列的库,因此需要下载安装 单击下面图标 然后按下图操作: 最后点击install(安装),这时下载,但是有可能很慢,因此也可以直接用下面百度网盘的...
  • KEIL 5 pack离线包 Stm32f1/f2/f3/f4

    万次阅读 多人点赞 2020-03-23 17:49:17
    keil5 pack 离线包安装:安装过keil5软件后,...F1pack包https://keilpack.azureedge.net/pack/Keil.STM32F1xx_DFP.2.3.0.pack F2pack包https://keilpack.azureedge.net/pack/Keil.STM32F2xx_DFP.2.9.0.pack F3pa...
  • STM32Cube_FW_F4_V1.17 F4固件包百度网盘下载 链接:httppan.baidu.coms1pLLtoxH 密码:n3re STM32Cube_FW_F4_V1.16 链接:http://pan.baidu.com/s/1mi222Li 密码:fw6x STM32CUBEMX 4.22 链接:...
  • STM32F4修改晶振频率

    千次阅读 2017-03-06 12:27:20
    stm32f4晶振频率为25mhz,若开发板外接的晶振频率为8mhz,则会导致定制器时钟不精确,串口打印输出也会乱码,需进行一下修改: 点击system_stm32f4xx.c文件,找到 #define PLL_M 25 这条语句,将参数值25改为8,在这...
1 2 3 4 5 ... 20
收藏数 15,007
精华内容 6,002
关键字:

stm32f4