stm芯片的所有片上外设都需要手动设置时钟,三种不同的时钟源可被用来驱动系统时钟(sysclk):
hsi振荡器时钟:由内部8mhz的rc振荡器产生,可直接作为系统时钟或在2分频后作为pll输入。hsi rc振荡器能够在不需要任何外部器件的条件下提供系统时钟。它的启动时间比hse晶体振荡器短。然而,即使在校准之后它的时钟频率精度仍较差。(所以通常不用与提供sysclk)
hse振荡器时钟:高速外部时钟信号,由hse外部晶体/陶瓷谐振器(较常用)或者hse用户外部时钟两种方式产生
pll时钟:时钟源输入,内部pll可以用来倍频hsi rc的输出时钟或hse晶体输出时钟,一旦pll被激活,这些参数就不能被改动。
二级时钟源:当不被使用时,任一个时钟源都可被独立地启动或关闭,由此优化系统功耗。
lsi 时钟:40khz低速内部rc,可以用于驱动独立看门狗和通过程序选择驱动rtc。rtc用于从停机/待机模式下自动唤醒系统
lse 时钟:32.768khz低速外部晶体也可用来通过程序选择驱动rtc(rtcclk)。
配置时钟流程:
1.将rcc寄存器重新设置为默认值 rcc_deinit
2.打开外部高速时钟晶振 hse rcc_hseconfig(rcc_hse_on);
3.等待外部高速时钟晶振工作 hsestartupstatus =rcc_waitforhsestartup();
4.设置ahb时钟 rcc_hclkconfig;
5.设置高速apb2时钟 rcc_pclk2config;
6.设置低速速apb1时钟 rcc_pclk1config
7.设置pll rcc_pllconfig
8.打开pll rcc_pllcmd(enable);
9.等待pll工作 while(rcc_getflagstatus(rcc_flag_pllrdy) == reset)
10.设置系统时钟 rcc_sysclkconfig
11.判断是否pll是系统时钟 while(rcc_getsysclksource() != 0x08)
12.打开要使用的外设时钟 rcc_apb2periphclockcmd()/rcc_apb1periphclockcmd()
源代码:
void rcc_configuration(void)
{
errorstatus hsestartupstatus;
rcc_deinit();
rcc_hseconfig(rcc_hse_on);
hsestartupstatus = rcc_waitforhsestartup();
if(hsestartupstatus == success)
{
rcc_pllconfig(rcc_pllsource_hse_div1, rcc_pllmul_16); // pll的输入时钟 = hse时钟频率;rcc_pllmul_16——pll输入时钟x 16 ;hse =4mhz,所以pllclk=64mhz
rcc_hclkconfig(rcc_sysclk_div1); //rcc_sysclk_div1——ahb时钟 = 系统时钟(sysclk) = 64mhz(外部晶振4hmz)
rcc_pclk1config(rcc_hclk_div2); //rcc_hclk_div2——apb1时钟 = hclk/2 = 32mhz(外部晶振4hmz)
rcc_pclk2config(rcc_hclk_div1); //rcc_hclk_div1——apb2时钟 = hclk = 64mhz(外部晶振4hmz)
//注:ahb主要负责外部存储器时钟。
// apb2负责ad,i/o,高级tim,串口1
// apb1负责da,usb,spi,i2c,can,串口2,3,4,5,普通tim
flash_setlatency(flash_latency_2); //flash_latency_1 1延时周期
flash_prefetchbuffercmd(flash_prefetchbuffer_enable); // 预取指缓存使能
rcc_pllcmd(enable);
while(rcc_getflagstatus(rcc_flag_pllrdy) == reset)
{
}
rcc_sysclkconfig(rcc_sysclksource_pllclk);
while(rcc_getsysclksource() != 0x08)
{
}
}//end if(hsestartupstatus == success)
// enables or disables the high speed apb(apb2) peripheral clock,apb2外设时钟使能
rcc_apb2periphclockcmd(rcc_apb2periph_usart1 | rcc_apb2periph_gpioa | rcc_apb2periph_gpiob |
rcc_apb2periph_gpioc | rcc_apb2periph_gpiod | rcc_apb2periph_gpioe, enable);
//enables or disable the high speed apb(apb1) peripheral clock,apb1外设时钟使能
rcc_apb1periphclockcmd(rcc_apb1periph_usart2, enable);
rcc_apb1periphclockcmd(rcc_apb1periph_usart3, enable);
rcc_apb2periphclockcmd(rcc_apb2periph_spi1, enable);
rcc_apb2periphclockcmd(rcc_apb2periph_afio, enable);
}
『本文转载自网络,u球体育app下载的版权归原作者所有,如有侵权请联系删除』