stm32 时钟设置函数分析

发布者:skyhcg最新更新时间:2016-09-24 来源: eefocus关键字:stm32  时钟设置  函数分析 手机看文章 扫描二维码
随时随地手机看文章
__IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  
  /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/   
这个函数的主要目的是 设置以上4个时钟的,那这四个时钟主要是用来干什么的?
这个后面再分析。
先看怎么获取72M的频率 
  /* Enable HSE */    打开外部高速时钟 
  RCC->CR |= ((uint32_t)RCC_CR_HSEON); 
 
等待时钟稳定
/* Wait till HSE is ready and if Time out is reached exit */
  do
  {
    HSEStatus = RCC->CR & RCC_CR_HSERDY;
    StartUpCounter++;  
  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
  if ((RCC->CR & RCC_CR_HSERDY) != RESET)
  {
    HSEStatus = (uint32_t)0x01;
  }
  else
  {
    HSEStatus = (uint32_t)0x00;
  }  
 
如果时钟稳定了
if (HSEStatus == (uint32_t)0x01)
  {
    /* Enable Prefetch Buffer */
    FLASH->ACR |= FLASH_ACR_PRFTBE;
 
    /* Flash 2 wait state */
    FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
    FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2; 
    
    /* HCLK = SYSCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;  ///*!< SYSCLK not divided */    
 
    /* PCLK2 = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;  ///*!< HCLK not divided */ 
 
    /* PCLK1 = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2; // /*!< HCLK not divided */
 
#ifdef STM32F10X_CL
   这一段互联型的产品的描述 删掉 
#else    
 开始设置倍频 9倍频 
    /*  PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
                                        RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
#endif /* STM32F10X_CL */
 
    /* Enable PLL */ 打开PLL
    RCC->CR |= RCC_CR_PLLON;
 
    /* Wait till PLL is ready */ 等待PLL稳定 
    while((RCC->CR & RCC_CR_PLLRDY) == 0)
    {
    }
    
    /* Select PLL as system clock source */ 选中PLL 作为时钟源
  也就是切换系统时钟  
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;    
 
    /* Wait till PLL is used as system clock source */ 等待系统时钟源的切换 
  因为系统刚开始(从复位到这一步)不是以PLL作为时钟源的。
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)
    {
    }
  到这里,在来看刚刚开始问题 /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/ 
这几个时钟 都是用来做什么的。
 配置情况 
  /* HCLK = SYSCLK */ 
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;  ///*!< SYSCLK not divided */  
    /* PCLK2 = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;  ///*!< HCLK not divided */
    /* PCLK1 = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2; // /*!< HCLK not divided */
还是要看时钟树:
时钟树:
stm32 时钟设置函数分析 以static void SetSysClockTo72(void)为例 - dzdesigned80 - dzdesigned80的博客
 可以看出HCLK就是 AHB的时钟
PCLK2 就是APB2时钟
PCLK1 就是APB1时钟 ,系统里面的注释还有点错误,APB1应该=1/2 HCLk 
SYSCLK就是PLL时钟输入
关键字:stm32  时钟设置  函数分析 引用地址:stm32 时钟设置函数分析

上一篇:stm32 中断向量表 NVIC_SetVectorTable() 应用
下一篇:stm32小容量、中容量和大容量产 在选择启动文件时该怎么选

推荐阅读最新更新时间:2024-03-16 15:11

STM32单片机和51单片机区别
单片机简介 单片微型计算机简称单片机,简单来说就是集CPU(运算、控制)、RAM(数据存储-内存)、ROM(程序存储)、输入输出设备(串口、并口等)和中断系统处于同一芯片的器件,在我们自己的个人电脑中,CPU、RAM、ROM、I/O这些都是单独的芯片,然后这些芯片被安装在一个主板上,这样就构成了我们的PC主板,进而组装成电脑,而单片机只是将这所有的集中在了一个芯片上而已。 51单片机和STM32单片机 51单片机是对所有兼容Intel8031指令系统的单片机的统称,这一系列的单片机的始祖是Intel的8031单片机,后来随着flash ROM技术的发展,8031单片机取得了长足的进展成为了应用最广泛的8bit单片机之一,他的代表型
[单片机]
STM32学习笔记之 重映射功能
简介:最近在学习STM32,在BZ上一篇关于的串口通信文章里有这么一段代码:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO,ENABLE); 当初是参考开发的里子写的一直对GPIOD或上 RCC_APB2Periph_ ... 关键字: STM32 重映射 最近在学习STM32,在BZ上一篇关于的串口通信文章里有这么一段代码:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO,ENABLE); 当初是参考开发的里子写的一直对GPIOD或上 RCC_APB2Peri
[单片机]
<font color='red'>STM32</font>学习笔记之 重映射功能
stm32智能小车之路之小车启动
首先,安装完小车后最激动的还是想让他跑动,那么就开始吧。写个简单的程序测试下电机是否正常。打开keil软件新建一个工程,具体简历keil工程不会的请百度,或者call我,我有简历Keil工程的文档,保证你会的。 第一初始化管脚,来进行控制电机,输出高低电平,方可让电机转动。 /******************************************************************************* * 函数名字 : GPIO_Configuration(void) * 描述 : 初始化PE7~PE8为输出口.并使能这两个口的时钟 Motor(电机输出引脚) IO初始化 * 输
[单片机]
<font color='red'>stm32</font>智能小车之路之小车启动
stm32_中断优先级详解
我自己依据此图理解,应用思维导图画了一张方便理解:(如果看不清可通过ctrl+鼠标滑轮 放大看;) 前提条件1:组别优先顺序(第0组优先级最强,第4组优先级最弱):NVIC_PriorityGroup_0 NVIC_PriorityGroup_1 NVIC_PriorityGroup_2 NVIC_PriorityGroup_3 NVIC_PriorityGroup_4 这里说的组优先级第一很容易误解 其实一个程序只设置一遍组 先整理好所有中断个数再看用那个组 前提条件2:“组”优先级别 “抢”占优先级别 “副”优先级别 前提条件3:同一组优先级别中,不同的抢占级别之间,其中一抢占级别正在做事,另外抢占级别不能打断他;
[单片机]
stm32_中断优先级详解
STM32学习笔记1 IO口学习
STM32的IO口可以由软件配置成8种模式: 1,输入浮空 2,输入上拉 3,输入下拉 4,模拟输入 5,开漏输出 6,推挽输出 7,推挽复用功能 8,开漏复用功能 每个IO口可以自由编程,单IO口寄存器必须要按32位字被访问。 这里就是寄存器不能位操作咯 STM32的每个IO端口都有7个寄存器来控制。他们分别是:配置模式的2个32位的端口配置寄存器CRL和CRH;2个32位的数据寄存器IDR和ODR;1个32位的置位/复位寄存器BSRR;一个16位的复位寄存器BRR;1个32位的锁存寄存器LCKR;这里我们仅介绍常用 的几个寄存器,我们常用的IO端口寄存器只有4个:CRL、CRH、IDR、ODR。 STM32的CRL控制
[单片机]
STM32学习笔记之时钟系统
首先 时钟是STM32单片机的脉搏,是单片机的驱动源。使用任何一个外设都必须打开相应的时钟。这样的好处就是,如果不使用一个外设的时候,就把它的时钟关掉,从而可以降低系统的功耗,达到节能,实现低功耗的效果。 1. STM32的时钟系统 在STM32中,一共有5个时钟源,分别是HSI、HSE、LSI、LSE、PLL (1)HSI是高速内部时钟,RC振荡器,频率为8MHz; (2)HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围是4MHz – 16MHz; (3)LSI是低速内部时钟,RC振荡器,频率为40KHz; (4)LSE是低速外部时钟,接频率为32.768KHz的石英晶体; (5)PLL为锁相环倍频
[单片机]
<font color='red'>STM32</font>学习笔记之<font color='red'>时钟</font>系统
用Keil对STM32代码封库的实现方法
有时候,我们所写代码的具体实现方法不想让其他人知道。这时,可以用Keil对代码进行封库。 注意:在封库之前,必须确保整个工程代码能够编译通过。 下面举例说明操作步骤: 想要把工程中“firmware.c”文件封装成库文件。 1、对不封装成库的文件执行以下操作: 点击“OK”确定。对除“firmware.c”的其他文件,执行上述操作。操作完成后,会发现文件图标有所变化: 2、选择“Options for Target”- output选项卡- 选择Create Library项 3、编译整个工程,会在选定的路径 ..\Output\ 下出现 firmware.lib 文件 4、删除工程中的“fir
[单片机]
用Keil对<font color='red'>STM32</font>代码封库的实现方法
深度解析STM32驱动LCD原理
TFTLCD即薄膜晶体管液晶显示器。它与无源TN-LCD、STN-LCD的简单矩阵不同,它在液晶显示屏的每一个像素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提高了图像质量。 01驱动流程 使用FSMC驱动LCD 关于FSMC,把数据写入相应的地址,FSMC就会把地址从FSMC_A出去,写入的数据会会从FSMC_D发出去。至于片选等信号线都是自动的。读的话,直接读相应的地址,就会拿到改地址上的数据。 FSMC驱动外部SRAM时,外部SRAM的控制一般有: 地址线(如A0~A25) 数据线(如D0~D15) 写信号(WE,即WR) 读信号(OE,即RD) 片选信号
[单片机]
深度解析<font color='red'>STM32</font>驱动LCD原理
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved