淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com 《手把手教你学STM32》 主讲人 :正点原子团队 硬件平台:正点原子STM32开发板 版权所有:广州市星翼电子科技有限公司 淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com 开源电子网 公众平台:“正点原子” 官方网站:www.alientek.com 联系电话:13922348612 ddddd ALIENTEK 淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com
淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com 《手把手教你学STM32》 SystemInit时钟系统初始化函数剖析 适用平台 STM32F1xx 开发板 (正点原子) STM32F4xx 开发板 (正点原子) ddddd 淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com
淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com 时钟系统讲解 参考资料: 探索者STM32F4开发板: 《STM32F4开发指南-库函数版本》-4.3小节 STM32F4时钟系统 STM32F4xx官方资料: 《STM32F4xx中文参考手册》-第6章 复位和时钟控制 淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com
淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com 时钟系统知识总结 1. STM32 有5个时钟源:HSI、HSE、LSI、LSE、PLL。 ①、HSI是高速内部时钟,RC振荡器,频率为16MHz,精度不高。可以直接作为系统 时钟或者用作PLL时钟输入。 ②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时 钟源,频率范围为4MHz~26MHz。 ③、LSI是低速内部时钟,RC振荡器,频率为32kHz,提供低功耗时钟。主要供独立看 门狗和自动唤醒单元使用。 ④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。RTC ⑤、PLL为锁相环倍频输出。STM32F4有两个PLL: 主PLL(PLL)由HSE或者HSI提供时钟信号,并具有两个不同的输出时钟。 第一个输出PLLP用于生成高速的系统时钟(最高168MHz) 第二个输出PLLQ用于生成USB OTG FS的时钟(48MHz),随机数发生器的时钟和SDIO时钟。 专用PLL(PLLI2S)用于生成精确时钟,从而在I2S接口实现高品质音频性能。 2. 系统时钟SYSCLK可来源于三个时钟源: ①、HSI振荡器时钟 ②、HSE振荡器时钟 ③、PLL时钟 淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com
淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com 时钟系统知识总结 3.STM32F4时钟信号输出MCO1(PA8)和MCO2(PC9)。 MCO1:用户可以配置预分频器(1~5)向MCO1引脚PA8输出4个不同的时钟源: HIS LSE HSE PLL MCO2:用户可以配置预分频器(1~5)向MCO2引脚PC9输出4个不同的时钟源: SYSCLK PLLI2S MCO最大输出时钟不超过100MHz 4.任何一个外设在使用之前,必须首先使能其相应的时钟。 淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com
淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com RCC相关配置寄存器 typedef struct { __IO uint32_t CR; __IO uint32_t PLLCFGR; __IO uint32_t CFGR; /*!< RCC clock configuration register, Address offset: 0x08 */ __IO uint32_t CIR; /*!< RCC clock interrupt register, Address offset: 0x0C */ __IO uint32_t AHB1RSTR; /*!< RCC AHB1 peripheral reset register, Address offset: 0x10 */ __IO uint32_t AHB2RSTR; /*!< RCC AHB2 peripheral reset register, Address offset: 0x14 */ __IO uint32_t AHB3RSTR; /*!< RCC AHB3 peripheral reset register, Address offset: 0x18 */ uint32_t RESERVED0; /*!< Reserved, 0x1C */ __IO uint32_t APB1RSTR; /*!< RCC APB1 peripheral reset register, Address offset: 0x20 */ __IO uint32_t APB2RSTR; /*!< RCC APB2 peripheral reset register, Address offset: 0x24 */ uint32_t RESERVED1[2]; /*!< Reserved, 0x28-0x2C */ __IO uint32_t AHB1ENR; /*!< RCC AHB1 peripheral clock register, Address offset: 0x30 */ __IO uint32_t AHB2ENR; /*!< RCC AHB2 peripheral clock register, Address offset: 0x34 */ __IO uint32_t AHB3ENR; /*!< RCC AHB3 peripheral clock register, Address offset: 0x38 */ uint32_t RESERVED2; /*!< Reserved, 0x3C */ __IO uint32_t APB1ENR; /*!< RCC APB1 peripheral clock enable register, Address offset: 0x40 */ __IO uint32_t APB2ENR; /*!< RCC APB2 peripheral clock enable register, Address offset: 0x44 */ uint32_t RESERVED3[2]; /*!< Reserved, 0x48-0x4C */ __IO uint32_t AHB1LPENR; /*!< RCC AHB1 peripheral clock enable in low power mode register, Address offset: 0x50 */ __IO uint32_t AHB2LPENR; /*!< RCC AHB2 peripheral clock enable in low power mode register, Address offset: 0x54 */ __IO uint32_t AHB3LPENR; /*!< RCC AHB3 peripheral clock enable in low power mode register, Address offset: 0x58 */ uint32_t RESERVED4; /*!< Reserved, 0x5C */ __IO uint32_t APB1LPENR; /*!< RCC APB1 peripheral clock enable in low power mode register, Address offset: 0x60 */ __IO uint32_t APB2LPENR; /*!< RCC APB2 peripheral clock enable in low power mode register, Address offset: 0x64 */ uint32_t RESERVED5[2]; __IO uint32_t BDCR; __IO uint32_t CSR; uint32_t RESERVED6[2]; __IO uint32_t SSCGR; __IO uint32_t PLLI2SCFGR; __IO uint32_t PLLSAICFGR; __IO uint32_t DCKCFGR; } RCC_TypeDef; 淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com
淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com RCC相关配置寄存器 对照《STM32F4中文参考手册》6.3节 P114~170 了解这些寄存器的作用和配置方法。 淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com
淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com 3. SystemInit函数解读 系统时钟初始化函数: SystemInit(); 使用库函数的时候,在系统启动之后会自动调用: startup_stm32f40_41xxx.s文件中: ; Reset handler Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT SystemInit IMPORT __main LDR R0, =SystemInit BLX R0 LDR R0, =__main BX R0 ENDP 淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com
淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com 3. SystemInit函数解读 首先如果使用外部时钟源HSE,要配置外部晶振频率: stm32f4xx.h #if !defined (HSE_VALUE) #define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */ #endif /* HSE_VALUE */ 初始化之前首先通过宏定义定义下面变量来定义系统时钟频率: #define PLL_M 8 #define PLL_Q 7 #define PLL_N 336 #define PLL_P 2 PLL=8MHz * N/ (M*P)=8MHz* 336 /(8*2) = 168MHz 淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com
淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com 3. SystemInit函数解读 初始化之后的状态: SYSCLK(系统时钟) =168MHz AHB总线时钟(HCLK=SYSCLK) =168MHz APB1总线时钟(PCLK1=SYSCLK/4) =42MHz APB2总线时钟(PCLK2=SYSCLK/2) =84MHz PLL主时钟 =168MHz 初始化之后可以通过变量SystemCoreClock获取系统变量。如果SYSCLK=168MHz,那么变量SystemCoreClock=168000000。 淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com
淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com 谢谢您对“正点原子”团队的支持 硬件平台:正点原子STM32开发板 版权所有:广州市星翼电子科技有限公司 淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com 淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com