77范文网 - 专业文章范例文档资料分享平台

STM32学习总结(2)

来源:网络收集 时间:2019-06-05 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

C

D

E

B

A

在STM32中,有五个时钟源,为中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。从时钟频率来分可以分为高速时钟源和低速时钟源,在这5个中HIS,HSE以及PLL是高速时钟,LSI和LSE是低速时钟。从来源可分为外部时钟源和内部时钟源,外部时钟源就是从外部通过接晶振的方式获取时钟源,其中HSE和LSE是外部时钟源,其他的是内部时钟

5

源。下面我们看看STM32的五个时钟源,对应上面图中标红的序号标示。

①、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。

②、HSI是高速内部时钟,RC振荡器,频率为8MHz。

③、LSI是低速内部时钟,RC振荡器,频率为40kHz。独立看门狗的时钟源只能是LSI,同时LSI还可以作为RTC的时钟源。

④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。这个主要是RTC的时钟源。

⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。

2、时钟源输出

再看一下时钟源的输出,如何为外设及系统提供时钟,对应上方图中字母标示。 A、MCO是STM32的一个时钟输出IO(PA8),它可以选择一个时钟信号输出,可以选择为PLL输出的2分频、HSI、HSE、或者系统时钟。这个时钟可以用来给外部其他系统提供时钟源。

B、这里是RTC时钟源,从图上可以看出,RTC的时钟源可以选择LSI,LSE,以及HSE的128分频。

C、USB的时钟是来自PLL时钟源。STM32中有一个全速功能的USB模块,其串行接口引擎需要一个频率为48MHz的时钟源。该时钟源只能从PLL输出端获取,可以选择为1.5分频或者1分频,也就是,当需要使用USB模块时,PLL必须使能,并且时钟频率配置为48MHz或72MHz。

D、是STM32的系统时钟SYSCLK,它是供STM32中绝大部分部件工作的时钟源。系统时钟可选择为PLL输出、HSI或者HSE。系统时钟最大频率为72MHz。

E、指其他所有外设了。从时钟图上可以看出,其他所有外设的时钟最终来源都是SYSCLK。SYSCLK通过AHB分频器分频后送给各模块使用。

1)AHB总线、内核、内存和DMA使用的HCLK时钟。

2)通过8分频后送给Cortex的系统定时器时钟,也就是systick了。 3)直接送给Cortex的空闲运行时钟FCLK。

4)送给APB1分频器。APB1分频器输出一路供APB1外设使用(PCLK1,最大频

6

率36MHz),另一路送给定时器(Timer)2、3、4倍频器使用。

5)送给APB2分频器。APB2分频器分频输出一路供APB2外设使用(PCLK2,最大频率72MHz),另一路送给定时器(Timer)1倍频器使用。

注意:APB1上面的是低速外设,包括电源接口、备份接口、CAN、USB、I2C1、

I2C2、UART2、UART3等等,APB2上面连接的是高速外设包括UART1、SPI1、Timer1、ADC1、ADC2、所有普通IO口(PA~PE)、第二功能IO口等。

3、SystemInit函数分析

首先,要芯片工作进行时钟配置时函数的调用关系:startup_stm32f10x_cl.s(启动文件)→main()→SystemInit()→SetSysClock()→SetSysClockTo72()。(系统默认使用72MHz)

1)SystemInit()

在进行时钟配置之前,对RCC寄存器CR、CIR、CFGR、CFGR2进行重置。然后调用函数SetSysClock()。

/* Reset the RCC clock configuration to the default reset state(for debug purpose) */

/* Set HSION bit */

RCC->CR |= (uint32_t)0x00000001; //内部8MHz时钟开启 /* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */ #ifndef STM32F10X_CL

RCC->CFGR &= (uint32_t)0xF8FF0000; //清零 #else

RCC->CFGR &= (uint32_t)0xF0FF0000; //清零 #endif /* STM32F10X_CL */

/* Reset HSEON, CSSON and PLLON bits */

RCC->CR &= (uint32_t)0xFEF6FFFF; //清零 /* Reset HSEBYP bit */

RCC->CR &= (uint32_t)0xFFFBFFFF; //清零

/* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */ RCC->CFGR &= (uint32_t)0xFF80FFFF; //清零

#ifdef STM32F10X_CL //互联型产品 /* Reset PLL2ON and PLL3ON bits */ RCC->CR &= (uint32_t)0xEBFFFFFF;

/* Disable all interrupts and clear pending bits */ RCC->CIR = 0x00FF0000; //中断使能关闭 /* Reset CFGR2 register */ RCC->CFGR2 = 0x00000000;

#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)

7

/* Disable all interrupts and clear pending bits */ RCC->CIR = 0x009F0000; /* Reset CFGR2 register */ RCC->CFGR2 = 0x00000000; #else

/* Disable all interrupts and clear pending bits */ RCC->CIR = 0x009F0000; #endif /* STM32F10X_CL */ SetSysClock();

2) SetSysClock()

#ifdef SYSCLK_FREQ_HSE SetSysClockToHSE();

#elif defined SYSCLK_FREQ_24MHz SetSysClockTo24();

#elif defined SYSCLK_FREQ_36MHz SetSysClockTo36();

#elif defined SYSCLK_FREQ_48MHz SetSysClockTo48();

#elif defined SYSCLK_FREQ_56MHz SetSysClockTo56();

#elif defined SYSCLK_FREQ_72MHz //定义为72MHz SetSysClockTo72(); #endif

定义为72MHz,便接着调用函数SetSysClockTo72()。 3)SetSysClockTo72()

先计算系统时钟SYSCLK频率(外部晶振为25MHz)。 代码中:

RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 | RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5); 其中RCC_CFGR2_PREDIV2_DIV5:PREDIV2=5 //5分频

也就是PREDIV2对输入的外部时钟5分频,那么PLL2和PLL3没有倍频前均为25/5=5MHz。

RCC_CFGR2_PLL2MUL8:PLL2MUL=8 //8倍频

8倍频后PLL2时钟=5*8=40MHz,因此PLL2CLK=40MHz。

RCC_CFGR2_PREDIV1SRC_PLL2:RCC_CFGR2的第16位为1,选择PLL2CLK作为PREDIV1的时钟源。

RCC_CFGR2_PREDIV1_DIV5:PREDIV1=5 //5分频

8

PREDIV1CLK=PLL2CLK/5=8MHz。 (以上是对RCC_CFGR2进行的配置)

RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLMULL9);

RCC_CFGR_PLLXTPRE_PREDIV1:操作的是RCC_CFGR的第17位PLLXTPRE,操作这一位和操作RCC_CFGR2寄存器的位[3:0]中的最低位是相同的效果。

RCC_CFGR_PLLSRC_PREDIV1:选择PREDIV1输出作为PLL输入时钟;PREDIV1CLK=8MHZ,所以输入给PLL倍频的时钟源是8MHz。

RCC_CFGR_PLLMULL9:PLLMULL=9;//9倍频 也就是对PLLCLK=PREDIV1CLK*9=72MHz。 (以上是对RCC_CFGR进行的配置)

/* Select PLL as system clock source */

RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));

RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL; //选择PLLCLK作为系统时钟源 故系统时钟SYSCLK=72MHz。 代码中:

/* HCLK = SYSCLK */

RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;

/* PCLK2 = HCLK */

RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;

/* PCLK1 = HCLK */

RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2; 故HCLK(AHB总线时钟)=PLLCLK=SYSCLK=72MHz。 PLCK2(APB2时钟)=HCLK=SYSCLK=PLLCLK=72MHz。 PLCK1(APB1时钟)=HCLK/2=36MHz。

总结一下SystemInit()函数中设置的系统时钟大小: SYSCLK(系统时钟)= 72MHZ AHB总线时钟= 72MHZ APB1总线时钟= 36MHZ APB2总线时钟= 72MHZ

9

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库STM32学习总结(2)在线全文阅读。

STM32学习总结(2).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/650987.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: