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系列产品。
收起全文
精华内容
下载资源
问答
  • STM32F4STM32F1的区别

    万次阅读 多人点赞 2017-01-09 13:17:41
    作为Cortex M3市场的最大占有者,ST公司在2011年又推出基于Cortex M4内核的STM32F4系列产品,相对与STM32F1/F2等Cortex M3产品,STM32F4最大的优势,就是新增了硬件FPU单元以及DSP指令,同时,STM32F4的主频也提高了...

    作为Cortex M3市场的最大占有者,ST公司在2011年又推出基于Cortex M4内核的STM32F4系列产品,相对与STM32F1/F2等Cortex M3产品,STM32F4最大的优势,就是新增了硬件FPU单元以及DSP指令,同时,STM32F4的主频也提高了很多,达到168Mhz(可获得210DMIPS的处理能力),这使得STM32F4尤其适用于需要浮点运算或DSP处理的应用,也被称之为:DSC,具有非常广泛的应用前景。
    STM32F4相对于STM32F1,主要优势如下:
    1, 更先进的内核。STM32F4采用Cortex M4内核,带FPU和DSP指令集,而STM32F1采用的是Cortex M3内核,不带FPU和DSP指令集。
    2, 更多的资源。STM32F4拥有多达192KB的片内SRAM,带摄像头接口(DCMI)、加密处理器(CRYP)、USB高速OTG、真随机数发生器、OTP存储器等。
    3, 增强的外设功能。对于相同的外设部分,STM32F4具有更快的模数转换速度、更低的ADC/DAC工作电压、32位定时器、带日历功能的实时时钟(RTC)、IO复用功能大大增强、4K字节的电池备份SRAM以及更快的USART和SPI通信速度。
    4, 更高的性能。STM32F4最高运行频率可达168Mhz,而STM32F1只能到72Mhz;STM32F4拥有ART自适应实时加速器,可以达到相当于FLASH零等待周期的性能,STM32F1则需要等待周期;STM32F4的FSMC采用32位多重AHB总线矩阵,相比STM32F1总线访问速度明显提高。
    5, 更低的功耗。STM32F40x的功耗为:238uA/Mhz,其中低功耗版本的STM32F401更是低到:140uA/Mhz,而STM32F1则高达421uA/Mhz。

    展开全文
  • STM32STM32F4开发板简介

    千次阅读 2020-08-17 11:08:27
    ALIENTEK 探索者 STM32F4 开发板,资源十分丰富,并把 STM32F407的内部资源发挥到了极致,基本所有 STM32F407 的内部资源,都可以在此开发板上验证,同时扩充丰富的接口和功能模块,整个开发板显得十分大气 02. STM...

    00. 目录

    01. STM32F4开发板的资源图

    在这里插入图片描述

    ALIENTEK 探索者 STM32F4 开发板,资源十分丰富,并把 STM32F407的内部资源发挥到了极致,基本所有 STM32F407 的内部资源,都可以在此开发板上验证,同时扩充丰富的接口和功能模块,整个开发板显得十分大气

    02. STM32F4开发板板载资源

    ALIENTEK 探索者 STM32F4 开发板板载资源如下:

    ◆ CPU:STM32F407ZGT6,LQFP144,FLASH:1024K,SRAM:192K;
    ◆ 外扩 SRAM:XM8A51216,1M 字节
    ◆ 外扩 SPI FLASH:W25Q128,16M 字节
    ◆ 1 个电源指示灯(蓝色)
    ◆ 2 个状态指示灯(DS0:红色,DS1:绿色)
    ◆ 1 个红外接收头,并配备一款小巧的红外遥控器
    ◆ 1 个 EEPROM 芯片,24C02,容量 256 字节
    ◆ 1 个六轴(陀螺仪+加速度)传感器芯片,MPU6050
    ◆ 1 个高性能音频编解码芯片,WM8978
    ◆ 1 个 2.4G 无线模块接口,支持 NRF24L01 无线模块
    ◆ 1 路 CAN 接口,采用 TJA1050 芯片
    ◆ 1 路 485 接口,采用 SP3485 芯片
    ◆ 2 路 RS232 串口(一公一母)接口,采用 SP3232 芯片
    ◆ 1 路单总线接口,支持 DS18B20/DHT11 等单总线传感器
    ◆ 1 个 ATK 模块接口,支持 ALIENTEK 蓝牙/GPS 模块
    ◆ 1 个光敏传感器
    ◆ 1 个标准的 2.4/2.8/3.5/4.3/7 寸 LCD 接口,支持电阻/电容触摸屏
    ◆ 1 个摄像头模块接口
    ◆ 1 个 OLED 模块接口
    ◆ 1 个 USB 串口,可用于程序下载和代码调试(USMART 调试)
    ◆ 1 个 USB SLAVE 接口,用于 USB 从机通信
    ◆ 1 个 USB HOST(OTG)接口,用于 USB 主机通信
    ◆ 1 个有源蜂鸣器
    ◆ 1 个 RS232/RS485 选择接口
    ◆ 1 个 RS232/模块选择接口
    ◆ 1 个 CAN/USB 选择接口
    ◆ 1 个串口选择接口
    ◆ 1 个 SD 卡接口(在板子背面)
    ◆ 1 个百兆以太网接口(RJ45)
    ◆ 1 个标准的 JTAG/SWD 调试下载口
    ◆ 1 个录音头(MIC/咪头)
    ◆ 1 路立体声音频输出接口
    ◆ 1 路立体声录音输入接口
    ◆ 1 路扬声器输出接口,可接 1W 左右小喇叭
    ◆ 1 组多功能端口(DAC/ADC/PWM DAC/AUDIO IN/TPAD)
    ◆ 1 组 5V 电源供应/接入口
    ◆ 1 组 3.3V 电源供应/接入口
    ◆ 1 个参考电压设置接口
    ◆ 1 个直流电源输入接口(输入电压范围:DC6~16V)
    ◆ 1 个启动模式选择配置接口

    ◆ 1 个 RTC 后备电池座,并带电池
    ◆ 1 个复位按钮,可用于复位 MCU 和 LCD
    ◆ 4 个功能按钮,其中 KEY_UP(即 WK_UP)兼具唤醒功能
    ◆ 1 个电容触摸按键
    ◆ 1 个电源开关,控制整个板的电源
    ◆ 独创的一键下载功能
    ◆ 除晶振占用的 IO 口外,其余所有 IO 口全部引出

    03. STM32F4部分资源说明

    3.1 JTAG/SWD

    ALIENTEK 探索者 STM32F4 开发板板载的 20 针标准 JTAG 调试口(JTAG),该 JTAG口直接可以和 ULINKJLINK 或者 STLINK 等调试器(仿真器)连接,同时由于 STM32 支持SWD 调试,这个 JTAG 口也可以用 SWD 模式来连接。用标准的 JTAG 调试,需要占用 5 个 IO 口,有些时候,可能造成 IO 口不够用,而用 SWD则只需要 2 个 IO 口,大大节约了 IO 数量,但他们达到的效果是一样的,所以我们 强烈建议仿用真器使用 SWD 模式!

    3.2 STM32F407ZGT6

    开发板的核心芯片(U4),型号为:STM32F407ZGT6。该芯片集成 FPU 和 DSP 指令,并具有 192KB SRAM、1024KB FLASH、12 个 16 位定时器、2 个 32 位定时器、2 个 DMA 控制器(共16个通道)、3个SPI、2个全双工I2S、3个IIC、6个串口、2个USB(支持HOST /SLAVE)、2 个 CAN、3 个 12 位 ADC、2 个 12 位 DAC、1 个 RTC(带日历功能)、1 个 SDIO 接口、1 个FSMC 接口、1 个 10/100M 以太网 MAC 控制器、1 个摄像头接口、1 个硬件随机数生成器、以及 112 个通用 IO 口等。

    04. 附录

    6.1 【STM32】STM32系列教程汇总

    网址:【STM32】STM32系列教程汇总

    05. 声明

    该教程参考了正点原子的《STM32 F4 开发指南》

    展开全文
  • STM32STM32F4时钟系统

    千次阅读 2020-08-29 14:53:33
    STM32F4时钟系统概述02. STM32F4时钟系统图03. STM32F4时钟初始化配置04. 时钟配置总结05. 预留06. 附录07. 声明 01. STM32F4时钟系统概述 时钟系统是 CPU 的脉搏,就像人的心跳一样。所以时钟系统的重要性就...

    00. 目录

    01. STM32F4时钟系统概述

    时钟系统是 CPU 的脉搏,就像人的心跳一样。所以时钟系统的重要性就不言而喻了。 STM32F4 的时钟系统比较复杂,不像简单的 51 单片机一个系统时钟就可以解决一切。于是有人要问,采用一个系统时钟不是很简单吗?为什么 STM32 要有多个时钟源呢? 因为首先 STM32 本身非常复杂,外设非常的多,但是并不是所有外设都需要系统时钟这么高的频率,比如看门狗以及 RTC 只需要几十 k 的时钟即可。同一个电路,时钟越快功耗越大,同时抗电磁干扰能力也会越弱,所以对于较为复杂的 MCU 一般都是采取多时钟源的方法来解决这些问题。

    02. STM32F4时钟系统图

    在这里插入图片描述

    在 STM32F4 中,有 5 个最重要的时钟源,为 HSI、HSE、LSI、LSE、PLL。其中 PLL 实际是分为两个时钟源,分别为主 PLL 和专用 PLL。从时钟频率来分可以分为高速时钟源和低速时钟源,在这 5 个中 HSI,HSE 以及 PLL 是高速时钟,LSI 和 LSE 是低速时钟。从来源可分为外部时钟源和内部时钟源,外部时钟源就是从外部通过接晶振的方式获取时钟源,其中 HSE 和LSE 是外部时钟源,其他的是内部时钟源。下面我们看看 STM32F4 的这 5 个时钟源,我们讲解顺序是按图中红圈标示的顺序:

    ①、LSI 是低速内部时钟,RC 振荡器,频率为 32kHz 左右。供独立看门狗和自动唤醒单元使用。
    ②、LSE 是低速外部时钟,接频率为 32.768kHz 的石英晶体。这个主要是 RTC 的时钟源。
    ③、HSE 是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为 4MHz~26MHz。我们的开发板接的是 8M 的晶振。HSE 也可以直接做为系统时钟或者 PLL 输入。
    ④、HSI 是高速内部时钟,RC 振荡器,频率为 16MHz。可以直接作为系统时钟或者用作 PLL输入。

    ⑤、PLL 为锁相环倍频输出。STM32F4 有两个 PLL:
    1) 主 PLL(PLL)由 HSE 或者 HSI 提供时钟信号,并具有两个不同的输出时钟。
    第一个输出 PLLP 用于生成高速的系统时钟(最高 168MHz)
    第二个输出 PLLQ 用于生成 USB OTG FS 的时钟(48MHz),随机数发生器的时钟和 SDIO时钟。
    2)专用 PLL(PLLI2S)用于生成精确时钟,从而在 I2S 接口实现高品质音频性能。

    A. 这里是看门狗时钟输入。从图中可以看出,看门狗时钟源只能是低速的 LSI 时钟。

    B. 这里是 RTC 时钟源,从图上可以看出,RTC 的时钟源可以选择 LSI,LSE,以及HSE 分频后的时钟,HSE 分频系数为 2~31。

    C. 这里是 STM32F4 输出时钟 MCO1 和 MCO2。MCO1 是向芯片的 PA8 引脚输出时钟。它有四个时钟来源分别为:HSI,LSE,HSE 和 PLL 时钟。MCO2 是向芯片的PC9 输出时钟,它同样有四个时钟来源分别为:HSE,PLL,SYSCLK 以及 PLLI2S时钟。MCO 输出时钟频率最大不超过 100MHz。

    D. 这里是系统时钟。从图 4.3.1 可以看出,SYSCLK 系统时钟来源有三个方面:HSI,HSE 和 PLL。在我们实际应用中,因为对时钟速度要求都比较高我们才会选用 STM32F4 这种级别的处理器,所以一般情况下,都是采用 PLL 作为 SYSCLK时钟源。根据前面的计算公式,大家就可以算出你的系统的 SYSCLK 是多少。

    E. 这里我们指的是以太网 PTP 时钟,AHB 时钟,APB2 高速时钟,APB1 低速时钟。这些时钟都是来源于 SYSCLK 系统时钟。其中以太网 PTP 时钟是使用系统时钟。AHB,APB2 和 APB1 时钟是经过 SYSCLK 时钟分频得来。这里大家记住,AHB最大时钟为168MHz, APB2高速时钟最大频率为84MHz,而APB1低速时钟最大频率为 42MHz。

    F. 这里是指 I2S 时钟源。从图 4.3.1 可以看出,I2S 的时钟源来源于 PLLI2S 或者映射到 I2S_CKIN 引脚的外部时钟。I2S 出于音质的考虑,对时钟精度要求很高。探索者 STM32F4 开发板使用的是内部 PLLI2SCLK。

    G. 这是 STM32F4 内部以太网 MAC 时钟的来源。对于 MII 接口来说,必须向外部PHY 芯片提供 25Mhz 的时钟,这个时钟,可以由 PHY 芯片外接晶振,或者使用STM32F4 的 MCO 输出来提供。然后,PHY 芯片再给 STM32F4 提供ETH_MII_TX_CLK 和 ETH_MII_RX_CLK 时钟。对于 RMII 接口来说,外部必须提供 50Mhz 的时钟驱动 PHY 和 STM32F4 的 ETH_RMII_REF_CLK,这个 50Mhz时钟可以来自 PHY、有源晶振或者 STM32F4 的 MCO。我们的开发板使用的是RMII 接 口 , 使 用 PHY 芯 片 提 供 50Mhz 时 钟 驱 动 STM32F4 的ETH_RMII_REF_CLK。

    H. 这里是指外部 PHY 提供的 USB OTG HS(60MHZ)时钟。

    03. STM32F4时钟初始化配置

    STM32F4 时钟系统初始化是在 system_stm32f4xx.c 中的 SystemInit()函数中完成的。对于系统时钟关键寄存器设置主要是在 SystemInit 函数中调用 SetSysClock()函数来设置的。我们可以先看看 SystemInit ()函数体。

    /**
      * @brief  Setup the microcontroller system
      *         Initialize the Embedded Flash Interface, the PLL and update the 
      *         SystemFrequency variable.
      * @param  None
      * @retval None
      */
    void SystemInit(void)
    {
      /* FPU settings ------------------------------------------------------------*/
      #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
        SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */
      #endif
      /* Reset the RCC clock configuration to the default reset state ------------*/
      /* Set HSION bit */
      RCC->CR |= (uint32_t)0x00000001;
    
      /* Reset CFGR register */
      RCC->CFGR = 0x00000000;
    
      /* Reset HSEON, CSSON and PLLON bits */
      RCC->CR &= (uint32_t)0xFEF6FFFF;
    
      /* Reset PLLCFGR register */
      RCC->PLLCFGR = 0x24003010;
    
      /* Reset HSEBYP bit */
      RCC->CR &= (uint32_t)0xFFFBFFFF;
    
      /* Disable all interrupts */
      RCC->CIR = 0x00000000;
    
    #if defined(DATA_IN_ExtSRAM) || defined(DATA_IN_ExtSDRAM)
      SystemInit_ExtMemCtl(); 
    #endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */
             
      /* Configure the System clock source, PLL Multiplier and Divider factors, 
         AHB/APBx prescalers and Flash settings ----------------------------------*/
      SetSysClock();
    
      /* Configure the Vector Table location add offset address ------------------*/
    #ifdef VECT_TAB_SRAM
      SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
    #else
      SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
    #endif
    }
    

    在设置完相关寄存器后,接下来 SystemInit 函数内部会调用 SetSysClock 函数。

    /**
      * @brief  Configures the System clock source, PLL Multiplier and Divider factors, 
      *         AHB/APBx prescalers and Flash settings
      * @Note   This function should be called only once the RCC clock configuration  
      *         is reset to the default reset state (done in SystemInit() function).   
      * @param  None
      * @retval None
      */
    static void SetSysClock(void)
    {
    #if defined(STM32F40_41xxx) || defined(STM32F427_437xx) || defined(STM32F429_439xx) || defined(STM32F401xx) || defined(STM32F412xG) || defined(STM32F413_423xx) || defined(STM32F446xx)|| defined(STM32F469_479xx)
    /******************************************************************************/
    /*            PLL (clocked by HSE) used as System clock source                */
    /******************************************************************************/
      __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
      
      /* Enable HSE */ //HSE时钟使能
      RCC->CR |= ((uint32_t)RCC_CR_HSEON);
      //等待HSE时钟稳定
      /* Wait till HSE is ready and if Time out is reached exit */
      do
      {
        HSEStatus = RCC->CR & RCC_CR_HSERDY;
        StartUpCounter++;
      } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
    
      if ((RCC->CR & RCC_CR_HSERDY) != RESET)
      {
        HSEStatus = (uint32_t)0x01;
      }
      else
      {
        HSEStatus = (uint32_t)0x00;
      }
    
      if (HSEStatus == (uint32_t)0x01)
      {
        /* Select regulator voltage output Scale 1 mode */
        RCC->APB1ENR |= RCC_APB1ENR_PWREN;
        PWR->CR |= PWR_CR_VOS;
    	//AHB不分频
        /* HCLK = SYSCLK / 1*/
        RCC->CFGR |= RCC_CFGR_HPRE_DIV1;
    
    #if defined(STM32F40_41xxx) || defined(STM32F427_437xx) || defined(STM32F429_439xx) ||  defined(STM32F412xG) || defined(STM32F446xx) || defined(STM32F469_479xx)    
        /* PCLK2 = HCLK / 2*/ //高速APB二分频
        RCC->CFGR |= RCC_CFGR_PPRE2_DIV2;
        
        /* PCLK1 = HCLK / 4*/ //低速APB4分频
        RCC->CFGR |= RCC_CFGR_PPRE1_DIV4;
    #endif /* STM32F40_41xxx || STM32F427_437x || STM32F429_439xx  || STM32F412xG || STM32F446xx || STM32F469_479xx */
    
    #if defined(STM32F401xx) || defined(STM32F413_423xx)
        /* PCLK2 = HCLK / 1*/
        RCC->CFGR |= RCC_CFGR_PPRE2_DIV1;
        
        /* PCLK1 = HCLK / 2*/
        RCC->CFGR |= RCC_CFGR_PPRE1_DIV2;
    #endif /* STM32F401xx || STM32F413_423xx */
    
    #if defined(STM32F40_41xxx) || defined(STM32F427_437xx) || defined(STM32F429_439xx) || defined(STM32F401xx) || defined(STM32F469_479xx)    
        /* Configure the main PLL */
        RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |
                       (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);
    #endif /* STM32F40_41xxx || STM32F401xx || STM32F427_437x || STM32F429_439xx || STM32F469_479xx */
    
    #if  defined(STM32F412xG) || defined(STM32F413_423xx) || defined(STM32F446xx)
        /* Configure the main PLL */
        RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |
                       (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24) | (PLL_R << 28);
    #endif /* STM32F412xG || STM32F413_423xx || STM32F446xx */    
        
        /* Enable the main PLL */
        RCC->CR |= RCC_CR_PLLON;
    
        /* Wait till the main PLL is ready */
        while((RCC->CR & RCC_CR_PLLRDY) == 0)
        {
        }
       
    #if defined(STM32F427_437xx) || defined(STM32F429_439xx) || defined(STM32F446xx) || defined(STM32F469_479xx)
        /* Enable the Over-drive to extend the clock frequency to 180 Mhz */
        PWR->CR |= PWR_CR_ODEN;
        while((PWR->CSR & PWR_CSR_ODRDY) == 0)
        {
        }
        PWR->CR |= PWR_CR_ODSWEN;
        while((PWR->CSR & PWR_CSR_ODSWRDY) == 0)
        {
        }      
        /* Configure Flash prefetch, Instruction cache, Data cache and wait state */
        FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS;
    #endif /* STM32F427_437x || STM32F429_439xx || STM32F446xx || STM32F469_479xx */
    
    #if defined(STM32F40_41xxx)  || defined(STM32F412xG)  
        /* Configure Flash prefetch, Instruction cache, Data cache and wait state */
        FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS;
    #endif /* STM32F40_41xxx  || STM32F412xG */
    
    #if defined(STM32F413_423xx)  
        /* Configure Flash prefetch, Instruction cache, Data cache and wait state */
        FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_3WS;
    #endif /* STM32F413_423xx */
    
    #if defined(STM32F401xx)
        /* Configure Flash prefetch, Instruction cache, Data cache and wait state */
        FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_2WS;
    #endif /* STM32F401xx */
    
        /* Select the main PLL as system clock source */
        RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
        RCC->CFGR |= RCC_CFGR_SW_PLL;
    
        /* Wait till the main PLL is used as system clock source */
        while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL);
        {
        }
      }
      else
      { /* If HSE fails to start-up, the application will have wrong clock
             configuration. User can add here some code to deal with this error */
      }
    #elif defined(STM32F410xx) || defined(STM32F411xE)
    #if defined(USE_HSE_BYPASS) 
    /******************************************************************************/
    /*            PLL (clocked by HSE) used as System clock source                */
    /******************************************************************************/
      __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
      
      /* Enable HSE and HSE BYPASS */
      RCC->CR |= ((uint32_t)RCC_CR_HSEON | RCC_CR_HSEBYP);
     
      /* Wait till HSE is ready and if Time out is reached exit */
      do
      {
        HSEStatus = RCC->CR & RCC_CR_HSERDY;
        StartUpCounter++;
      } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
    
      if ((RCC->CR & RCC_CR_HSERDY) != RESET)
      {
        HSEStatus = (uint32_t)0x01;
      }
      else
      {
        HSEStatus = (uint32_t)0x00;
      }
    
      if (HSEStatus == (uint32_t)0x01)
      {
        /* Select regulator voltage output Scale 1 mode */
        RCC->APB1ENR |= RCC_APB1ENR_PWREN;
        PWR->CR |= PWR_CR_VOS;
    
        /* HCLK = SYSCLK / 1*/
        RCC->CFGR |= RCC_CFGR_HPRE_DIV1;
    
        /* PCLK2 = HCLK / 2*/
        RCC->CFGR |= RCC_CFGR_PPRE2_DIV1;
        
        /* PCLK1 = HCLK / 4*/
        RCC->CFGR |= RCC_CFGR_PPRE1_DIV2;
    
        /* Configure the main PLL */
        RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |
                       (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);
        
        /* Enable the main PLL */
        RCC->CR |= RCC_CR_PLLON;
    
        /* Wait till the main PLL is ready */
        while((RCC->CR & RCC_CR_PLLRDY) == 0)
        {
        }
    
        /* Configure Flash prefetch, Instruction cache, Data cache and wait state */
        FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_2WS;
    
        /* Select the main PLL as system clock source */
        RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
        RCC->CFGR |= RCC_CFGR_SW_PLL;
    
        /* Wait till the main PLL is used as system clock source */
        while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL);
        {
        }
      }
      else
      { /* If HSE fails to start-up, the application will have wrong clock
             configuration. User can add here some code to deal with this error */
      }
    #else /* HSI will be used as PLL clock source */
      /* Select regulator voltage output Scale 1 mode */
      RCC->APB1ENR |= RCC_APB1ENR_PWREN;
      PWR->CR |= PWR_CR_VOS;
      
      /* HCLK = SYSCLK / 1*/
      RCC->CFGR |= RCC_CFGR_HPRE_DIV1;
      
      /* PCLK2 = HCLK / 2*/
      RCC->CFGR |= RCC_CFGR_PPRE2_DIV1;
      
      /* PCLK1 = HCLK / 4*/
      RCC->CFGR |= RCC_CFGR_PPRE1_DIV2;
      
      /* Configure the main PLL */
      RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) | (PLL_Q << 24); 
      
      /* Enable the main PLL */
      RCC->CR |= RCC_CR_PLLON;
      
      /* Wait till the main PLL is ready */
      while((RCC->CR & RCC_CR_PLLRDY) == 0)
      {
      }
      
      /* Configure Flash prefetch, Instruction cache, Data cache and wait state */
      FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_2WS;
      
      /* Select the main PLL as system clock source */
      RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
      RCC->CFGR |= RCC_CFGR_SW_PLL;
      
      /* Wait till the main PLL is used as system clock source */
      while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL);
      {
      }
    #endif /* USE_HSE_BYPASS */  
    #endif /* STM32F40_41xxx || STM32F427_437xx || STM32F429_439xx || STM32F401xx || STM32F469_479xx */  
    }
    

    先使能外部时钟 HSE,等待 HSE 稳定之后,配置AHB,APB1,APB2 时钟相关的分频因子,也就是相关外设的时钟。等待这些都配置完成之后,打开主 PLL 时钟,然后设置主 PLL 作为系统时钟 SYSCLK 时钟源。如果 HSE 不能达到就绪状态(比如外部晶振不能稳定或者没有外部晶振),那么依然会是 HSI 作为系统时钟。

    在这里要特别提出来,在设置主 PLL 时钟的时候,会要设置一系列的分频系数和倍频系数参数。大家可以从 SetSysClock 函数的这行代码看出:

        /* Configure the main PLL */
        RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |
                       (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);
    

    这些参数是通过宏定义标识符的值来设置的。默认的配置在 System_stm32f4xx.c 文件开头的地方配置。对于我们开发板,我们的设置参数值如下:

    #define PLL_M 8
    #define PLL_Q 7
    #define PLL_N 336
    #define PLL_P 2
    

    这里还有个特别需要注意的地方,就是我们还要同步修改 stm32f4xx.h 中宏定义标识符HSE_VALUE 的值为我们的外部时钟:

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

    这里默认固件库配置的是 25000000,我们外部时钟为 8MHz,所以我们根据我们硬件情况修改为 8000000 即可。

    04. 时钟配置总结

    最后我们总结一下 SystemInit()函数中设置的系统时钟大小:

    SYSCLK(系统时钟) =168MHz

    AHB 总线时钟(HCLK=SYSCLK) =168MHz

    APB1 总线时钟(PCLK1=SYSCLK/4) =42MHz

    APB2 总线时钟(PCLK2=SYSCLK/2) =84MHz

    PLL 主时钟 =168MHz

    05. 预留

    06. 附录

    6.1 【STM32】STM32系列教程汇总

    网址:【STM32】STM32系列教程汇总

    07. 声明

    展开全文
  • STM32 ISP工具 串口下载 串口调试工具 STM32F4STM32 ISP 软件_支持STM32F4/STM32F2/STM32F1 STM32F0 本程序使用VC2010写的,运行前请先安装Microsoft .NET Framework 4 可到微软官方网站下载,下载地址 ...
  • 手里有一块stm32f405rgt6的板子,没有任何例程...网上找了一下解决办法,原因应该是外部晶振的频率与stm32f4xx.c、stm32f4xx.h文件中外部晶振频率相关的定义不符,默认的是外部晶振是8M的频率,而现在的板子上的是2...
    手里有一块stm32f405rgt6的板子,没有任何例程,但有原理图。
    新建一个了工程,顺利下载到单片机,但是程序跑不起来。
    dbug的时候出现Not a genuine ST Device!之后下载程序也就一直出现这个提示。
    网上找了一下解决办法,原因应该是外部晶振的频率与stm32f4xx.c、stm32f4xx.h文件中外部晶振频率相关的定义不符。
    默认的是外部晶振是8M的频率,而现在的板子上的是25M的有源晶振。
    链接:http://www.openedv.com/forum.php?mod=viewthread&tid=281766&page=1#pid896550,但是没有说明具体怎么修改文件中外部晶振的频率定义,我的修改办法是:首先修改stm32f4xx.h头文件中的HSE_VALUE的值为25000000,原来的是8000000,如图1。
    

    图1
    然后修改stm32f4xx.c中PLL_M的值为25,原来为8,如图2。
    图2
    最后按照前面的链接里的解决办法,将BOOT0上拉到3.3V,下载修改好的程序,然后再将BOOT0接地即可。
    这块板子没有复位按键,采用的是上电自动复位的办法,下载完程序重新上电程序就顺利跑起来了。
    移植工程如果遇到是外部高速晶振频率不同的问题,可以试试该解决办法。

    展开全文
  • 在网上找了很久,大多数都是原理图连接,所以自己根据...连接如下图,其中③接的是输出端用于传感器接收采集信号,④接的是STM32F4的ADC1的A5引脚,模拟输入 具体STM32F4中GP2Y10粉尘传感器的代码见下篇博客 ...
  • STM32F4如何设置系统时钟,非常重要

    万次阅读 多人点赞 2017-05-15 14:58:12
    STM32F4的系统时钟非常重要,涉及到整个系统的运行结果,无论是什么操作,都需要时钟信号,不同型号的微控制器的默认系统时钟配置是不同的,这里,给出两种配置STM32F407系统时钟的方法。 方法一,采用官方库提供的...
  • STM32F4DIS-BB 基于STM32F4DISCOVERY 高性能

    千次阅读 2019-08-06 20:51:04
    - STM32F4DIS-BB基于ST原厂STM32F4DISCOVERY推出的高性能扩展板- 支持3.5寸工业级LCD触摸屏,130万像素OV9655 Camera模块- 多达6路串口,CAN,IIC,SPI,以太网口,USB2.0 FS OTG/device/host,TF卡等-支持uC/OS-Ⅱ_...
  • STM32STM32F4 GPIO八种模式及工作原理详解

    万次阅读 多人点赞 2019-08-12 10:13:27
    GPIO,即通用I/O(输入/输出)端口,是STM32可控制的引脚。STM32芯片的GPIO引脚与外部设备连接起来,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。 STM32F407有7组IO。分别为GPIOA~GPIOG,每组IO有16个...
  • 资料链接 :stm32智能门锁.rar 哔哩哔哩项目展示视频:https://b23.tv/bxfxvd 一、项目背景 在消费升级渗透在各个领域的今天,国民消费发生着巨大的变化,与每个人息息相关的家居行业也是如此。现今,越来越多的...
  • STM32F1和STM32F4 区别

    万次阅读 2016-05-12 09:01:45
    STM32F4相对于STM32F1的改进不只一点点,为了便于初学者了解,我们比对相关资料将改进点进行了汇总。 STM32F1和STM32F4 区别 (安富莱整理)  F1采用Crotex M3内核,F4采用Crotex M4内核。  F1最高主频 72M
  • system_stm32f4xx.c里面包含了个stm32f4xx.h. system_stm32f4xx.c在1.0.0版本的时候里面只是配置了8M的晶振。 但是system_stm32f4xx.c在1.7.1的时候,由于又增加了不少的F42系列的芯片,所以system_stm32f4xx.c...
  • STM32 F4 存储结构

    2019-09-12 16:21:47
    摘自stm32F4参考手册、数据手册、内核权威指南 Cortex M3 M4存储器映射: 地址空间可以通过一种方式分为8个512MB的空间: STM32F4xx寄存器边界地址: STM32F4xx内存和Flash地址: ...
  • 关于STM32F4系列出现 #error directive: "Please select first the target STM32F4xx device used in your application (in stm32f4xx.h file)"的解决办法: 添加 : USE_STDPERIPH_DRIVER,STM32F429_439xx ...
  • STM32F4xx_DFP.2.13.0

    热门讨论 2018-09-18 16:03:05
    KEIL V5中要用到的STM32F4xx系列的器件库Pack,DFP.2.13.0
  • STM32F4的启动文件startup_stm32f4xx.s说明

    千次阅读 2012-11-26 21:27:22
    由于我是初学,所有的都是网上学习和个人理解,错误在所难免,这个只是为我自己做的一个笔记(以后发现需要补充的,会不定期补充更新),如果你们看见有... 启动文件:startup_stm32f4xx.s,版本1.0.0,日期2011.9.30
  • STM32F4 常用头文件

    千次阅读 2016-10-04 20:49:13
    STM32F4 常用头文件在使用STM32时基本上会用到官方提供的一些库文件。 常用头文件如下: stm32f4xx.h:包含了stm32f4的寄存器结构体的定义(类似于c51的reg52.h) system_stm32f4xx.h:system_stm32f4xx.c的头文件...
  • STM32F4定时器

    千次阅读 2019-06-25 12:46:27
    STM32F4定时器 STM32一共有三种定时器,总共有14个定时器。 高级定时器 TIM1、TIM8 。 通用定时器 TIM2、TIM5、TIM3、TIM4,TIM9~TIM14 , 其中2、5是32位定时器计数范围更大精度更高,3、4功能上与2、5一样都...
  • Keil.STM32F4xx_DFP.2.9.0

    热门讨论 2016-08-14 16:15:21
    stm32F4xx离线固件库,有需要的可以下载Keil.STM32F4xx_DFP.2.9.0
  • stm32f4编码器模式

    万次阅读 多人点赞 2018-09-03 02:42:56
    stm32f4编码器模式 花费一下午时间研究编码器的使用,简单总结如下 E6B2-CWZ1X编码器 stm32f407 定时器编码器模式 一、编码器简介 1、分类 编码器可按以下方式来分类。 (1)增量型: 每转过单位的角度就...
  • STM32F4 DMA

    千次阅读 2019-04-02 17:35:07
    STM32F4有2个DMA,每个DMA控制器有8个数据流,每个数据流有多达8个通道,但是DMA1 控制器 AHB 外设端口与 DMA2 控制器的情况不同,不连接到总线矩阵,因此,仅 DMA2 数据流能够执行存储器到存储器的传输。...
  • STM32F4是一款性价比极高的MCU,撇开强大的FPU(硬件浮点运算单元),单从定时器来讲,STM32F4STM32F1多了两个32位定时器(TIM2、TIM5),而232=4.29∗1092^{32}=4.29*10^9232=4.29∗109,可以看到32位定时器可...
  • STM32F4移植ucos_II

    千次阅读 2017-02-05 13:16:09
    stm32库文件:stm32f4官方库函数文件(stm32f4官网库函数资料) ucos_ii源文件:ucos_ii操作系统官方源代码文件(ucos_ii官网资料) 移植工程:stm32f4移植ucos_II最终工程(stm32f4移植ucos_ii工程) 搭建stm32f4...
  • STM32F4关键寄存器总结

    千次阅读 2020-03-11 15:50:21
    整理自STM32F4中文参考手册(ST)、STM32F4开发指南-寄存器版本(正点原子)、cortex m3与m4权威指南(英文) 目录 NVIC GPIO EXIT USART TIM(2~5) 基本设置 PWM相关
  • STM32F4 CAN通讯

    2020-09-28 20:50:41
    小白求助各位大佬,CAN通讯如何发送小数,目前已知是用几个数据字节去计算组成小数,但不知道具体如何实现,最好能贴出代码,万分感谢!
  • [stm32]stm32F4串口DMA发送问题解析

    千次阅读 2018-09-16 20:55:36
    使用stm32 cubeMX配置生成的工程 ...查阅stm32F4中文参考手册 使能这种模式(将 DMA_SxCR 寄存器中的 EN 位置 1)时,数据流会立即启动传输,从源完全填充 FIFO 如果 DMA_SxNDTR 寄存器达到零、外设请求...
  • 【干货】老外的GitHub整理的stm32f4驱动库

    千次阅读 热门讨论 2018-05-03 13:57:49
    昨晚在github发现了一个老外自己整理的封装库,有很多,比如一些通讯啊啥的,一些显示屏驱动...Here are listed all libraries for STM32F4 devices.Libraries are designed to work with STM32F4xx series of MCU. ...
  • 对system_stm32f4xx的理解 上一篇博客解释了stm32的启动文件,在启动文件中,在进入__mainC库函数之前,进入了SystemInit函数,如下图所示。 那,今天我们就来探究一下这个函数的功能是什么,这个函数在这个文件...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 24,321
精华内容 9,728
关键字:

stm32f4