STM32F10x芯片时钟控制总结
1、介绍
STM32F10x芯片的时钟控制主要包括以下几个方面知识:时钟源的选择(HSE、HIS、PLL)、系统时钟频率的配置、总线(AHB、APB2、APB1)时钟的配置、总线(AHB、APB2、APB1)设备时钟的使能/除能、总线(AHB、APB2、APB1)设备的复位。
2、系统时钟框图
STM32F10x可以用三种不同的时钟源来驱动系统时钟(SYSCLK):HSI振荡器时钟;HSE外部时钟和PLL时钟。他们之间的关系如附件所示(时钟树)。
从时钟树中可以看出一下几点:
l系统时钟的来源可以是HSI振荡器时钟、PLL时钟、或者HSE时钟;且系统总线时钟最大值为72MHz,AHB和APB2总线最大频率也是72MHz,APB1总线最大允许频率是36MHz;而Cortex-M3核的自由运行时钟是FCLK(来源于AHB总线);
lstm32f10x芯片总共有四个时钟源:HSE、LSE(外部时钟信号);HIS、LSI(内部时钟信号),芯片内的其他所有时钟都是通过如上四个时钟源分频得来;
lRTC的时钟来源可以是HSE外部时钟128分频之后的时钟、或者LSE外部时钟(32.768kHz)或者内部LSI振荡器时钟;
lIWDG的时钟来源必须是内部LSI振荡器时钟;
lMCO引脚的时钟输出源的来源有:PLL时钟的2分频、内部HIS时钟、外部HSE时钟以及系统时钟。
lPLL时钟的来源可以是HIS振荡器时钟或者HSE外部提供的时钟;
lUSB外设是直接使用PLL输出时钟(如果使用USB外设,HSE和PLL时钟都必须使能,且系统时钟必须是48MHz或者72MHz);AHB总线的时钟输入源的是系统时钟;APB1和APB2的时钟来源是AHB;
l始终安全系统(CSS)必须由HSE提供时钟源;若CSS激活且HSE时钟出现故障,则引发CSS中断,同时产生NMI(NMI中断是不可屏蔽的),NMI将被不断执行,知道CSS中断挂起位被清除;
l定时器时钟要么等于总线时钟,要么等于总线时钟频率的两倍,这取决于总线分频系数的值是否为1;
l当HIS被用于作为PLL时钟输入时,系统时钟能得到的最大频率是64MHz;
lCortex-M3内核的自由运行时间是FCLK。
3、时钟寄存器描述
l时钟控制寄存器:RCC_CR
l时钟配置寄存器:RCC_CFGR
l时钟中断寄存器:RCC_CIR
lAPB2外设复位寄存器:RCC_APB2RSTR
lAPB1外设复位寄存器:RCC_APB1RSTR
lAHB外设时钟使能寄存器:RCC_AHBENR
lAPB2外设时钟使能寄存器:RCC_APB2ENR
lAPB1外设时钟使能寄存器:RCC_APB1ENR
l备份域控制寄存器:RCC_BDCR
l控制/状态寄存器:RCC_CSR
4、时钟控制主要按照以下五步进行控制
l系统复位后,HSI振荡器被选为系统时钟;
l调用RCC_DeInit()函数将外设RCC寄存器重置为缺省值;
l选择系统时钟:
?若选择HSE做系统时钟:先调用RCC_HSEConfig()使能HSE,然后调用RCC_WaitForHSEStartUp()函数等待HSE起震,最后调用RCC_GetFlagStatus()函数获取HSE晶振状态,查看HIE晶振是否就绪;;
?若选择HSI做系统时钟:首先调用RCC_AdjustHSICalibrationValue()函数调整内部高速晶振校准值(也可以不用,使用系统预留值),然后调用RCC_HSICmd()函数使能HSI,最后调用RCC_GetFlagStatus()函数获取HSI晶振状态,查看HIS晶振是否就绪;
?若要使用PLL做系统时钟,如前面两步将HSE和HIS设定好之后,调用RCC_PLLConig()选择PLL时钟源并设定倍频系数,最后调用RCC_PLLCmd()使能PLL,最后调用RCC_GetFlagStatus()函数获取PLL晶振状态,查看PLL是否就绪;。
l最后,在以上时钟配置就绪之后,调用RCC_SYSCLKConfig()函数选择系统时钟输入源:HSE/HIS/PLL。
至此,系统时钟设定完成,可以调用RCC_GetSYSCLKSource()函数来获取当前系统时钟是使用的哪个时钟(检测设置是否成功):0x010:HIS;x040:HSE;x08:PLL。
l然后是总线时钟设置:设置AHB总线时钟:调用RCC_HCLKConfig()函数;设置APB1总线时钟:调用RCC_PCLK1Config()函数;设置APB2总线时钟:调用RCC_PCLK2Config()函数。其中AHB总线时钟来源于SYSCLK总线时钟,APB1和APB2总线时钟来源于AHB总线时钟。注意:这三个时钟的设置可以在系统时钟、PLL、HSE、HIS启动之前设置,也可以在他们之后设置,但习惯在PLL配置之前。
l最后是根据应用需要配置各总线上的外围设备,启动/停用外围设备的函数有:RCC_AHBPeriphClockCmd();RCC_APB2PeriphClockCmd();RCC_APB1PeriphClockCmd();复位总线上的设备函数:RCC_APB2PeriphResetCmd();RCC_APB1PeriphResetCmd();具体可以查看RCC固件库。
注意:使能外设时钟的函数必须在调用外设初始化函数XXX_Init()函数之前,否则可能会导致对应外设初始化失败,编译器却不会因此报错。
5、时钟控制例子
void SetSysClockToHSE(void)
{
ErrorStatus HSEStartUpStatus;
RCC_DeInit();
RCC_HSEConfig
STM32F10x时钟控 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)