STM32F10xx时钟系统
来源:互联网 发布:知其雄而守其雌的意思 编辑:程序博客网 时间:2024/06/03 16:55
STM32 有5个时钟源: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。
系统时钟SYSCLK可来源于三个时钟源:
- HSI振荡器时钟
- HSE振荡器时钟
- PLL时钟
STM32可以选择一个时钟信号输出到MCO脚(PA8)上,可以选择为PLL 输出的2分频、HSI、HSE、或者系统时钟。
任何一个外设在使用之前,必须首先使能其相应的时钟。
RCC相关配置寄存器
typedef struct
{
__IO uint32_t CR; //HSI,HSE,CSS,PLL等的使能和就绪标志位
__IO uint32_t CFGR; //PLL等的时钟源选择,分频系数设定
__IO uint32_t CIR; // 清除/使能 时钟就绪中断
__IO uint32_t APB2RSTR; //APB2线上外设复位寄存器
__IO uint32_t APB1RSTR; //APB1线上外设复位寄存器
__IO uint32_t AHBENR; //DMA,SDIO等时钟使能
__IO uint32_t APB2ENR; //APB2线上外设时钟使能
__IO uint32_t APB1ENR; //APB1线上外设时钟使能
__IO uint32_t BDCR; //备份域控制寄存器
__IO uint32_t CSR; //控制状态寄存器
} RCC_TypeDef;
RCC配置相关头文件和固件库源文件
1.时钟使能配置:
RCC_LSEConfig() 、RCC_HSEConfig()、
RCC_HSICmd() 、 RCC_LSICmd() 、 RCC_PLLCmd() ……
2.时钟源相关配置:
RCC_PLLConfig ()、 RCC_SYSCLKConfig() 、 RCC_RTCCLKConfig() …
3.分频系数选择配置:
RCC_HCLKConfig() 、 RCC_PCLK1Config() 、 RCC_PCLK2Config()…
4.外设时钟使能:
RCC_APB1PeriphClockCmd(): //APB1线上外设时钟使能
RCC_APB2PeriphClockCmd(); //APB2线上外设时钟使能
RCC_AHBPeriphClockCmd(); //AHB线上外设时钟使能
5.其他外设时钟配置:
RCC_ADCCLKConfig (); RCC_RTCCLKConfig();
6.状态参数获取参数:
RCC_GetClocksFreq();
RCC_GetSYSCLKSource();
RCC_GetFlagStatus()
7. RCC中断相关函数 :
RCC_ITConfig() 、 RCC_GetITStatus() 、 RCC_ClearITPendingBit()…
系统时钟系统初始化重要函数:
SystemInit(); 使用V3.5版本的库函数,该函数在系统启动之后会自动调用: startup_stm32f10x_xx.s文件中: ; Reset handler Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT __main IMPORT SystemInit LDR R0, =SystemInit BLX R0 LDR R0, =__main BX R0 ENDP
初始化之前首先通过宏定义定义系统时钟频率:
#define SYSCLK_FREQ_72MHz 72000000
初始化之后的状态:
SYSCLK 72MHz
AHB 72MHz
PCLK1 36MHz
PCLK2 72MHz
PLL 72MHz
初始化之后可以通过变量SystemCoreClock获取系统变量。如果
SYSCLK=72MHz,那么变量SystemCoreClock=72000000。
配置系统时钟源以及时钟:
void RCC_PLL_Configuration(void)
{
RCC_DeInit(); /将外设RCC寄存器重设为缺省值 /
RCC_HSEConfig(RCC_HSE_ON); /设置外部高速晶振(HSE) HSE晶振打开(ON)/
if(RCC_WaitForHSEStartUp() == SUCCESS) { /等待HSE起振, SUCCESS:HSE晶振稳定且就绪/
RCC_HCLKConfig(RCC_SYSCLK_Div1); /设置AHB时钟(HCLK) RCC_SYSCLK_Div1——AHB时钟 = 系统时/
RCC_PCLK2Config(RCC_HCLK_Div1); /* 设置高速AHB时钟(PCLK2)RCC_HCLK_Div1——APB2时钟 = HCLK*/
RCC_PCLK1Config(RCC_HCLK_Div2); /设置低速AHB时钟(PCLK1)RCC_HCLK_Div2——APB1时钟 = HCLK / 2/
FLASH_SetLatency(FLASH_Latency_2); /设置FLASH存储器延时时钟周期数FLASH_Latency_2 2延时周期/
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); /选择FLASH预取指缓存的模,预取指缓存使能/
RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_3);/设置PLL时钟源及倍频系数/
RCC_PLLCmd(ENABLE); /使能PLL /
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) ; /检查指定的RCC标志位(PLL准备好标志)设置与否/
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /设置系统时钟(SYSCLK) /
while(RCC_GetSYSCLKSource() != 0x08); /0x08:PLL作为系统时钟 /
}
}
工程模板中的实例时钟分析
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB| RCC_APB2Periph_GPIOE, ENABLE);
…
GPIO初始化代码;
…
while(1) //死循环
{
}
}
- STM32F10xx时钟系统
- STM32F10XX时钟系统框图及说明
- STM32F10xx复位和时钟控制(RCC)一览
- 系统时钟
- 时钟系统
- 时钟系统
- 系统时钟
- 系统时钟
- 系统时钟
- 时钟系统
- 时钟系统
- 时钟系统
- 硬件时钟和系统时钟
- GPS时钟系统,GPS同步时钟系统
- OAL之系统时钟
- OAL之系统时钟
- 数字时钟系统
- Warning:系统时钟不一致
- JSON数据格式
- NetUtil 有关于IP端口的简单校验和操作
- Android系统架构的详解
- 167
- 联想电脑V1000开机无法使用wifi非要睡眠后才能启用wifi
- STM32F10xx时钟系统
- 验证码的随机产生
- 题目1161:Repeater
- lk启动流程详细分析
- ubuntu14.04安装tensorflow遇到的坑
- 求二叉树的下一个节点
- 汽车租赁
- javaSE 基础归纳
- 将金额转成大写汉字