stm32如何配置时钟?
作者: 扬兴科技 日期:2021-01-25 浏览量:
stm32系列专为要求高性能、低成本、低功耗的嵌入式应用设计的arm cortex-m内核单片机,要想正常工作发挥其功能,还需要配置好时钟。我们来看看如何配置。(相关阅读可以查看yxc扬兴凯发k8娱乐平台官网《32.768khz晶振各厂家型号有哪些》)
在stm32中,有五个时钟源,为hsi、hse、lsi、lse、pll。
①hsi是高速内部时钟,rc振荡器,频率为8mhz。
②hse是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4mhz~16mhz。
③lsi是低速内部时钟,rc振荡器,频率为40khz。
④lse是低速外部时钟,接频率为32.768khz的石英晶体。
⑤pll为锁相环倍频输出,其时钟输入源可选择为hsi/2、hse或者hse/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72mhz。
二、在stm32上如果不使用外部晶振,osc_in和osc_out的接法:如果使用内部rc振荡器而不使用外部晶振,请按照下面方法处理:
①对于100脚或144脚的产品,osc_in应接地,osc_out应悬空。
②对于少于100脚的产品,有2种接法:第1种:osc_in和osc_out分别通过10k电阻接地。此方法可提高emc性能;第2种:分别重映射osc_in和osc_out至pd0和pd1,再配置pd0和pd1为推挽输出并输出'0'。此方法可以减小功耗并(相对上面)节省2个外部电阻。
三、用hse时钟,程序设置时钟参数流程:
01、将rcc寄存器重新设置为默认值 rcc_deinit;
02、打开外部高速时钟晶振hse rcc_hseconfig(rcc_hse_on);
03、等待外部高速时钟晶振工作 hsestartupstatus = rcc_waitforhsestartup();
04、设置ahb时钟 rcc_hclkconfig;
05、设置高速ahb时钟 rcc_pclk2config;
06、设置低速速ahb时钟 rcc_pclk1config;
07、设置pll rcc_pllconfig;
08、打开pll rcc_pllcmd(enable);
09、等待pll工作 while(rcc_getflagstatus(rcc_flag_pllrdy) == reset)
10、设置系统时钟 rcc_sysclkconfig;
11、判断是否pll是系统时钟 while(rcc_getsysclksource() != 0x08)
12、打开要使用的外设时钟 rcc_apb2periphclockcmd()/rcc_apb1periphclockcmd()
* function name : rcc_configuration
* description : rcc配置(使用外部8mhz晶振)
* input : 无
* output : 无
* return : 无
void rcc_configuration(void)
{
/*将外设rcc寄存器重设为缺省值*/
rcc_deinit();
/*设置外部高速晶振(hse)*/
rcc_hseconfig(rcc_hse_on); //rcc_hse_on——hse晶振打开(on)
/*等待hse起振*/
hsestartupstatus = rcc_waitforhsestartup();
if(hsestartupstatus == success) //success:hse晶振稳定且就绪
{
/*设置ahb时钟(hclk)*/
rcc_hclkconfig(rcc_sysclk_div1); //rcc_sysclk_div1——ahb时钟= 系统时钟
/* 设置高速ahb时钟(pclk2)*/
rcc_pclk2config(rcc_hclk_div1); //rcc_hclk_div1——apb2时钟= hclk
/*设置低速ahb时钟(pclk1)*/
rcc_pclk1config(rcc_hclk_div2); //rcc_hclk_div2——apb1时钟= hclk / 2
/*设置flash存储器延时时钟周期数*/
flash_setlatency(flash_latency_2); //flash_latency_2 2延时周期
/*选择flash预取指缓存的模式*/
flash_prefetchbuffercmd(flash_prefetchbuffer_enable); // 预取指缓存使能
/*设置pll时钟源及倍频系数*/
rcc_pllconfig(rcc_pllsource_hse_div1, rcc_pllmul_9);
// pll的输入时钟= hse时钟频率;rcc_pllmul_9——pll输入时钟x 9
/*使能pll */
rcc_pllcmd(enable);
/*检查指定的rcc标志位(pll准备好标志)设置与否*/
while(rcc_getflagstatus(rcc_flag_pllrdy) == reset)
{
}
/*设置系统时钟(sysclk)*/
rcc_sysclkconfig(rcc_sysclksource_pllclk);
//rcc_sysclksource_pllclk——选择pll作为系统时钟
/* pll返回用作系统时钟的时钟源*/
while(rcc_getsysclksource() != 0x08) //0x08:pll作为系统时钟
{
}
}
/*使能或者失能apb2外设时钟*/
rcc_apb2periphclockcmd(rcc_apb2periph_gpioa | rcc_apb2periph_gpiob |
rcc_apb2periph_gpioc , enable);
//rcc_apb2periph_gpioa gpioa时钟
//rcc_apb2periph_gpiob gpiob时钟
//rcc_apb2periph_gpioc gpioc时钟
//rcc_apb2periph_gpiod gpiod时钟
}
五、时钟频率
stm32f103内部8m的内部震荡,经过倍频后最高可以达到72m。目前ti的m3系列芯片最高频率可以达到80m。
在stm32固件库3.0中对时钟频率的选择进行了大大的简化,原先的一大堆操作都在后台进行。系统给出的函数为systeminit()。但在调用前还需要进行一些宏定义的设置,具体的设置在system_stm32f10x.c文件中。
文件开头就有一个这样的定义:
//#define sysclk_freq_hse hse_value
//#define sysclk_freq_20mhz 20000000
//#define sysclk_freq_36mhz 36000000
//#define sysclk_freq_48mhz 48000000
//#define sysclk_freq_56mhz 56000000
#define sysclk_freq_72mhz 72000000
st 官方推荐的外接晶振是 8m,所以库函数的设置都是假定你的硬件已经接了 8m 晶振来运算的.以上东西就是默认晶振 8m 的时候,推荐的 cpu 频率选择.在这里选择了:
#define sysclk_freq_72mhz 72000000
也就是103系列能跑到的最大值72m
然后这个 c文件继续往下看
#elif defined sysclk_freq_72mhz
const uint32_t systemfrequency = sysclk_freq_72mhz;
const uint32_t systemfrequency_sysclk = sysclk_freq_72mhz;
const uint32_t systemfrequency_ahbclk = sysclk_freq_72mhz;
const uint32_t systemfrequency_apb1clk = (sysclk_freq_72mhz/2);
const uint32_t systemfrequency_apb2clk = sysclk_freq_72mhz;
这就是在定义了cpu跑72m的时候,各个系统的速度了.他们分别是:硬件频率,系统时钟,ahb总线频率,apb1总线频率,apb2总线频率.再往下看,看到这个了:
#elif defined sysclk_freq_72mhz
static void setsysclockto72(void);
这就是定义 72m 的时候,设置时钟的函数.这个函数被 setsysclock ()函数调用,而
setsysclock ()函数则是被 systeminit()函数调用.最后 systeminit()函数,就是被你调用的了
所以设置系统时钟的流程就是:
首先用户程序调用 systeminit()函数,这是一个库函数,然后 systeminit()函数里面,进行了一些寄存器必要的初始化后,就调用 setsysclock()函数. setsysclock()函数根据那个#define sysclk_freq_72mhz 72000000 的宏定义,知道了要调用setsysclockto72()这个函数,于是,就一堆麻烦而复杂的设置~!@#$%^然后,cpu跑起来了,而且速度是 72m. 虽然说的有点累赘,但大家只需要知道,用户要设置频率,程序中就做的就两个事情:
第一个: system_stm32f10x.c 中 #define sysclk_freq_72mhz 72000000
第二个:调用systeminit()
推荐阅读
- 国产晶振品牌排行随着互联网技术的快速发展,电子市场的竞争也愈发激烈。在晶振行业,为了应对市场变化,yxc国产晶振品牌厚积薄发,无论是价格还是技术上都有了很大的突破。yxc扬兴,30多年一直在晶振行业中扎根和创新的国产晶振品牌,定位为一家满足客户的频率器件方案需求的方案服务商。扬兴,不仅仅只是卖晶振,更多的宗旨可以为客户提供专业的凯发k8娱乐平台的技术支持,解决晶振频率存在的技术性问题。
- 只需5步!从epson晶振外包装识别真假货扬兴科技作为epson晶振授权代理商,为了让epson的客户产品品质有所保障,不受假货的困扰,出此文章让更多的客户能够更深一步提高真假货之间的识别能力。本文将以fc-135 32.768khz 12.5pf 20ppm q13fc1350000400为举例,对比真假产品的区别:
- 爱普生晶振料号怎么看爱普生晶振料号怎么看:epson产品的料号sg-210stf 25 . 000000mhzl,sg-210代表型号,s代表功能(s:待机),t代表电源电压,25.000000mhz代表频率,l代表频差;epson产品料号,规律性不强。
- yxc扬兴成为中国早期mems晶振生产厂商yxc扬兴拥有庞大的客户群体和深刻的行业认知,并且潜力巨大,扬兴拥有的可编程技术,将快速提高整个mems可编程晶振的中国占有率,同时对中国整个有源晶振市场造成颠覆性作用。