1、首先打开mainc文件,在头写一个delay的延时方法,如下图。
2、然后在延时方法下面写出自定义设置系统时钟的方法,如下图。
3、然后就可以在入口程序中首先调用 设置系统时钟方法,传入对应的参数,先设置好系统时钟,然后再设置LED灯的点亮熄灭之间加入延时方法,如下图。
4、然后编译代码,下图中可以看出0错误,0警告,如下图。
5、编译成功之后,就可以将代码下载到STM32F407的开发板中观察实验现象了。
unsigned char SysClockSet(unsigned char OSC, unsigned char Clock)用于设置MCU的时钟,两个参数,前一个(OSC)用于选择内部晶振还是外部晶振,这能是HSE或者HSI,这个在H文件中有定义;
第二个参数 Clock,范围0~25,对应不同的主频,具体值看程序里面switch语句部分就明白了;
然后要说一点,HSE_VALUE 和 HSI_VALUE是外部和内部晶振的频率,这个值在 stm32f4xxh 里面有定义的,如果是你自己做的板子,那么就需要根据你所采用的晶振数值到stm32f4xxh里面把 HSE_VALUE 修改一下即可;
SysClockGet(void)函数用来获取当前MCU主频,返回值的单位是Hz;
再PS:用此程序,可以动态的调整MCU主频,就是在MCU运行中,根据实际工作量的多少升降主频,我试过,蛮好使的,而且可以超频,216MHz没有问题,240MHz要看芯片体质,有些可以长时间运行,260MHz,更要看体质了,反正我的芯片是真呢过跑个几分钟,然后就死机了。改为下面就可以了:
void Clk_HSI(void)
{
uint8_t val;
RCC_DeInit();//将外设RCC寄存器重设为缺省值
RCC_HSICmd(ENABLE);//使能或者失能内部高速晶振(HSI)
while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);
RCC_HCLKConfig(RCC_SYSCLK_Div1);//设置AHB时钟(HCLK)
RCC_PCLK1Config(RCC_HCLK_Div1);//设置低速AHB时钟(PCLK1)
RCC_PCLK2Config(RCC_HCLK_Div1);//设置低速AHB时钟(PCLK2)
RCC_PLLConfig(RCC_PLLSource_HSI_Div2,RCC_PLLMul_16);//设置PLL时钟源及倍频系数
RCC_PLLCmd(ENABLE);//如果PLL被用于系统时钟,那么它不能被失能
//等待指定的 RCC 标志位设置成功 等待PLL初始化成功
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
//设置系统时钟(SYSCLK) 设置PLL为系统时钟源
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
//等待PLL成功用作于系统时钟的时钟源
while( RCC_GetSYSCLKSource() != 0x08)
{
;
}
}简单理解就是,一般来说,STM32内部有一个8MHz的时钟(HSI时钟),系统上电默认的就是使用该时钟来运行程序,但这个内部的8MHz的精度并不高,也就是说有一定的误差。所以一般我们会在STM32芯片外部接一个8MHz的标准晶振(HSE时钟),配置系统时钟就是使用这个外部的HSE时钟经过内部倍频之后作为系统运行的时钟(sysclock),倍频成多少看你的STM32最高能支持多高的时钟频率,STM32f051C8T6(Cortex-M0)支持到48MHz,STM32F103ZET6(Cortex-M3)支持到72MHz。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)