stm32时钟分析
一、硬件上的连接问题
如果使用内部rc振荡器而不使用外部晶振,请按照如下方法处理:
1)对于100脚或144脚的产品,osc_in应接地,osc_out应悬空。
2)对于少于100脚的产品,有2种接法:
i)osc_in和osc_out分别通过10k电阻接地。此方法可提高emc性能。
ii)分别重映射osc_in和osc_out至pd0和pd1,再配置pd0和pd1为推挽输出并输出‘0’。此方法可以减小功耗并(相对上面i)节省2个外部电阻。
对上图的分析如下:
重要的时钟:
pllclk,sysclk,hckl,pclk1,pclk2之间的关系要弄清楚;
1、hsi:高速内部时钟信号stm32单片机内带的时钟(8m频率)精度较差
2、hse:高速外部时钟信号精度高来源(1)hse外部晶体/陶瓷谐振器(晶振) (2)hse用户外部时钟
3、lse:低速外部晶体32.768khz主要提供一个精确的时钟源一般作为rtc时钟使用
在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。
其中40khz的lsi供独立看门狗iwdg使用,另外它还可以被选择为实时时钟rtc的时钟源。另外,实时时钟rtc的时钟源还可以选择lse,或者是hse的128分频。rtc的时钟源通过rtcsel[1:0]来选择。
stm32中有一个全速功能的usb模块,其串行接口引擎需要一个频率为48mhz的时钟源。该时钟源只能从pll输出端获取,可以选择为1.5分频或者1分频,也就是,当需要使用usb模块时,pll必须使能,并且时钟频率配置为48mhz或72mhz。
另外,stm32还可以选择一个时钟信号输出到mco脚(pa8)上,可以选择为pll输出的2分频、hsi、hse、或者系统时钟。
系统时钟sysclk,它是供stm32中绝大部分部件工作的时钟源。系统时钟可选择为pll输出、hsi或者hse。系统时钟最大频率为72mhz,它通过ahb分频器分频后送给各模块使用,ahb分频器可选择1、2、4、8、16、64、128、256、512分频。其中ahb分频器输出的时钟送给5大模块使用:
①、送给ahb总线、内核、内存和dma使用的hclk时钟。
②、通过8分频后送给cortex的系统定时器时钟。
③、直接送给cortex的空闲运行时钟fclk。
④、送给apb1分频器。apb1分频器可选择1、2、4、8、16分频,其输出一路供apb1外设使用(pclk1,最大频率36mhz),另一路送给定时器(timer)2、3、4倍频器使用。该倍频器可选择1或者2倍频,时钟输出供定时器2、3、4使用。
⑤、送给apb2分频器。apb2分频器可选择1、2、4、8、16分频,其输出一路供apb2外设使用(pclk2,最大频率72mhz),另一路送给定时器(timer)1倍频器使用。该倍频器可选择1或者2倍频,时钟输出供定时器1使用。另外,apb2分频器还有一路输出供adc分频器使用,分频后送给adc模块使用。adc分频器可选择为2、4、6、8分频。
在以上的时钟输出中,有很多是带使能控制的,例如ahb总线时钟、内核时钟、各种apb1外设、apb2外设等等。当需要使用某模块时,记得一定要先使能对应的时钟。
需要注意的是定时器的倍频器,当apb的分频为1时,它的倍频值为1,否则它的倍频值就为2。
连接在apb1(低速外设)上的设备有:电源接口、备份接口、can、usb、i2c1、i2c2、uart2、uart3、spi2、窗口看门狗、timer2、timer3、timer4。注意usb模块虽然需要一个单独的48mhz时钟信号,但它应该不是供usb模块工作的时钟,而只是提供给串行接口引擎(sie)使用的时钟。usb模块工作的时钟应该是由apb1提供的。
连接在apb2(高速外设)上的设备有:uart1、spi1、timer1、adc1、adc2、所有普通io口(pa~pe)、第二功能io口。
涉及的寄存器:
rcc寄存器结构,rcc_typedeff,在文件“stm32f10x_map.h”中定义如下:
typedef struct
{
vu32 cr; //hsi,hse,css,pll等的使能
vu32 cfgr; //pll等的时钟源选择以及分频系数设定
vu32 cir; //清除/使能时钟就绪中断
vu32 apb2rstr; //apb2线上外设复位寄存器
vu32 apb1rstr; //apb1线上外设复位寄存器
vu32 ahbenr; //dma,sdio等时钟使能
vu32 apb2enr; //apb2线上外设时钟使能
vu32 apb1enr; //apb1线上外设时钟使能
vu32 bdcr; //备份域控制寄存器
vu32 csr;
} rcc_typedef;
这些寄存器的具体定义和使用方式参见芯片手册,因为c语言的开发可以不和他们直接打交道,当然如果能够加以理解和记忆,无疑是百利而无一害。
如果外接晶振为8mhz,最高工作频率为72mhz,显然需要用pll倍频9倍,这些设置都需要在初始化阶段完成。为了方便说明,以例程的rcc设置函数,并用中文注释的形式加以说明:
static void rcc_config(void)
{
rcc_deinit();
rcc_hseconfig(rcc_hse_on);
hsestartupstatus = rcc_waitforhsestartup();
if (hsestartupstatus == success)
{
flash_prefetchbuffercmd(flash_prefetchbuffer_enable);
flash_setlatency(flash_latency_2);
rcc_hclkconfig(rcc_sysclk_div1);
rcc_pclk2config(rcc_hclk_div1);
rcc_pclk1config(rcc_hclk_div2);
rcc_adcclkconfig(rcc_pclk2_div6);
//上面这句例程中缺失了,但却很关键
rcc_pllconfig(rcc_pllsource_hse_div1, rcc_pllmul_9);
rcc_pllcmd(enable);
while (rcc_getflagstatus(rcc_flag_pllrdy) == reset)
{}
rcc_sysclkconfig(rcc_sysclksource_pllclk);
while (rcc_getsysclksource() != 0x08)
{}
}
//使能外围接口总线时钟,注意各外设的隶属情况,不同芯片的分配不同,到时候查手册就可以
rcc_ahbperiphclockcmd(rcc_ahbperiph_fsmc, enable);
rcc_apb2periphclockcmd(rcc_apb2periph_gpiod | rcc_apb2periph_gpioe |
rcc_apb2periph_gpiof | rcc_apb2periph_gpiog |
rcc_apb2periph_afio, enable);
}
由上述程序可以看出系统时钟的设定是比较复杂的,外设越多,需要考虑的因素就越多。同时这种设定也是有规律可循的,设定参数也是有顺序规范的,这是应用中应当注意的,例如pll的设定需要在使能之前,一旦pll使能后参数不可更改。
经过此番设置后,对于外置8mhz晶振的情况下,系统时钟为72mhz,高速总线和低速总线2都为72mhz,低速总线1为36mhz,adc时钟为12mhz,usb时钟经过1.5分频设置就可以实现48mhz的数据传输。
一般性的时钟设置需要先考虑系统时钟的来源,是内部rc还是外部晶振还是外部的振荡器,是否需要pll。然后考虑内部总线和外部总线,最后考虑外设的时钟信号。遵从先倍频作为cpu时钟,然后在由内向外分频,下级迁就上级的原则。
时钟控制寄存器(rcc_cr)
31~26
25
24
23~20
19
18
17
16
保留
pllrdy
pllon
保留
csson
hsebyp
hserdy
hseon
eg:rcc-》
品牌荣誉|海伯森再度斩获恰佩克“年度创新品牌奖”
全球半导体投资规模持续攀升,探针台市场逐年增长
广西正式出台了加快5G产业发展的三年行动计划
鼓式制动器的构造和工作原理
光谱共焦在表面粗糙度检测中的应用
快速看懂STM32-电源、时钟、复位电路及 源代码
Acrel-3000电能管理系统在上海华大孵化中心项目中的应用
华为荣耀magic真机图赏:八曲面PK全面屏,对飙小米6MIX
无穷电阻网络的等效电阻是多少
存储深度对FFT结果的影响
首个波士顿动力机器狗化身监工,确认路线后就能自动巡航
津南将建中国物联网产业示范核心区
可以随时监测周围环境的信息的“小瓶盖”智能传感器
一文解读全新OLCD技术相关知识
智力债务是怎么一回事
继华为之后,传荣耀自研手机系统即将面世,国产厂商加速逃离安卓?
凯智通SSD固态硬盘测试解决方案
特斯拉or蔚来 如约交付不容易
无人机集群通信网络面临的通信安全问题有哪些
AI医疗为科技型企业带来了什么