datasheet

stm32f051(2)系统时钟设置

2016-10-10来源: eefocus关键字:stm32f051  系统时钟设置
原理分析:

系统时钟的设置在运行MCU时是十分关键的问题,你需要知道你的CPU跑在什么样的速度,使用什么样的时钟,如何设置。这些问题我们都在这一节一一讲述,并且同时将会通过硬件参数的系统滴答时钟SysTick来进行精确定时。

Stm32f051系列属于cortex m0系列内核,时钟速率最快可以跑到接近50MHZ左右,那么其内核时钟如何产生的了?我们首先看看下面的时钟结构图:

图中的我们可以看到,M0的时钟实际上是有多种选择途径的,你采用外部高速晶振时钟可以,也可以采用内部的高速时钟,最终都要通过一个PLL进行倍频的,倍频之后再分频提供给AHB总线,AHB总线上挂了系统CPU,AHB分频后的时钟就是CPU的工作时钟了。之后还要通过APB时钟分频提供给其他的外设使用。上面所分析的就是M0内部时钟是如何产生的。知道这些了,我们就来通过KEIL编译环境对这个工作时钟状态进行设置。

我们首先结合软件程序进行讲解。首先看看通过keil建立工程项目,如下图所示:

软件准备:

Keil的工程树建立如下图所示:lib中加入gpio和rcc两个库文件,分别用于设置GPIO和rcc时钟。用户需要编写systick.c文件用于设置时钟滴答。

如上图所示,其中在system_stm32f0xx.c文件中设置了多系统时钟,打开此文件,我们看见下面一个定义:

 

这里面定义了三种时钟方式,我们采取第二种,采用8MHz外部时钟作为主时钟。HSI称为高速内部振荡时钟,HSE称为外部振荡时钟。同时在文件系统中定义系统内核时钟为48MHZ。

下面一段代码定义了HSI通过PLL配置为48MHZ:

系统外部时钟模型如下:

此在system_stm32f0xx.c文件内定义好了系统时钟,那么在启动项首先直接指向SystemInit,启动项文件我们在startup_stm32f0xx.s中可以找到如下代码:

startup_stm32f0xx.s是建立stm32f051 keil工程项目后MDK自动产生的。可以看到系统启动后首先确定系统时钟,然后才进入住函数。系统时钟配置好后,我们在来通过SysTick来进行精确定时,来驱动LED进行闪烁,这里面设置ms级的配置,然后设置10s闪烁,大家下载程序后可以对照时钟看是不是10s进行闪烁。

首先建立一个延迟函数,nTime作为定时数。SysTick配置通过设置为1ms,为SystemCoreClock / 1000:

并且通过TimingDelay_Decrement调动中断,代码如下:

在stm32f0xx_it.c 中定义 SysTick_Handler中断函数,函数调用TimingDelay_Decrement:

最后我们调用上面编写的systick.c子函数,编写主函数如下:

实验现象:

Led灯按照1s等间隔的闪烁,精确定时。

关键字:stm32f051  系统时钟设置

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/mcu/article_2016101030280.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:Cortex-M3内核STM32的三相多功能电能表解决方案
下一篇:stm32f051按键控制(3)

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

stm32F4XX之窗口看门狗 HAL库

附上相关代码WWDG_HandleTypeDef WWDG_Handler;     //窗口看门狗句柄 //保存WWDG计数器的设置值,默认为最大u8 WWDG_CNT=0X7F;  //初始化窗口看门狗 //tr   :T[6:0],计数器值 //wr   :W[6:0],窗口值 //fprer:分频系数(WDGTB),仅最低2位有效 //Fwwdg=PCLK1/(4096*2^fprer). 一般PCLK1=45Mhzvoid WWDG_Init(u8 tr,u8 wr,u32 fprer
发表于 2019-04-16
stm32F4XX之窗口看门狗 HAL库

stm32f0独立看门狗配置

独立看门狗STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然有效。设置好看门狗的分频系数 prer 和重装载值就可以知道看门狗的喂狗时间 (也就是看门狗溢出时间) ,该时间的计算方式为Tout=((4×2^prer)  ×rlr) /40具体配置先开启看门狗对看门狗进行设置,这里主要的是设置IWDG down-counter reload value。IWDG counter clock prescaler为分频系数,我现在项目设置的IWDG的时钟是40KHz,所以分频后为40000/16=2500Hz,我先在项目需要使用1秒的看门狗,则2500*1=2500,就是IWDG
发表于 2019-04-12
stm32f0独立看门狗配置

STM32F030应用常见问题

STM32F030的PF0、PF1作为普通IO使用时无法正常输出高低电平如下配置无法正常运行GPIO_InitTypeDef GPIO_InitStructure;/* GPIO Periph clock enable */RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOF, ENABLE);    /* Configure IO in output pushpull mode */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT
发表于 2019-04-12
STM32F030应用常见问题

STM32F103 - ADC采集电压

        在使用STM32F103的ADC采集外部电压时,发现配置不同的采样周期ADC_SampleTime,外部输入阻抗的电压值不同,也就是影响了外部总电压分给ADC口的电压(电阻电压分配不对),但ADC能正常采集;      所以要根据STM32F103手册中的ADC采样周期与外部输入阻抗的关系表来确定软件设定的采样周期Ts和采样电阻RAIN大小。关系表如下所示:
发表于 2019-04-12
STM32F103 - ADC采集电压

STM32F103两种串口输出的方式

#include "stm32f10x.h"    #include "stm32f10x_rcc.h"    #include "stm32f10x_gpio.h"    #include "stm32f10x_usart.h"   #include "stm32f10x_crc.h"  #include "system_stm32f10x.h"   
发表于 2019-04-12

stm32f103串口实现重映射功能

在实际开发中,经常遇到串口的默认输出IO口被其他模块占用了,所以我们要用到串口IO口映射功能,是指将原来实现功能的IO口映射到其他指定IO口,其他不变。具体操作如下:先贴出默认下的串口初始化设置:void USART1Conf(u32 baudRate){ USART_InitTypeDef USART_InitSturct;//定义串口1的初始化结构体  GPIO_InitTypeDef GPIO_InitStruct;//定义串口对应管脚的结构体  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA , ENABLE
发表于 2019-04-12

小广播

何立民专栏

单片机及嵌入式宝典

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

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved