1.时钟的驱动
有三种不同的时钟源可被用来驱动系统时钟:
● 内部高速 (hsi)8mhz rc 振荡器时钟
● 外部高速 (hse) 振荡器时钟
● pll 时钟
2.系统时钟的简介
在stm32中,我们说要配置系统时钟就是指的配置下图标识红色的部分“sysclk(系统时钟)”.系统时钟sysclk是同stm32中绝大部分期间工作的时钟源,如下图所示,系统时钟可以为iic, ahb,apb,dma等配置时钟。
3.系统时钟的配置
例:如果在外部接入8mhz的晶振,需要配置成48mhz的系统时钟。
分析:因为要使用8mhz的外部时钟,得到48mhz的系统时钟,则需要不分频使其倍频6倍得到系统时钟,因而我准备配置的路线如 下图所示
3.1 因为要得到48mhz的系统时钟,则选用hse外部震荡时钟进行驱动。在rcc->cr寄存器中使hseon位为1,则表示hse振荡器开启;
3.2 由硬件设置, 表明 hse 振荡器是否稳定。仍是rcc-cr寄存器,当hse振荡器就绪时,硬件将置hserdy位为1.
3.3 在图中应该可以看出,下一步是进行rcc->cfgr2寄存器例prediv分频的操作了,但是请注意prediv[3:0] prediv 分频因子
这些位用于设置或清除 prediv 分频因子。 这些位仅能在 pll 关闭些改写。所以在此之前应该要先关闭pll。所以使rcc->cr寄存器里的pllon关闭。等待pllrdy位锁定。
3.4 开始进行rcc->cfgr2寄存器例prediv分频的操作了,但是因为我们不分频只倍频,所以prediv[3:0] prediv 分频因子为0000(不分频).
3.5 开始由rcc->cfgr里的pllsrc(输入时钟源)开关置1选择hse/predib作为pll输入时钟。并且进入rcc->cfgr里的pllmul为进行倍频选择,我们要6倍倍频,所以选择倍频因子为6(0100)
3.6 倍频完后,使能寄存器rcc->cr的pllon位,并且等待硬件置位rc->cr寄存器里的pllrdy。
3.7 在过sw开关时选择pllclk输出作为系统时钟
3.8 使能gpio时钟
void systemclock(void)
{
rcc->cr|=rcc_cr_hseon;
while(!(rcc->cr&rcc_cr_hserdy));
rcc->cr&=~rcc_cr_pllon;
while(rcc->cr&rcc_cr_pllrdy);
rcc->cfgr2=rcc_cfgr2_prediv_div1;
rcc->cfgr=rcc_cfgr_pllsrc|rcc_cfgr_pllmul6;
rcc->cr|=rcc_cr_pllon;
while(!rcc->cr&rcc_cr_pllrdy);
rcc->cfgr=(rcc->cfgr&~rcc_cfgr_sw)|rcc_cfgr_sw_pll;
while((rcc->cfgr&rcc_cfgr_sws)!=rcc_cfgr_sws_1);
rcc->ahbenr|=rcc_ahbenr_gpioaen;
return;
}
『本文转载自网络,u球体育app下载的版权归原作者所有,如有侵权请联系删除』