时钟体系

一、时钟体系

1、参考手册 STM32F4xx中文参考手册.pdf 第106页
2、时钟源
a.可以使用三种不同的时钟源来驱动系统时钟 (SYSCLK),CPU运行的频率为168MHz:
HSI 振荡器时钟,也就是高速内部时钟,一般来说很少用,因为精度没有外部高速时钟那么高
HSE 振荡器时钟,也就是高速外部时钟,GECM4开发板8MHz。
主 PLL (PLL) 时钟
b.器件具有以下两个次级时钟源:
32 kHz 低速内部 RC (LSI RC),该 RC 用于驱动独立看门狗也可选择提供给 RTC 用于停机/待机模式下的自动唤醒
32.768 kHz 低速外部晶振(LSE 晶振)用于驱动 RTC 时钟 (RTCCLK)对于每个时钟源来说,在未使用时都可单独打开或者关闭,以降低功耗


二、SystemInit系统初始化函数

1.其实第一个执行的文件是汇编文件

 .栈的初始化,提供函数调用的时候进行现场保护和现场恢复
 .堆的初始化,为申请内存提供空间,调用malloc
 .执行Reset_Handler,意思说上电复位后执行的动作
  .执行SystemInit函数
  .跳转到main函数

2.初始化Flash接口,更新PLL系统频率

/**
  * @brief  Setup the microcontroller system
  *         Initialize the Embedded Flash Interface, the PLL and update the 
  *         SystemFrequency variable.
  * @param  None
  * @retval None
  */
void SystemInit(void)
{
  ................
  /* Configure the System clock source, PLL Multiplier and Divider factors, 
     AHB/APBx prescalers and Flash settings ----------------------------------*/
  SetSysClock();
  ................
}

 

3.调用SetSysClock函数设置PLL时钟,然后进行分频

/**
  * @brief  Configures the System clock source, PLL Multiplier and Divider factors, 
  *         AHB/APBx prescalers and Flash settings
  * @Note   This function should be called only once the RCC clock configuration  
  *         is reset to the default reset state (done in SystemInit() function).   
  * @param  None
  * @retval None
  */
static void SetSysClock(void)
{
      .....................
    /* Configure the main PLL */
    RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |
                   (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);
 .....................
}
system_stm32f4xx.c文件有以下倍频因子:
/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */
#define PLL_M      25
/* USB OTG FS, SDIO and RNG Clock =  PLL_VCO / PLLQ */
#define PLL_Q      7
#if defined (STM32F40_41xxx)
#define PLL_N      336
/* SYSCLK = PLL_VCO / PLL_P */
#define PLL_P      2
#endif /* STM32F40_41xxx */

 

由于官方的代码是使用外部高速晶振25MHz,GEC-M4开发板是使用外部高速晶振8MHz,所以PLL的倍频因子要进行修改,只修改PLL_M为8.

4.阅读system_stm32f4xx.c文件的头部注释

  
*=============================================================================
  *=============================================================================
  *                    Supported STM32F40xxx/41xxx devices
  *-----------------------------------------------------------------------------
  *        System Clock source                    | PLL (HSE)
  *-----------------------------------------------------------------------------
  *        SYSCLK(Hz)                             | 168000000
  *-----------------------------------------------------------------------------
  *        HCLK(Hz)                               | 168000000
  *-----------------------------------------------------------------------------
  *        AHB Prescaler                          | 1
  *-----------------------------------------------------------------------------
  *        APB1 Prescaler                         | 4
  *-----------------------------------------------------------------------------
  *        APB2 Prescaler                         | 2
  *-----------------------------------------------------------------------------
  *        HSE Frequency(Hz)                      | 25000000 ?GEC-M4开发板外部晶振是8MHz,我们要将25MHz修改为8MHz
  *-----------------------------------------------------------------------------
  *        PLL_M                                  | 25
  *-----------------------------------------------------------------------------
  *        PLL_N                                  | 336
  *-----------------------------------------------------------------------------
  *        PLL_P                                  | 2
  *-----------------------------------------------------------------------------
  *        PLL_Q                                  | 7
  *-----------------------------------------------------------------------------
  *        PLLI2S_N                               | NA
  *-----------------------------------------------------------------------------
  *        PLLI2S_R                               | NA
  *-----------------------------------------------------------------------------
  *        I2S input clock                        | NA
  *-----------------------------------------------------------------------------
  *        VDD(V)                                 | 3.3
  *-----------------------------------------------------------------------------
  *        Main regulator output voltage          | Scale1 mode
  *-----------------------------------------------------------------------------
  *        Flash Latency(WS)                      | 5
  *-----------------------------------------------------------------------------
  *        Prefetch Buffer                        | ON
  *-----------------------------------------------------------------------------
  *        Instruction cache                      | ON
  *-----------------------------------------------------------------------------
  *        Data cache                             | ON
  *-----------------------------------------------------------------------------
  *        Require 48MHz for USB OTG FS,          | Disabled
  *        SDIO and RNG clock                     |
  *-----------------------------------------------------------------------------
  *=============================================================================

 

修改stm32f4xx.h以下内容,行127将外部晶振频率值修改为8MHz。
#if !defined  (HSE_VALUE) 
  #define HSE_VALUE    ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
  
#endif /* HSE_VALUE */

 

#
 打开闪烁灯的代码,调节PLL的PLL的N值,感受闪烁灯的速度。
提示:
 调节PLL_N的值为432的时候,那么CPU跑的频率能够高达216MHz,感受超频的快感!
 调节PLL_N的值为168的时候,那么CPU跑的频率能够高达84 MHz,感受蜗牛的速度!
 
 
项目经验:
 调节CPU的运行频率,来控制系统的性能与功耗。比较典型的例子就是说手机/笔记本电脑都有高性能模式、平衡模式、低功耗模式
 
 
M4开发板
 高性能  216MHz,最高能够?MHz//168...178...200...220...238...250... 超出一半了, 还在继续. 让人感到激动和兴奋!
         //260...270...280.太令人兴奋了.嗯, 最终 RTC 指示灯停止了闪烁, 测试停下了. 屏幕显示 282467776hz PLLN = 282.
        //168Mhz 的 CPU 既然最高超过了 281Mhz! 超频率达 167%!
 平衡模式 168MHz
 低功耗  84MHz,最低能够低到8MHz
 
 
晶振:有电容的存在,输出是正弦波。为系统提供基本的时钟信号。通常一个系统共用一个晶振,便于各部分保持同步
     晶振通常与锁相环电路配合使用,以提供系统所需的时钟频率。如果不同子系统需要不同频率的时钟信号,可以用与同一个晶振相连的不同锁相环来提供。
 
12M、24M之类的晶振较好理解,选用如11.0592MHZ的晶振给人一种奇怪的感觉,这个问题解释起来比较麻烦,如果初学者在练习串口编程的时候就会对此有所理解,这种晶振主要是可以方便和精确的设计串口或其它异步通讯时的波特率。
 
无源晶体与有源晶振的区别、应用范围及用法:  
1、无源晶体——无源晶体需要用DSP片内的振荡器,在datasheet上有建议的连接方法。无源晶体没有电压的问题,信号电平是可变的,也就是说是根据起振电路来决定的,同样的晶体可以适用于多种电压,可用于多种不同时钟信号电压要求的DSP,而且价格通常也较低,因此对于一般的应用如果条件许可建议用晶体,这尤其适合于产品线丰富批量大的生产者。无源晶体相对于晶振而言其缺陷是信号质量较差,通常需要精确匹配外围电路(用于信号匹配的电容、电感、电阻等),更换不同频率的晶体时周边配置电路需要做相应的调整。建议采用精度较高的石英晶体,尽可能不要采用精度低的陶瓷警惕。
2、有源晶振——有源晶振不需要DSP的内部振荡器,信号质量好,比较稳定,而且连接方式相对简单(主要是做好电源滤波,通常使用一个电容和电感构成的PI型滤波网络,输出端用一个小阻值的电阻过滤信号即可),不需要复杂的配置电路。有源晶振通常的用法:一脚悬空,二脚接地,三脚接输出,四脚接电压。相对于无源晶体,有源晶振的缺陷是其信号电平是固定的,需要选择好合适输出电平,灵活性较差,而且价格高。对于时序要求敏感的应用,个人认为还是有源的晶振好,因为可以选用比较精密的晶振,甚至是高档的温度补偿晶振。有些DSP内部没有起振电路,只能使用有源的晶振,如TI 的6000系列等。有源晶振相比于无源晶体通常体积较大,但现在许多有源晶振是表贴的,体积和晶体相当,有的甚至比许多晶体还要小。


1.位带操作 STM32F3与F4系列Cortex M4内核编程手册.pdf 第31页 2.2.5 Bit-banding
  .回想以前写51代码
   P0 = 0x10; //将P0端口设置为0x10
   P1_0=1;  //将P1端口1号引脚设置为高电平
   a = P2_2; //获取P2端口2号引脚的电平
 根据上述的方法,我们可以发现快速定位修改某个引脚的电平还有获取引脚的状态
 GPIO_SetBits、GPIO_ResetBits操作IO口的性能没有达到极致,因为这些函数都需要进行现场保护和现场恢复的动作,比较耗时间,没有进行一步到位
 GPIO_SetBits(GPIOF,GPIO_Pin_9);
修改为
 PFout(9)=1;   
 GPIO_ResetBits(GPIOF,GPIO_Pin_9);
修改为
 PFout(9)=0;
2.中断与事件,STM32F4xx中文参考手册.pdf 第233页
 
3.startup_stm32f40_41xxx.s看汇编代码 
 
posted @ 2019-06-01 15:27  狂奔~  阅读(616)  评论(0编辑  收藏  举报