STM32的系统时钟的配置的代码的讲解

发布者:DreamyEclipse最新更新时间:2017-11-02 关键字:STM32  系统时钟 手机看文章 扫描二维码
随时随地手机看文章

ST公司默认是将系统时钟配置到72MHZ。

 以下的七个步奏是设置系统时钟的函数,该函数截取自库文件system_stm32f10x.c。

将互联型相关的代码删掉便于分析,并标上了序号,总共七个步奏,这个顺序也是系统时钟配置的

的步奏,通过直接操作寄存器,主要相关的寄存器,主要是时钟配置寄存器RCC_CFGR,具体位的设置

和bit的含义,参考STM32参考手册

static void SetSysClockTo72(void)

{

  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;

  

  // SYSCLK, HCLK, PCLK2 and PCLK1 配置过程的顺序   

 //(1)使能 HSE(高速外部时钟),并等待 HSE 稳定    

  RCC->CR |= ((uint32_t)RCC_CR_HSEON);

 

  // 等待 HSE 启动稳定,并做超时处理

  // 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;

  }  

   //HSE启动成功,则继续往下处理 

  if (HSEStatus == (uint32_t)0x01)

  {

    // 使能FLASH预存取缓冲区

    FLASH->ACR |= FLASH_ACR_PRFTBE;

 

    FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);

    FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;    

//(2)设置AHB、APB2、APB1预分频因子

    // HCLK = SYSCLK 

    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;

      

    // PCLK2 = HCLK 

    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;

    

    //PCLK1 = HCLK 

    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;

   

    // (3)设置PLL的时钟来源,设置PLL的倍频因子, 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); 

    //(4) 使能 PLL 

    RCC->CR |= RCC_CR_PLLON;

    //(5) 等待PLL的稳定 

    while((RCC->CR & RCC_CR_PLLRDY) == 0)

    {

    }

    

   // (6)选择PLL作为时钟来源 

    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));

    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;    

    //(7)读取时钟切换状态,确保PLLCLK被选为系统时钟

    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)

    {

    }

  }

  else

  { // 如果HSE启动失败,用户可以再这里添加错误代码出来

  }

}

#endif

系统是时钟配置代码学习中遇到的基础的函数定义、杂文集。。

一、__IO uint32_t  (很早之前遇到的一个问题,记录一下

  库文件的定义如下:

#define   __IO    volatile    

可以看出 __IO  其实就是 volatile 的意思。

  volatile 的作用就是指示编译器不要因优化而省略此指令,必须每次都直接读写其值。

写一段测试代码如下

  u8 test;

 

  test = 1;

  test = 2;

  test = 3;

设置优化级别中级

运行后test会被直接取值为3 只有最后一个语句被编译

如用volatile

  volatile u8 test;

 

  test = 1;

  test = 2;

  test = 3;

则所有语句都会被编译。test先后被设置成1、2、3

由此可以看出这个作用在IO操作,寄存器操作,特殊变量,多线程变量读写都是很重要。

二、(uint32_t)0x01

uint32_t    是系统定义的    typedef uint32_t unsigned int

(uint32_t)0x01

的作用就是将0x01装换成32位的进行操作。


关键字:STM32  系统时钟 引用地址:STM32的系统时钟的配置的代码的讲解

上一篇:STM32关于外部时钟晶振为什么选用8MHz
下一篇:STM32与上位机发送和接收数据

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

stm32定时器概述
stm32的定时器分3类:基本定时器、通用定时器和高级定时器,其中通用定时器分两组:(TIM2-TIM5)和(TIM9-TIM14)。 基本定时器(TIM6、TIM7) 功能:基本定时和驱动DAC 16位自动重装递增计数器 16位可编程预分频器 频率:84MHz 中断源:计数器上溢更新中断 通用定时器(TIM9到TIM14) 16位自动重装递增计数器 16位可编程预分频器 TIM9和TIM12有两路单通道,其余TIM10、11、13、14都有一路单通道 多定时器互联同步 中断源:更新、输入捕获、输出比较 TIM9和TIM12 时钟源:内部时钟、外部时钟(外部输入引脚TIx)、定时器互同步时钟 常用功能模式:基本
[单片机]
<font color='red'>stm32</font>定时器概述
STM32经验心得(一)
相关经验及心得如下:  摘要:1.在配置USART的TX完成中断后,在没有发数的情况下自动进入TX完成中断函数。2 .在TX配置完成后,相应的TC标志位会自动置1,随后就进入了TX完成中断。3.相关配置程序编写无误,并已经开启时钟,依旧无法配置相关GPIO及外设;4.ADC通道:分为规则组和注入组;5.修改定时器的预装值后,定时器不能立刻修改。 一、 USART TX中断配置 1. 问题描述: 在配置USART的TX完成中断后,在没有发数的情况下自动进入TX完成中断函数。 2. 问题分析: 在TX配置完成后,相应的TC标志位会自动置1,随后就进入了TX完成中断。 (TC标志位:发送完成标志位 ) 当包含有数据的一帧发送
[单片机]
<font color='red'>STM32</font>经验心得(一)
基于STM32的嵌入式测控系统设计与实现
测控系统是水动力实验中的重要测试设备。在实验中有压力、拉力、加速度等物理量通过传感器转换成电压值,需要准确记录。虽然实验模型有很多种,但是共用传感器及测控系统,因此对测控系统的通用性和用户界面友好性提出了要求。本文采用嵌入式架构设计了测控系统。 本文设计的系统硬件基于STM32芯片,具有很强的扩展能力,易于移植,其外设单元资源丰富,能够达到系统要求的精度和范围。 1、硬件架构 采用嵌入式架构(见图1)的优点是通用性强,便于在多平台移植;主控芯片外围电路模块丰富,包括ADC、DA、CAN和SDIO等接口,独立完成对多种类型设备的测量、控制。芯片的主频高,运算能力也很强,适合嵌入复杂的算法。完全适合作为测控系统,具备系统升级
[单片机]
基于<font color='red'>STM32</font>的嵌入式测控<font color='red'>系统</font>设计与实现
STM32窗口看门狗详解
本文将介绍窗口看门狗,并通过按键模拟触发程序死机、进而触发提前唤醒中断、并复位程序。 ①窗口看门狗介绍 ②STM32CUBEMX配置工程文件 ③代码实现 ①窗口看门狗介绍 窗口看门狗用来监测由于不可预知的因素或者不可预知的逻辑条件导致程序脱离正常运行序列的软件故障。 窗口看门狗介绍之工作原理框图: 窗口看门狗介绍之配置寄存器: 预分频器用于将RCC传来的PCLK1时钟进行分频,配置寄存器中第7位第8位用来存放预分频器的预分频值,第0位至第6位用于存放窗口看门狗的窗口值,当计数器的值大于窗口值时喂狗会触发复位、即只有计数器的值在0x40与窗口值之间时喂狗不会触发程序复位;所以窗口值需要大于0x40、小于0x7f,否则窗口没有
[单片机]
<font color='red'>STM32</font>窗口看门狗详解
stm32 ADC的规则通道和注入通道混合使用
之前完成了规则通道DMA的数据传输了,不过平时在使用ADC的时候可能就会遇到很多情况,不可能就这样简单的按规则通道来采样,DMA存储,使用数据的;可能有时候会需要立刻采样,那样我们就需要利用到注入通道了。文档关于注入通道的解释: 1 利用外部触发或通过设置ADC_CR2寄存器的ADON位,启动一组规则通道的转换。 2 如果在规则通道转换期间产生一外部注入触发,当前转换被复位,注入通道序列被以单次扫描方式进行转换。 3 然后,恢复上次被中断的规则组通道转换。如果在注入转换期间产生一规则事件,注入转换不会被中断,但是规则序列将在注入序列结束后被执行。   将变阻器的那路ADC设置为注入通道: 1 ADC_In
[单片机]
<font color='red'>stm32</font> ADC的规则通道和注入通道混合使用
STM32之CANTTCAN模式浅析
1 前言 传统CAN 采用事件触发消息传输机制,CSMA/ CD+ AMP( Carrier-Sense Mult iple Access w ith Co llision Detect ion and Arbit ration on Message Priorit ies, 载波侦听、多路访问、冲突检测、优先级仲裁) 介质访问控制机制, 即多个消息同时发送时, 按照消息标识符的优先级顺序, 低优先级消息自动退出, 高优先级消息继续发送。这种介质访问方式提高了网络的利用率和高优先级消息的实时性, 但在重负载CAN 中, 低优先级消息经常由于总线冲突而被迫退出发送, 导致低优先级消息传输时延长, 且传输时延不可预测,
[单片机]
<font color='red'>STM32</font>之CANTTCAN模式浅析
MSP430 5438时钟系统介绍
简介:UCS模块支持低功耗。它内部含有三个时钟信号,用户可以自行选择,找到性能和功耗的平衡点。UCS软件配置后,只需要一两个晶振或者电阻,而不需要使用外部振荡器。 1.1时钟系统介绍 UCS模块最多含有5个时钟源: l XT1CLK:低频/高频振荡器,可以使用低频 32768HZ 晶振和外部振荡器或者通过外部输入源输入4MHZ~32MHZ时钟。 l VLOCLK:内部低消耗,低频振荡器。典型值为 12KHZ。 l REFOCLK:内部低频振荡器,典型值为 32768HZ,作为 FLL基准源。 l DCOCLK:内部数字控制振荡器(DCO)可以通过 FLL来稳定。 l XT2CLK:可选择的高频振荡器,可以使用标准晶振,振荡
[单片机]
MSP430 5438<font color='red'>时钟</font><font color='red'>系统</font>介绍
玩转STM32(1)入门硬件的基本条件
由于嵌入式软件都是在设备里,相对PC软件来说更容易实现价值,即使软件非常简单,比如万行级别的软件就可以实现很好的功能了,如果这样万行级别的PC软件,很难卖出一个价钱来的,现在PC上的软件都是几十万行,或者百万行级别上才能实现价值的销售,从这个角度来说,嵌入式软件比PC软件更容易实现代码的变现能力,当然PC上容易变现能力的代码是前端、后端,但这样需要很多商业模式,比如像淘宝这样。因此嵌入式软件开发,还是一个蛮有竞争力的市场,也适合小团队,甚至个人独立完成开发的工作。另外,工业互联网和物联网也在迅猛发展,对这个需求更加广泛了。比如智能音箱已经在农村进行推广,因为农村电话网全部改为光纤网络,有线电视也全部光纤改造了,因此上网的必备条件已
[单片机]
玩转<font color='red'>STM32</font>(1)入门硬件的基本条件
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

更多每日新闻
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved