初级会员
积分 52
金钱 52
注册时间 2016-6-14
在线时间 13 小时
1 金钱
从说明书上看stm32f407的系统默认时钟为16M,我的理解如果在代码中不对时钟配置的话系统时钟应该就是16M吧?如果调用RCC_DeInit()函数,看了一下固件库中的说明:
Note: The default reset state of the clock configuration is given below:HSI ON and used as system clock source HSE, PLL and PLLI2S OFF AHB, APB1 and APB2 prescaler set to 1. CSS, MCO1 and MCO2 OFF All interrupts disabled
This function doesn't modify the configuration of thePeripheral clocks LSI, LSE and RTC clocks
说明中系统时钟用的是HSI,也就是16M,这样代码中有RCC_DeInit()和没有RCC_DeInit()应该都是16M吧?
然后我使用外部晶振,用PLL倍频分频也将系统时钟配置为16M,但小灯的闪烁三者的时间不一样!不知道是为什么!!
1.没有时钟配置,小灯闪烁最快,用RCC_GetClocksFreq得到sysclk_frequency=53760000
2.用HSE 8M,通过PLL使系统时钟拉到16M,小灯闪烁比1慢一些,用RCC_GetClocksFreq得到sysclk_frequency=16000000
3.不用HSE,就调用一个RCC_DeInit()函数,按说系统时钟也应该是16M吧,但小灯闪烁最慢,用RCC_GetClocksFreq得到sysclk_frequency=16000000
实在是不明白!为了说明问题,把代码附上
#include "stm32f4xx.h"
void Clock_Config(void);
void GPIO_Configuration(void);
void delayms(vu16 ms);
RCC_ClocksTypeDef RCC_ClockFreq;
int main(void)
{
//Clock_Config();
RCC_DeInit(); //这两句都注掉就是第1种时钟什么都不配置的情况,注上一句就是不用PLL,只调用RCC_DeInit()是第三种情况,上一句Clock_Config()不注释,把RCC_DeInit()注掉就是使用PLL用外部的8M晶振
GPIO_Configuration();
RCC_GetClocksFreq(&RCC_ClockFreq);
while(1)
{
GPIO_SetBits(GPIOF,GPIO_Pin_9);
GPIO_SetBits(GPIOF,GPIO_Pin_10);
delayms(500);
GPIO_ResetBits(GPIOF,GPIO_Pin_9);
GPIO_ResetBits(GPIOF,GPIO_Pin_10);
delayms(500);
}
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOF, &GPIO_InitStructure);
}
void delayms(vu16 ms)
{
vu16 i;
while(ms--)
{
i=6000;
while(i--);
}
}
void Clock_Config(void){
ErrorStatus State;
uint32_t PLL_M;
uint32_t PLL_N;
uint32_t PLL_P;
uint32_t PLL_Q;
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON);
while( RCC_WaitForHSEStartUp() != SUCCESS );
PLL_M=8;
PLL_N=32;
PLL_P=2; //sysclk=8M/8*32/2=16M
RCC_PLLConfig(RCC_PLLSource_HSE, PLL_M, PLL_N, PLL_P, PLL_Q);
RCC_PLLCmd(ENABLE);
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
RCC_HCLKConfig(RCC_HCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div4);
RCC_PCLK2Config(RCC_HCLK_Div2);
}
我来回答