复习过程
一·GPIO
对于配置GPIO,首先需要声明一个结构体,名字是GPIO_InitStructure,结构体的原型由GPIO_InitTypeDef 确定,设置完了GPIO_InitStructure里面的内容后,在GPIO_Init (GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_InitStruct)里面调用。注意一点的就是再设置32的外设的时候,首先一点就是是能该外设的时钟,对于GPIO来RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);就是使能其时钟。GPIO 是挂载在 AHB1 总线上的外设,在固件库中对挂载在 AHB1 总线上的外设时钟使能是通过函数 RCC_AHB1PeriphClockCmd ()来实现的。接下来的就是对GPIO进行配置,其Pin,Mode,Speed…(说白了就是GPIO_InitStructure加‘.’,然后就会出现这些需要配置的东西,接着进行一 一配置就行),GPIO_Init后右键选择“Go to definition of …”可以查看其有效值。
要注意assert_param这都是有效值也就是可以调用的,然后继续右键选择“Go to definition of …你需要配置的,这些就是你可以是使用的,也就是有效值。
以上是对.c文件里面的东西。而下面的是对.h文件的一些
二.时钟
(1)时钟树
这个是stm32时钟系统图,在 STM32F4 中,有 5 个最重要的时钟源,为 HSI、HSE、LSI、LSE、PLL。其中 PLL 实
际是分为两个时钟源,分别为主 PLL 和专用 PLL。从时钟频率来分可以分为高速时钟源和低速时钟源,在这 5 个中 HSI,HSE 以及 PLL 是高速时钟,LSI 和 LSE 是低速时钟。从来源可分为外部时钟源和内部时钟源,外部时钟源就是从外部通过接晶振的方式获取时钟源,其中 HSE 和LSE 是外部时钟源,其他的是内部时钟源。
①、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 接口实现高品质音频性能。这里我们着重看看主 PLL 时钟第一个高速时钟输出 PLLP 的计算方法。
从图 4.3.1.2 可以看出。主 PLL 时钟的时钟源要先经过一个分频系数为 M 的分频器,然后经过倍频系数为 N 的倍频器出来之后的时候还需要经过一个分频系数为 P(第一个输出 PLLP)或者 Q(第二个输出 PLLQ)的分频器分频之后,最后才生成最终的主 PLL 时钟。
例如我们的外部晶振选择 8MHz。同时我们设置相应的分频器 M=8,倍频器倍频系数 N=336,分频器分频系数 P=2,那么主 PLL 生成的第一个输出高速时钟 PLLP 为:PLL=8MHz * N/ (M*P)=8MHz* 336 /(8*2) = 168MHz
如果我们选择HSE为PLL时钟源,同时SYSCLK时钟源PLL,那么SYSCLK时钟为 168MHz。这对于我们后面的实验都是采用这样的配置。
(2) STM32F4 时钟初始化配置
STM32F4 时钟系统初始化是在 system_stm32f4xx.c 中的 SystemInit()函数中完成的。对于系统时钟关键寄存器设置主要是在 SystemInit 函数中调用 SetSysClock()函数来设置的。SystemInit 函数开始先进行浮点运算单元设置,然后是复位 PLLCFGR,CFGR 寄存器,同时
通过设置 CR 寄存器的 HSI 时钟使能位来打开 HSI 时钟。默认情况下如果 CFGR 寄存器复位,那么是选择 HSI 作为系统时钟,也就是说,调用 SystemInit 函数之后,首先是选择 HSI 作为系统时钟。在设置完相关寄存器后,接下来 SystemInit 函数内部会调用 SetSysClock 函数。再配置时钟时,先使能外部时钟 HSE,等待 HSE 稳定之后,配AHB,APB1,APB2 时钟相关的分频因子,也就是相关外设的时钟。等待这些都配置完成之后,打开主 PLL 时钟,然后设置主 PLL 作为系统时钟 SYSCLK 时钟源。如果 HSE 不能达到就绪状态(比如外部晶振不能稳定或者没有外部晶振),那么依然会是 HSI 作为系统时钟。
SystemInit()函数中设置的系统时钟大小:
SYSCLK(系统时钟) =168MHz
AHB 总线时钟(HCLK=SYSCLK) =168MHz
APB1 总线时钟(PCLK1=SYSCLK/4) =42MHz
APB2 总线时钟(PCLK2=SYSCLK/2) =84MHz
PLL 主时钟 =168MHz