今天完成了这个改变系统时钟的实验。实验是成功的。
#include "stm32f10x.h"
#include "led.h"
void delay(u32 i)
{
while(i--);
}
void RCC_HSE_Config(u32 div,u32 pllm) //自定义系统时间(可以修改时钟)
{
RCC_DeInit(); //将外设RCC寄存器重设为缺省值
RCC_HSEConfig(RCC_HSE_ON);//设置外部高速晶振(HSE)
if(RCC_WaitForHSEStartUp()==SUCCESS) //等待HSE起振
{
RCC_HCLKConfig(RCC_SYSCLK_Div1);//设置AHB时钟(HCLK)
RCC_PCLK1Config(RCC_HCLK_Div2);//设置低速AHB时钟(PCLK1)
RCC_PCLK2Config(RCC_HCLK_Div1);//设置高速AHB时钟(PCLK2)
RCC_PLLConfig(div,pllm);//设置PLL时钟源及倍频系数
RCC_PLLCmd(ENABLE); //使能或者失能PLL
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);//检查指定的RCC标志位设置与否,PLL就绪
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//设置系统时钟(SYSCLK)
while(RCC_GetSYSCLKSource()!=0x08);//返回用作系统时钟的时钟源,0x08:PLL作为系统时钟
}
}
int main()
{
RCC_HSE_Config(RCC_PLLSource_HSE_Div2,RCC_PLLMul_9);//36M的系统时钟
LED_Init();
while(1)
{
GPIO_ResetBits(LED_PORT, GPIO_Pin_0 );
delay(6000000);//当系统时钟改变时,同样的延时参数,时间就会明显不同,体现到LED上闪灭的速度就不一样了。
GPIO_SetBits(LED_PORT, GPIO_Pin_0 );
delay(6000000);
}
}
代码中的延时函数,其实就是CPU什么都不做而根据传进来的数值来计数。比如上面写的6000000,那就是根据时钟来计数600000.
所以当系统时钟频率改变时,同样的延时参数,完成计数的时间就会明显不同,体现到LED上闪灭的速度就不一样了。
以上的代码,可以说是完全理解了,配置不同的时钟没有任何问题。