好的资料:
http://blog.csdn.net/marike1314/archive/2010/06/16/5673522.aspx参考: stm32中文参考手册 reference_manual
库文件函数手册:
基于ARM的32位MCU STM32F101xx 和 STM32F103xx固件库.rar 1. 在stm32启动后,默认使用的是哪个 时钟源作为 SYSTICK的??
启动时,默认使用的是内部时钟振荡器HSI,8MHZ,不会自动切换到外部时钟。不可以修改默认时钟,但可以在初始化时,通过时钟系列的寄存器来选择外部的时钟 或者 PLL倍频时钟
2. 在stm3 中有三种是时钟可以作为 SYSTICK,从图上可以知道:
2.1 HSI 内部振荡器 8MHZ
2.2 HSE 外部时钟 板上 8MHZ
2.3 PLL倍频时钟
3. 时钟介绍
3.1 HSI振荡器时钟
系统上电默认时钟,内部振荡器 8MHZ,可以直接作为系统时钟或在2分频后作为PLL的输入。 时钟频率精度较差
3.2 HSE 振荡器时钟 外部
提供非常精确的主时钟
3.3 PLL 倍频
时钟源输入: HSI时钟/2, HSE或 通过一个可配置分频的PLL2时钟
3.4 LSE时钟
LSE晶体是一个32.867的低速外部晶体。提供实时时钟
3.5 LSI时钟 Internal 内部
LSI RC担当一个低功耗时钟源的角色,它可以在停机和待机模式下保存运行。为独立看门狗和自动唤醒单元提供时钟。LSI时钟频率大约40KHZ
设置时钟流程:
1.将RCC寄存器重新设置为默认值 RCC_DeInit
2.打开外部高速时钟晶振HSE RCC_HSEConfig(RCC_HSE_ON);
3.等待外部高速时钟晶振工作 HSEStartUpStatus =RCC_WaitForHSEStartUp();
4.设置AHB时钟 RCC_HCLKConfig;
5.设置高速APB2时钟 RCC_PCLK2Config;
6.设置低速速APB1时钟 RCC_PCLK1Config
7.设置PLL RCC_PLLConfig
8.打开PLL RCC_PLLCmd(ENABLE);
9.等待PLL工作 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
10.设置系统时钟 RCC_SYSCLKConfig
11.判断是否PLL是系统时钟 while(RCC_GetSYSCLKSource() != 0x08)
12.打开要使用的外设时钟 RCC_APB2PeriphClockCmd()/RCC_APB1PeriphClockCmd()
整个工程代码:实现RCC配置,LED闪烁测试 速度 1_RCC.rar RCC C H 文件:
rcc.rar - void RCC_Configuration(void)
-
{
-
ErrorStatus HSEStartUpStatus;
-
//SystemInit(); //完全可以使用此函数配置,但是为了学习咱先不用
-
RCC_DeInit(); //复位RCC模块的寄存器,复位成缺省值
-
RCC_HSEConfig(RCC_HSE_ON); //开启HSE时钟,咱是用HSE的时钟作为PLL的时钟源
-
HSEStartUpStatus = RCC_WaitForHSEStartUp(); //获取HSE启动状态
-
-
if(HSEStartUpStatus == SUCCESS) //如果HSE启动成功
-
{
-
FLASH_PrefetchBufferCmd(ENABLE); //开启FLASH的预取功能
-
FLASH_SetLatency(FLASH_Latency_2);//FLASH延迟2个周期
-
//FLASH 定义在 stm32f10x_map.h
-
/*不能被注释掉,这是在配置flash的等待周期,48 MHz < SYSCLK ≤ 72 MHz
-
时是需要有两个等待周期得,否则flash有可能进入写保护,详细请看
-
St的STM32F10xxx Flash programming这个文档,其中FLASH_ACR寄存器的最低3位就是配置等待周期的,
-
这是必须要配的或者你直接调用Systeminit就不用自己配时钟了*/
-
//配置HCLK,PCLK2,PCLK1,PLL
-
RCC_HCLKConfig(RCC_SYSCLK_Div1); //AHB=SYSCLK
-
RCC_PCLK2Config(RCC_HCLK_Div1); //APB2 = SYSCLK
-
RCC_PCLK1Config(RCC_HCLK_Div2); //APB1 = SYSCLK/2;
-
-
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_2); //8MHZ*2=16
-
RCC_PLLCmd(ENABLE); //启动PLL
-
-
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);//检查指定的RCC标志设置是否
-
//等待PLL启动完成
-
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//配置系统时钟
-
while(RCC_GetSYSCLKSource() != 0x08); //检查是否将HSE 2倍频后作为系统时钟
-
}
-
}
阅读(1012) | 评论(0) | 转发(0) |