Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4520582
  • 博文数量: 1148
  • 博客积分: 25453
  • 博客等级: 上将
  • 技术积分: 11949
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-06 21:14
文章分类

全部博文(1148)

文章存档

2012年(15)

2011年(1078)

2010年(58)

分类: 嵌入式

2011-06-19 17:03:36

好的资料: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  

  1. void RCC_Configuration(void)
  2. {
  3.     ErrorStatus HSEStartUpStatus;
  4.     //SystemInit(); //完全可以使用此函数配置,但是为了学习咱先不用
  5.     RCC_DeInit(); //复位RCC模块的寄存器,复位成缺省值
  6.     RCC_HSEConfig(RCC_HSE_ON); //开启HSE时钟,咱是用HSE的时钟作为PLL的时钟源
  7.     HSEStartUpStatus = RCC_WaitForHSEStartUp(); //获取HSE启动状态

  8.     if(HSEStartUpStatus == SUCCESS) //如果HSE启动成功
  9.     {
  10.          FLASH_PrefetchBufferCmd(ENABLE); //开启FLASH的预取功能
  11.          FLASH_SetLatency(FLASH_Latency_2);//FLASH延迟2个周期

  12.         //FLASH 定义在 stm32f10x_map.h
  13. /*不能被注释掉,这是在配置flash的等待周期,48 MHz < SYSCLK ≤ 72 MHz
  14. 时是需要有两个等待周期得,否则flash有可能进入写保护,详细请看
  15. St的STM32F10xxx Flash programming这个文档,其中FLASH_ACR寄存器的最低3位就是配置等待周期的,
  16. 这是必须要配的或者你直接调用Systeminit就不用自己配时钟了*/

  1.         //配置HCLK,PCLK2,PCLK1,PLL
  2.         RCC_HCLKConfig(RCC_SYSCLK_Div1); //AHB=SYSCLK
  3.         RCC_PCLK2Config(RCC_HCLK_Div1);    //APB2 = SYSCLK
  4.         RCC_PCLK1Config(RCC_HCLK_Div2);    //APB1 = SYSCLK/2;
  5.         
  6.         RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_2); //8MHZ*2=16
  7.         RCC_PLLCmd(ENABLE); //启动PLL

  8.         while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);//检查指定的RCC标志设置是否
  9.                                                          //等待PLL启动完成
  10.        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//配置系统时钟
  11.         while(RCC_GetSYSCLKSource() != 0x08); //检查是否将HSE 2倍频后作为系统时钟
  12.     }
  13. }


阅读(1036) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~