stm芯片时钟设置-64体育

单片机 > 单片机程序设计 > 详情

stm芯片时钟设置

发布时间:2024-11-13 发布时间:
|

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);   

}  


『本文转载自网络,64体育的版权归原作者所有,如有侵权请联系删除』

热门文章 更多
使用ni开发系统和amr系统实现自动化仪表读数系统的设计
网站地图