文档库 最新最全的文档下载
当前位置:文档库 › STM32时钟配置方法详解

STM32时钟配置方法详解

STM32时钟配置方法详解
STM32时钟配置方法详解

一、在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。

①HSI是高速内部时钟,RC振荡器,频率为8MHz。

②HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。

③LSI是低速内部时钟,RC振荡器,频率为40kHz。

④LSE是低速外部时钟,接频率为32.768kHz的石英晶体。

⑤PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。

二、在STM32上如果不使用外部晶振,OSC_IN和OSC_OUT的接法:如果使用内部RC振荡器而不使用外部晶振,请按照下面方法处理:

①对于100脚或144脚的产品,OSC_IN应接地,OSC_OUT应悬空。

②对于少于100脚的产品,有2种接法:第1种:OSC_IN和OSC_OUT分别通过10K电阻接地。此方法可提高EMC性能;第2种:分别重映射OSC_IN 和OSC_OUT至PD0和PD1,再配置PD0和PD1为推挽输出并输出'0'。此方法可以减小功耗并(相对上面)节省2个外部电阻。

三、用HSE时钟,程序设置时钟参数流程:

01、将RCC寄存器重新设置为默认值RCC_DeInit;

02、打开外部高速时钟晶振HSE RCC_HSEConfig(RCC_HSE_ON);

03、等待外部高速时钟晶振工

作HSEStartUpStatus = RCC_WaitForHSEStartUp();

04、设置AHB时钟RCC_HCLKConfig;

05、设置高速AHB时钟RCC_PCLK2Config;

06、设置低速速AHB时钟RCC_PCLK1Config;

07、设置PLL RCC_PLLConfig;

08、打开PLL RCC_PLLCmd(ENABLE);

09、等待PLL工

作while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)

10、设置系统时钟RCC_SYSCLKConfig;

11、判断是否PLL是系统时钟while(RCC_GetSYSCLKSource() != 0x08)

12、打开要使用的外设时

钟RCC_APB2PeriphClockCmd()/RCC_APB1PeriphClockCmd()

四、下面是STM32软件固件库的程序中对RCC的配置函数(使用外部8MHz晶振)

/*******************************************************************************

* Function Name : RCC_Configuration

* Description : RCC配置(使用外部8MHz晶振)

* Input : 无

* Output : 无

* Return : 无

*******************************************************************************/

void RCC_Configuration(void)

{

/*将外设RCC寄存器重设为缺省值*/

RCC_DeInit();

/*设置外部高速晶振(HSE)*/

RCC_HSEConfig(RCC_HSE_ON); //RCC_HSE_ON——HSE晶振打开(ON)

/*等待HSE起振*/

HSEStartUpStatus = RCC_WaitForHSEStartUp();

if(HSEStartUpStatus == SUCCESS) //SUCCESS:HSE晶振稳定且就绪 {

/*设置AHB时钟(HCLK)*/

RCC_HCLKConfig(RCC_SYSCLK_Div1); //RCC_SYSCLK_Div1——AHB 时钟= 系统时钟

/* 设置高速AHB时钟(PCLK2)*/

RCC_PCLK2Config(RCC_HCLK_Div1); //RCC_HCLK_Div1——APB2时钟= HCLK

/*设置低速AHB时钟(PCLK1)*/

RCC_PCLK1Config(RCC_HCLK_Div2); //RCC_HCLK_Div2——APB1时钟= HCLK / 2

/*设置FLASH存储器延时时钟周期数*/

FLASH_SetLatency(FLASH_Latency_2); //FLASH_Latency_2 2延时周

/*选择FLASH预取指缓存的模式*/

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); // 预取指缓存使能

/*设置PLL时钟源及倍频系数*/

RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

// PLL的输入时钟= HSE时钟频率;RCC_PLLMul_9——PLL输入时钟x 9

/*使能PLL */

RCC_PLLCmd(ENABLE);

/*检查指定的RCC标志位(PLL准备好标志)设置与否*/

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)

{

}

/*设置系统时钟(SYSCLK)*/

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

//RCC_SYSCLKSource_PLLCLK——选择PLL作为系统时钟

/* PLL返回用作系统时钟的时钟源*/

while(RCC_GetSYSCLKSource() != 0x08) //0x08:PLL作为系统时钟 {

}

}

/*使能或者失能APB2外设时钟*/

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph _GPIOB |

RCC_APB2Periph_GPIOC , ENABLE);

//RCC_APB2Periph_GPIOA GPIOA时钟

//RCC_APB2Periph_GPIOB GPIOB时钟

//RCC_APB2Periph_GPIOC GPIOC时钟

//RCC_APB2Periph_GPIOD GPIOD时钟

}

五、时钟频率

STM32F103内部8M的内部震荡,经过倍频后最高可以达到72M。目前TI的M3系列芯片最高频率可以达到80M。

在stm32固件库3.0中对时钟频率的选择进行了大大的简化,原先的一大堆操作都在后台进行。系统给出的函数为SystemInit()。但在调用前还需要进行一些宏定义的设置,具体的设置在system_stm32f10x.c文件中。

文件开头就有一个这样的定义:

//#define SYSCLK_FREQ_HSE HSE_Value

//#define SYSCLK_FREQ_20MHz 20000000

//#define SYSCLK_FREQ_36MHz 36000000

//#define SYSCLK_FREQ_48MHz 48000000

//#define SYSCLK_FREQ_56MHz 56000000

#define SYSCLK_FREQ_72MHz 72000000

ST 官方推荐的外接晶振是 8M,所以库函数的设置都是假定你的硬件已经接了 8M 晶振来运算的.以上东西就是默认晶振 8M 的时候,推荐的 CPU 频率选择.在这里选择了:

#define SYSCLK_FREQ_72MHz 72000000

也就是103系列能跑到的最大值72M

然后这个 C文件继续往下看

#elif defined SYSCLK_FREQ_72MHz

const uint32_t SystemFrequency = SYSCLK_FREQ_72MHz;

const uint32_t SystemFrequency_SysClk = SYSCLK_FREQ_72MHz;

const uint32_t SystemFrequency_AHBClk = SYSCLK_FREQ_72MHz;

const uint32_t SystemFrequency_APB1Clk = (SYSCLK_FREQ_72MHz/2);

const uint32_t SystemFrequency_APB2Clk = SYSCLK_FREQ_72MHz;

这就是在定义了CPU跑72M的时候,各个系统的速度了.他们分别是:硬件频率,系统时

钟,AHB总线频率,APB1总线频率,APB2总线频率.再往下看,看到这个了:

#elif defined SYSCLK_FREQ_72MHz

static void SetSysClockTo72(void);

这就是定义 72M 的时候,设置时钟的函数.这个函数被 SetSysClock ()函数调用,而SetSysClock ()函数则是被 SystemInit()函数调用.最后 SystemInit()函数,就是被你调用的了所以设置系统时钟的流程就是:

首先用户程序调用 SystemInit()函数,这是一个库函数,然后 SystemInit()函数里面,进行了一些寄存器必要的初始化后,就调用 SetSysClock()函数. SetSysClock()函数根据那个#define SYSCLK_FREQ_72MHz 72000000 的宏定义,知道了要调用SetSysClockTo72()这个函数,于是,就一堆麻烦而复杂的设置~!@#$%^然后,CPU跑起来了,而且速度是 72M. 虽然说的有点累赘,但大家只需要知道,用户要设置频率,程序中就做的就两个事情:

第一个: system_stm32f10x.c 中 #define SYSCLK_FREQ_72MHz 72000000

第二个:调用SystemInit()

更多

stm32:系统时钟

实验4 系统时钟实验 上一章,我们介绍了STM32 内部系统滴答定时器,该滴答定时器产生的延时非常精确。在本章中,我们将自定义RCC系统时钟,通过改变其倍频与分频实现延时时间变化,实现LED灯闪烁效果。通过本章的学习,你将了解 RCC系统时钟的使用。本章分为以下学习目标: 1、了解 STM32 的系统构架。 2、了解 STM32 的时钟构架。 3、了解 RCC 时钟的操作步骤。 1.1 STM32 的系统构架 STM32 的时钟比较复杂,它可以选择多种时钟源,也可以选择不一样的时钟频率,而且在系统总线上面,每条系统的时钟选择都是有差异的。所以想要清楚的了解 STM32 的时钟分配,我们先来了解一下 STM32 的系统构架是什么样的。 从上图我们知道,RCC 时钟输出时钟出来,然后经过 AHB 系统总线,分别

分配给其他外设时钟,而不一样的外设,是先挂在不一样的桥上的。比如: ADC1、ADC2、 SPI1、GPIO 等都是挂在 APB2 上面,而有些是挂在 APB1上面,所以,虽然它们都是从 RCC 获取的时钟,但是它们的频率有时候是不一样的。 1.2 STM32 的时钟树 STM32 单片机上电之后,系统默认是用的时钟是单片机内部的高速晶振时钟,而这个晶振容易受到温度的影响,所以晶振跳动的时候不是有一定的影响,所以一般开发使用的时候都是使用外部晶振,而且单片机刚启动的时候,它的时钟频率是 8MHZ,而 STM32 时钟的最高频率是 72MHZ,所以单片机一般开机之后运行的程序是切换时钟来源,并设置时钟频率。大家可能有点疑惑,在第一章到第三章之中,我们并没有看到单片机开机之后设置时钟来源和时钟频率的。其实在使用库函数的时候,其实在库函数启动文件里面,是帮助我们把时钟频率设置到 72MHZ 了。大家可以打开一个库函数工程,在 system_stm32f10x.c 的第 106行,它定义了一个 SYSCLK_FREQ_72MHz: #if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL) /* #define SYSCLK_FREQ_HSE HSE_VALUE */ #define SYSCLK_FREQ_24MHz 24000000 #else #define SYSCLK_FREQ_72MHz 72000000 然后在下面的程序中,根据这个 SYSCLK_FREQ_72MHz 定义,它默认设置成 72MHZ。接下来我们来看一下具体的 RCC 时钟树:

stm32时钟详细说明

在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。其实是四个时钟源,如下图所示(灰蓝色),PLL是由锁相环电路倍频得到PLL时钟。 ①、HSI是高速内部时钟,RC振荡器,频率为8MHz。 ②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。 ③、LSI是低速内部时钟,RC振荡器,频率为40kHz。 ④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。 ⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。 其中40kHz的LSI供独立看门狗IWDG使用,另外它还可以被选择为实时时钟RTC的时钟源。另外,实时时钟RTC的时钟源还可以选择LSE,或者是HSE的128分频。RTC的时钟源通过RTCSEL[1:0]来选择。 STM32中有一个全速功能的USB模块,其串行接口引擎需要一个频率为48MHz的时钟源。该时钟源只能从PLL输出端获取,可以选择为1.5分频或者1分频,也就是,当需要使用USB模块时,PLL必须使能,并且时钟频率配置为48MHz或72MHz。 另外,STM32还可以选择一个时钟信号输出到MCO脚(PA8)上,可以选择为PLL输出的2分频、HSI、HSE、或者系统时钟。 系统时钟SYSCLK,它是供STM32中绝大部分部件工作的时钟源。系统时钟可选择为PLL输出、HSI或者HSE。系统时钟最大频率为72MHz,它通过AHB分频器分频后送给各模块使用,AHB分频器可选择1、2、 4、8、16、64、128、256、512分频。其中AHB分频器输出的时钟送给5大模块使用: ①、送给AHB总线、内核、内存和DMA使用的HCLK时钟。 ②、通过8分频后送给Cortex的系统定时器时钟。 ③、直接送给Cortex的空闲运行时钟FCLK。 ④、送给APB1分频器。APB1分频器可选择1、2、4、8、16分频,其输出一路供APB1外设使用(PCLK1,最大频率36MHz),另一路送给定时器(Timer)2、3、4倍频器使用。该倍频器可选择1或者2倍频,时钟输出供定时器2、3、4使用。 ⑤、送给APB2分频器。APB2分频器可选择1、2、4、8、16分频,其输出一路供APB2外设使用(PCLK2,最大频率72MHz),另一路送给定时器(Timer)1倍频器使用。该倍频器可选择1或者2倍频,时钟输出供定时器1使用。另外,APB2分频器还有一路输出供ADC分频器使用,分频后送给ADC模块使用。ADC分频器可选择为2、4、6、8分频。

stm32系统时钟配置问题

stm32系统时钟配置问题 系统从上电复位到72mz 配置好之前,提供时钟的是内如高速rc 振荡器提 供8MZ 的频率,这个由下面void SystemInit (void)函数的前面的一部分代码来 完成的和保证的:RCC->CR |= (uint32_t)0x00000001; #ifndef STM32F10X_CLRCC->CFGR &= (uint32_t)0xF8FF0000;#elseRCC- >CFGR &= (uint32_t)0xF0FF0000;#endif RCC->CR &= (uint32_t)0xFEF6FFFF; RCC->CR &= (uint32_t)0xFFFBFFFF; RCC->CFGR &= (uint32_t)0xFF80FFFF; #ifdef STM32F10X_CLRCC->CR &= (uint32_t)0xEBFFFFFF; RCC->CIR = 0x00FF0000; RCC->CFGR2 = 0x00000000;#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)RCC->CIR = 0x009F0000; RCC->CFGR2 = 0x00000000;#elseRCC->CIR = 0x009F0000;#endif#if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL)#ifdef DATA_IN_ExtSRAMSystemInit_ExtMemCtl();#endif#endif 接着void SystemInit (void)调用SetSysClock();函数,将系统时钟配置到 72m,将AHB,APB1,APB2 等外设之前的时钟都配置好,然后切换到72mz 下 运行。所以在使用哪个外设的时候,只需要使能相应的外设时钟就可以了 tips:感谢大家的阅读,本文由我司收集整编。仅供参阅!

STM32时钟初始化函数SysInit详解

花了一天的时间,总算是了解了SystemInit()函数实现了哪些功能,初学STM32,,现记录如下(有理解错误的地方还请大侠指出):使用的是3.5的库,用的是STM32F107VC,开发环境RVMDK4.23 我已经定义了STM32F10X_CL,SYSCLK_FREQ_72MHz 函数调用顺序: startup_stm32f10x_cl.s(启动文件)→SystemInit() → SetSysClock () →SetSysClockTo72() 初始化时钟用到的RCC寄存器复位值: RCC_CR = 0x0000 xx83; RCC_CFGR = 0x0000 0000;RCC_CIR = 0x0000 0000; RCC_CFGR2 = 0x0000 0000; SystemInit() 在调用SetSysClock()之前RCC寄存器的值如下(都是一些与运算,或运算,在此就不赘述了): RCC->CR = 0x0000 0083; RCC->CIR = 0x00FF0000; RCC->CFGR2 = 0x00000000;至于这些寄存器都代表着什么意思,详见芯片资料RCC寄存器,该文重点不在此处;SetSysClock()函数如下: static void SetSysClock(void) { #ifdef SYSCLK_FREQ_HSE SetSysClockToHSE(); #elif defined SYSCLK_FREQ_24MHz SetSysClockTo24(); #elif defined SYSCLK_FREQ_36MHz SetSysClockTo36(); #elif defined SYSCLK_FREQ_48MHz SetSysClockTo48(); #elif defined SYSCLK_FREQ_56MHz SetSysClockTo56(); #elif defined SYSCLK_FREQ_72MHz//我的定义的是SYSCLK_FREQ_72MHz,所以调用SetSysClockTo72() SetSysClockTo72(); #endif } SetSysClockTo72()函数如下: static void SetSysClockTo72(void) { __IO uint32_t StartUpCounter = 0, HSEStatus = 0; /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/ /* Enable HSE */ RCC->CR |= ((uint32_t)RCC_CR_HSEON); /* Wait till HSE is ready and if Time out is reached exit */ do

STM32学习笔记(3):系统时钟和SysTick定时器

STM32学习笔记(3):系统时钟和SysTick定时器 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为锁相环倍频输出,严格的来说并不算一个独立的时钟源,PLL 的输入可以接HSI/2、HSE或者HSE/2。倍频可选择为2 – 16倍,但 是其输出频率最大不得超过72MHz。 其中,40kHz的LSI供独立看门狗IWDG使用,另外它还可以被选择为实时时钟RTC的时钟源。另外,实时时钟RTC的时钟源还可以选择LSE,或者是HSE的128分频。 STM32中有一个全速功能的USB模块,其串行接口引擎需要一个频率为 48MHz的时钟源。该时钟源只能从PLL端获取,可以选择为1.5分频或者1分频,也就是,当需使用到USB模块时,PLL必须使能,并且时钟配置为48MHz 或72MHz。 另外STM32还可以选择一个时钟信号输出到MCO脚(PA.8)上,可以选择为PLL输出的2分频、HSI、HSE或者系统时钟。 系统时钟SYSCLK,它是提供STM32中绝大部分部件工作的时钟源。系统时钟可以选择为PLL输出、HSI、HSE。系系统时钟最大频率为72MHz,它通过AHB分频器分频后送给各个模块使用,AHB分频器可以选择1、2、4、8、16、64、128、256、512分频,其分频器输出的时钟送给5大模块使用: (1)送给AHB总线、内核、内存和DMA使用的HCLK时钟; (2)通过8分频后送给Cortex的系统定时器时钟; (3)直接送给Cortex的空闲运行时钟FCLK; (4)送给APB1分频器。APB1分频器可以选择1、2、4、8、16分频,其输出一路供APB1外设使用(PCLK1,最大频率36MHz),另一

stm32如何配置时钟

学习STM32笔记2 如何配置时钟 学习STM32笔记2 如何配置时钟 /************************************************************* 该程序目的是用于测试核心板回来后是否能正常工作。包括 两个按键、两个LED现实。按键为PC4、PC5,LED为PA0\PA1。LED为 低电平时点亮。按键为低电平时触发。 ************************************************************/ #i nclude "stm32f10x_lib.h" void RCC_Configuration(void);//设置系统主时钟 void GPIO_Configuration(void);//设置邋邋IO参数 void NVIC_Configuration(void);//设置中断表地址 void delay(void);//延时函数 int main(void) { #ifdef DEBUG debug(); #endifRCC_Configuration(); NVIC_Configuration(); GPIO_Configuration(); while (1) { delay(); //设置指定的数据端口位 GPIO_SetBits(GPIOA,GPIO_Pin_0); //设置指定的数据端口位 delay(); GPIO_ResetBits(GPIOA,GPIO_Pin_0); //清除指定的数据端口位 GPIO_SetBits(GPIOA,GPIO_Pin_1); delay(); GPIO_ResetBits(GPIOA,GPIO_Pin_1); delay(); /********************************************* 使用setbits 与resetbits 是比较简单,其实还是可以使用 其它函数。例如可以使用GPIO_WriteBit GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_SET); GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_RESET);对于好像流水灯呀这些一个整段IO,可以使用GPIO_Write(GPIOA, 0x1101); *********************************************/

stm32f030时钟配置工具AN4055

May 2012Doc ID 022837 Rev 11/17 AN4055 Application note Clock configuration tool for STM32F0xx microcontrollers Introduction This application note presents the clock system configuration tool for the STM32F0xx microcontroller family. The purpose of this tool is to help the user configure the microcontroller clocks, taking into consideration product parameters such as power supply and Flash access mode. The configuration tool is implemented in the “STM32F0xx_Clock_Configuration_VX.Y .Z.xls” file which is supplied with the STM32F0xx Standard Peripherals Library and can be downloaded from https://www.wendangku.net/doc/9515597839.html, . This tool supports the following functionalities for the STM32F0xx: ● Configuration of the system clock, HCLK source and output frequency ● Configuration of the Flash latency (number of wait states depending on the HCLK frequency)● Setting of the PCLK1, PCLK2, TIMCLK (timer clocks) and I2SCLK frequencies ●Generation of a ready-to-use system_stm32f0xx.c file with all the above settings (STM32F0xx CMSIS Cortex-M0 Device Peripheral Access Layer System Source File)The STM32F0xx_Clock_Configuration_VX.Y .Z.xls is referred to as “clock tool” throughout this document. Before using the clock tool, it is essential to read the STM32F0xx microcontroller reference manual (RM0091). This application note is not a substitute for the reference manual.This tool supports only the STM32F0xx devices. For VX.Y .Z, please refer to the tool version, example V1.0.0 https://www.wendangku.net/doc/9515597839.html,

05_STM32F4通用定时器详细讲解

STM32F4系列共有14个定时器,功能很强大。14个定时器分别为: 2个高级定时器:Timer1和Timer8 10个通用定时器:Timer2~timer5 和 timer9~timer14 2个基本定时器: timer6和timer7 本篇欲以通用定时器timer3为例,详细介绍定时器的各个方面,并对其PWM 功能做彻底的探讨。 Timer3是一个16位的定时器,有四个独立通道,分别对应着PA6 PA7 PB0 PB1 主要功能是:1输入捕获——测量脉冲长度。 2 输出波形——PWM 输出和单脉冲输出。 Timer3有4个时钟源: 1:内部时钟(CK_INT ),来自RCC 的TIMxCLK 2:外部时钟模式1:外部输入TI1FP1与TI2FP2 3:外部时钟模式2:外部触发输入TIMx_ETR ,仅适用于TIM2、TIM3、TIM4,TIM3,对应 着PD2引脚 4:内部触发输入:一个定时器触发另一个定时器。 时钟源可以通过TIMx_SMCR 相关位进行设置。这里我们使用内部时钟。 定时器挂在高速外设时钟APB1或低速外设时钟APB2上,时钟不超过内部高速时钟HCLK ,故当APBx_Prescaler 不为1时,定时器时钟为其2倍,当为1时,为了不超过HCLK ,定时器时钟等于HCLK 。 例如:我们一般配置系统时钟SYSCLK 为168MHz ,内部高速时钟 AHB=168Mhz ,APB1欲分频为4,(因为APB1最高时钟为42Mhz ),那么挂在APB1总线上的timer3时钟为84Mhz 。 《STM32F4xx 中文参考手册》的424~443页列出与通用定时器相关的寄存器一共20个, 以下列出与Timer3相关的寄存器及重要寄存器的简单介绍。 1 TIM3 控制寄存器 1 (TIM3_CR1) 作用:1使能自动重载TIM3_ARR 2定时器的计数器递增或递减计数。 3 事件更新。 4 计数器使能 2 TIM 3 控制寄存器 2 (TIM3_CR2) 3 TIM3 从模式控制寄存器 (TIM3_SMCR) 4 TIM3 DMA/中断使能寄存器 (TIM3_DIER) SYSCLK(最高 AHB_Prescaler APBx_Prescaler

stm32时钟树分析

void RCC_Configuration(void) { /* RCC system reset(for debug purpose) */ RCC_DeInit(); /* Enable HSE */ RCC_HSEConfig(RCC_HSE_ON);

/* Wait till HSE is ready */ HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus == SUCCESS) { /* Enable Prefetch Buffer */ FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); /* Flash 2 wait state */ FLASH_SetLatency(FLASH_Latency_2); /* HCLK = SYSCLK */ RCC_HCLKConfig(RCC_SYSCLK_Div1); /* PCLK2 = HCLK */ RCC_PCLK2Config(RCC_HCLK_Div1); /* PCLK1 = HCLK/2 */ RCC_PCLK1Config(RCC_HCLK_Div2); /* PLLCLK = 8MHz * 9 = 72 MHz */ RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); /* Enable PLL */ RCC_PLLCmd(ENABLE); /* Wait till PLL is ready */ while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) { } /* Select PLL as system clock source */ RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /* Wait till PLL is used as system clock source */ while(RCC_GetSYSCLKSource() != 0x08) { } } }

STM32时钟系统与软件配置

STM32时钟系统与软件配置 在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。 ①HSI是高速内部时钟,RC振荡器,频率为8MHz。 ②HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。 ③LSI是低速内部时钟,RC振荡器,频率为40kHz。 ④LSE是低速外部时钟,接频率为32.768kHz的石英晶体。 ⑤PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。

在STM32上如果不使用外部晶振,OSC_IN和OSC_OUT的接法 如果使用内部RC振荡器而不使用外部晶振,请按照下面方法处理: 1)对于100脚或144脚的产品,OSC_IN应接地,OSC_OUT应悬空。 2)对于少于100脚的产品,有2种接法: 2.1)OSC_IN和OSC_OUT分别通过10K电阻接地。此方法可提高EMC性能。 2.2)分别重映射OSC_IN和OSC_OUT至PD0和PD1,再配置PD0和PD1为推挽输出并输出'0'。此方法可以减小功耗并(相对上面2.1)节省2个外部电阻。 使用HSE时钟,程序设置时钟参数流程: 1、将RCC寄存器重新设置为默认值RCC_DeInit; 2、打开外部高速时钟晶振HSE RCC_HSEConfig(RCC_HSE_ON); 3、等待外部高速时钟晶振工作 HSEStartUpStatus = RCC_WaitForHSEStartUp(); 4、设置AHB时钟RCC_HCLKConfig; 5、设置高速AHB时钟RCC_PCLK2Config; 6、设置低速速AHB时钟RCC_PCLK1Config;

基于STM32的TFT指针式时钟

基于STM32的TFT指针式时钟 摘要 自时钟发明的那天起,它就注定了与人们有着密不可分的关系,但科学技术在不断发展,人们随着时间的推移对时间计量的精度要求越来越高,机械式时钟也越来越满足不了人们日益增高的要求了。取而代之的事具有高度准确性和直观性且无机械装置,使用寿命更长更长等优点的电子时钟。电子时钟更具人性化,更能提高人们的生活质量,更受人们欢迎,机械时代已经远去,电子时代已经到来。因此本设计是基于意法半导体公司(ST)的STM32开发平台实现一种高精度,智能化的指针式时钟系统,采用STM32内部RTC设计电子时钟时,通常是数字显示,这是由于选用数码管和1602等器件的显示能力有限。而12864是基于点阵式的液晶屏,其像素点为128×64,但12864自身像素较低,使其显示指针式时钟效果远低于2.2寸TFT-LCD液晶,但两者所基于的原理相同。因此本设计采用STM32为控制核心,2.2寸TFT-LCD液晶作为显示芯片,构成了一个指针式电子时钟。 关键词:STM32;RTC;TFT-LCD

第1章绪论 1.1 引言 随着科学技术的发展和电子技术产业结构调整,单片机开始迅速发展,由于家用电器逐渐普及,市场对于智能时钟控制系统的需求也越来越大。单片机以其芯片集成度高、处理功能强、可靠性高等优点,成功应用于工业自动化、智能仪器仪表、家电产品等领域。 近些年,人们对数字钟的要求也越来越高,传统的时钟已不能满足人们的需求。多功能数字钟不管在性能还是在样式上都发生了质的变化,有电子闹钟、数字闹钟等等。而目前,对于指针式时钟来说,所用的指针大多是靠机械装置驱动达到显示时间的目的,例如手表,挂钟,钟楼等等,单片机在指针式时钟中的应用也已经非常普遍的,人们对指针时钟的功能及工作顺序都非常熟悉。但是却很少知道它的内部结构以及工作原理。由单片机作为指针时钟的核心控制器,可以通过它的时钟信号进行计时实现计时功能,将其时间数据经单片机输出,利用显示器显示出来。输出设备显示器可以用液晶显示技术。 1.2 本设计的目的和意义 1.2.1 设计目的 (1)巩固,加深和扩大STM32应用的知识面,提高综合及灵活运用所学知识解决工业控制的能力; (2)培养针对课题需要,选择和查阅有关手册,图表及文献资料的自学能力,提高组成系统,编程,调试的动手能力; (3)对课题设计方案的分析、选择、比较,熟悉用STM32做系统开发,研制的过程,软硬件设计的方法,内容及步骤; (4)进一步掌握C语言在硬件编程中的应用,熟悉怎样用C语言实现TFT-LCD上的绘图功能; (5)掌握STM32内部RTC的原理和应用。 1.2.2设计意义 数字指针式时钟是采用数字电路实现对时,分,秒,星期,年,月,日等数字以及指针表盘显示的计时装置,广泛用于个人家庭,车站, 码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表, 钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,

STM32滴答时钟

关于STM32 滴答时钟 相信不论是初学者还是高手,都会被STM32的滴答时钟所吸引。STM32有很多计数器,也有很多计数器中断。当别人还在用计数器做定时扫描的时候,我们就默默的开始了滴答时钟做扫描了。让他们去任意的浪费资源吧,我们节约资源,把计数器发挥更大的作用。 Systick定时器属于cortex内核部件,在芯片介绍的datasheet中没有提到过,可以参考 《CortexM3权威指南》或《STM32xxx-Cortex编程手册》。 首先来看Systick的时钟来源,如图一。可以看出在STM32中Systick以HCLK(AHB 时钟)或HCLK/8作为运行时钟。 图1 另外要注意Systick是一个24位的定时器,即一次最多可以计数224个时钟脉冲,这个脉冲计数值被保存到当前计数值寄存器STK_VAL中,这个计数器只能向下计数,每接收到一个时钟脉冲STK_VAL的值就向下减1,直至0,当STK_VAL的值被减至0时,由硬件自动把重载寄存器STK_LOAD中保存的数据加载到STK_VAL,意思就是它会自动重装。当STK_VAL 的值被倒计至0时,触发中断,就可以在中断服务函数中处理定时事件了。 要让Systick正常工作,必须要对Systick进行配置。它的配置很简单,只有三个控制位和一个标志位,都位于寄存器STK_CRL中,见图二。

图二 ENABLE: 为Systick timer的使能位,此位为1的时候开始计数,为0则关闭Systick timer。 TICKINT: 为中断触发使能位,此位为1的时候并且STK_VAL倒计至0的时候会触发Systick 中断,此位为0的时候不触发中断。 CLKSOURCE: 为Systick的时钟选择位,此位为1的时候Systick的时钟为AHB时钟,此位为0 的时候Systick的时钟为AHB/8(AHB的8分频)。 COUNTFLAG: 为Systick的标志位,当STK_VAL倒计至0,此标志位会被置1。 现在我们不会再为滴答时钟而感到迷惑了吧! 下面将详细描述如何去设置计数器,我们在很多地方看到这样一个函数: SysTick_Config(SystemCoreClock / 1000) 配置为1ms中断一次 SysTick_Config(SystemCoreClock / 100000) 配置为10us中断一次 SysTick_Config(SystemCoreClock / 1000000) 配置为10us中断一次 我们将细说一下,SystemCoreClock/100000 为什么是10us 我们从图1时钟数可以看出Systick的时钟和AHB有关,从图2中了解到滴答时钟可设置,结合两处就能看明白。若不去设置,系统默认为AHB时钟,即72MHz。 系统文件中可查找出以下描述: /************************************************************************** ***** * Clock Definitions *************************************************************************** ****/ #ifdef SYSCLK_FREQ_HSE uint32_t SystemCoreClock = SYSCLK_FREQ_HSE; /*!< System Clock Frequency (Core Clock) */ #elif defined SYSCLK_FREQ_24MHz uint32_t SystemCoreClock = SYSCLK_FREQ_24MHz; /*!< System Clock Frequency (Core Clock) */ #elif defined SYSCLK_FREQ_36MHz uint32_t SystemCoreClock = SYSCLK_FREQ_36MHz; /*!< System

STM32F103RC系统时钟配置

地址:安徽省、合肥市、肥东县、店埠镇,合肥市福来德电子科技有限公司 STM32F103RC 系统时钟配置 1、打开D:\program\KEL_MDT_ARM\STM32_Template\USER 目录,找到STM32-DEMO 文件,双击打开,KEIL-uVision4就开始运行了,得到下图: 2、双击“STARTCODE ”下面的“start_stm32f10x_hd.s ”打开STM32F103RC 的启动文件,找“SystemInit ”,得到下图:

地址:安徽省、合肥市、肥东县、店埠镇,合肥市福来德电子科技有限公司3、点击当前的行,右击鼠标,将光标移动到“Go To Definition Of SystemInit”,见下图: 4、点击“Go To Definition Of SystemInit ”,会跳转到system_stm32f10x.c 文件,见下图:

地址:安徽省、合肥市、肥东县、店埠镇,合肥市福来德电子科技有限公司5、在“system_stm32f10x.c ”文件中,在“void SystemInit (void)”函数体内找到“SetSysClock();”,见下图: 6、点击“SetSysClock()”,右击鼠标,将光标移动到“Go To Definition Of SystemClock”,见下图:

地址:安徽省、合肥市、肥东县、店埠镇,合肥市福来德电子科技有限公司 7、点击“Go To Definition Of SystemClock”,会跳转到system_stm32f10x.c 文件,见下图: 8、点击“defined SYSCLK_FREQ_72MHz ”,右击鼠标,将光标移到到“Go To Definition Of SYSCLK_FREQ_72MHz ”,见下图:

图文详解stm32时钟树

对于广大初次接触STM32的读者朋友(甚至是初次接触ARM器件的读者朋友)来说,在熟悉了开发环境的使用之后,往往“栽倒”在同一个问题上。这问题有个关键字叫:时钟树。 众所周知,微控制器(处理器)的运行必须要依赖周期性的时钟脉冲来驱动——往往由一个外部晶体振荡器提供时钟输入为始,最终转换为多个外部设备的周期性运作为末,这种时钟“能量”扩散流动的路径,犹如大树的养分通过主干流向各个分支,因此常称之为“时钟树”。在一些传统的低端8位单片机诸如51,AVR,PIC等单片机,其也具备自身的一个时钟树系统,但其中的绝大部分是不受用户控制的,亦即在单片机上电后,时钟树就固定在某种不可更改的状态(假设单片机处于正常工作的状态)。比如51单片机使用典型的12MHz晶振作为时钟源,则外设如IO口、定时器、串口等设备的驱动时钟速率便已经是固定的,用户无法将此时钟速率更改,除非更换晶振。 而STM32微控制器的时钟树则是可配置的,其时钟输入源与最终达到外设处的时钟速率不再有固定的关系,本文将来详细解析STM32微控制器的时钟树。

图1是STM32微控制器的时钟树,表1是图中各个标号所表示的部件。 标号图1标号释义 1 内部低速振荡器(LSI,40Khz) 2 外部低速振荡器(LSE,32.768Khz) 3 外部高速振荡器(HSE,3-25MHz) 4 内部高速振荡器(HIS,8MHz) 5 PLL输入选择位 6 RTC时钟选择位 7 PLL1分频数寄存器 8 PLL1倍频寄存器 9 系统时钟选择位 10 USB分频寄存器 11 AHB分频寄存器 12 APB1分频寄存器 13 AHB总线 14 APB1外设总线 15 APB2分频寄存器 16 APB2外设总线 17 ADC预分频寄存器 18 ADC外设 19 PLL2分频数寄存器 20 PLL2倍频寄存器 21 PLL时钟源选择寄存器 22 独立看门狗设备 23 RTC设备 图1 STM32的时钟树 在认识这颗时钟树之前,首先要明确“主干”和最终的“分支”。假设使用外部8MHz 晶振作为STM32的时钟输入源(这也是最常见的一种做法),则这个8MHz便是“主干”,而“分支”很显然是最终的外部设备比如通用输入输出设备(GPIO)。这样可以轻易找出第一条时钟的“脉络”:3——5——7——21——8——9——11——13 对此条时钟路径做如下解析: 对于3,首先是外部的3-25MHz(前文已假设为8MHz)输入; 对于5,通过PLL选择位预先选择后续PLL分支的输入时钟(假设选择外部晶振); 对于7,设置外部晶振的分频数(假设1分频); 对于21,选择PLL倍频的时钟源(假设选择经过分频后的外部晶振时钟); 对于8,设置PLL倍频数(假设9倍频); 对于9,选择系统时钟源(假设选择经过PLL倍频所输出的时钟); 对于11,设置AHB总线分频数(假设1分频); 对于13,时钟到达AHB总线; 在上一章节中所介绍的GPIO外设属于APB2设备,即GPIO的时钟来源于APB2总线,同样在图1中也可以寻获GPIO外设的时钟轨迹:

STM32系统时钟配置

STM32系统时钟配置 STM32 在使用不同时钟晶振时,需要对系统时钟进行配置。下面以16MHz晶振产生72MHz时钟为例进行说明。 由于STM32可进行整数倍倍频,及可选是否2分频。因而选用16MHz 晶振时,先2分频,再倍频9倍,即可倍频为72MHz。 ①查找SystemInit() 函数,即系统时钟设置: 图1

②进入 SetSysClockTo72() 函数,如果要设置其他频率,进入对应的频率即可,如SetSysClockTo48()。 ③参考 STM32中文参考手册的6.3.2时钟配置寄存器(RCC_CFGR)。如“位17PLLXTPRE ” 所述: HSE分频器作为PLL输入(HSE divider for PLL entry) 由软件置’1’或清’0’来分频HSE后作为PLL输入时钟。只能在关闭PLL时 才能写入此位。 0:HSE不分频 1:HSE 2分频 因而,RCC_CFGR 寄存器的位17 应置“1”。 ④如图2红色框中所示, RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL)); RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL9|RCC_CFGR_PLLXTPRE); 添加红色字部分即可完成2分频,则可将16MHz的时钟分频为 8MHz。其实,查找RCC_CFGR_PLLXTPRE宏定义可知: #define RCC_CFGR_PLLXTPRE ((uint32_t)0x00020000) 实际上就是将位 17置1。 而RCC_CFGR_PLLMULL9中的9即是倍频倍数。(8*9=72 MHz)

STM32时钟设置浅析

STM32时钟浅析 时钟设置是所有单片机编程首先要解决的问题,只有时钟理解正确了,以后的编程才会让程序达到事半功倍的效果,尤其是对于定时,通信的设置是极为重要的。我在这里以个人之见,来理解void SystemInit (void) 函数的时钟设置问题,它的原函数是这样写的: void SystemInit (void) { /*以下语句都是对RCC_RC、RCC_CFGR和RCC_CIR寄存器给予赋值,配置相应位*/ /*!< RCC system reset(for debug purpose) */ /*!< Set HSION bit 复位值是83H 内部8M*/ RCC->CR |= (uint32_t)0x00000001;//RCC_RC=0x00000001,时钟中断寄存器使能/*!< Reset SW[1:0], HPRE[3:0], PPRE1[2:0], PPRE2[2:0], ADCPRE[1:0] and MCO[2:0] bits */ RCC->CFGR &= (uint32_t)0xF8FF0000;//时钟配置寄存器RCC_CFGR=0x****0000; /*!< Reset HSEON, CSSON and PLLON bits */ RCC->CR &= (uint32_t)0xFEF6FFFF; /*!< Reset HSEBYP bit */ RCC->CR &= (uint32_t)0xFFFBFFFF; /*!< Reset PLLSRC, PLLXTPRE, PLLMUL[3:0] and USBPRE bits */ RCC->CFGR &= (uint32_t)0xFF80FFFF; /*!< Disable all interrupts */ RCC->CIR = 0x00000000; //时钟中断寄存器RCC_CIR=0; /*!< Configure the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers */ /*!< Configure the Flash Latency cycles and enable prefetch buffer */ SetSysClock(); } RCC->CR |= (uint32_t)0x00000001; 就是时钟控制寄存器RCC_RC=0x00000001, 查询STM32F10XX手册可以得到如图所示: 可以看出该语句就是使RSION=1,也就是

STM32 时钟详解及范例

一、综述: 1、时钟源 在STM32 中,一共有5 个时钟源,分别是HSI 、HSE 、LSI 、LSE 、PLL 。 ①HSI 是高速内部时钟,RC 振荡器,频率为8MHz ; ②HSE 是高速外部时钟,可接石英/ 陶瓷谐振器,或者接外部时钟源,频率范围是4MHz –16MHz ; ③LSI 是低速内部时钟,RC 振荡器,频率为40KHz ; ④LSE 是低速外部时钟,接频率为32.768KHz的石英晶体; ⑤PLL 为锁相环倍频输出,严格的来说并不算一个独立的时钟源,PLL 的输入可以接HSI/2 、HSE 或者HSE/2 。PLL倍频可选择为2– 16 倍,但是其输出频率最大不得超过72MHz 。 其中,40kHz 的LSI 供独立看门狗IWDG 使用,另外它还可以被选择为实时时钟RTC 的时钟源。另外,实时时钟RTC 的时钟源还可以选择LSE ,或者是HSE 的128 分频。 STM32 中有一个全速功能的USB 模块,其串行接口引擎需要一个频率为48MHz 的时钟源。该时钟源只能从PLL 端获取,可以选择为 1.5 分频或者1分频,也就是,当需使用到USB 模块时,PLL 必须使能,并且时钟配置为48MHz 或72MHz 。 另外STM32 还可以选择一个时钟信号输出到MCO 脚(PA.8) 上,可以选择为PLL 输出的2分频、HSI 、HSE 或者系统时钟。 系统时钟SYSCLK ,它是提供STM32 中绝大部分部件工作的时钟源。系统时钟可以选择为PLL 输出、HSI 、HSE 。系系统时钟最大频率为72MHz ,它通过AHB 分频器分频后送给各个模块使用,AHB 分频器可以选择 1 、2 、4 、8 、16 、64 、128 、256 、512 分频,AHB分频器输出的时钟送给5大模块使用: ①送给AHB 总线、内核、内存和DMA 使用的HCLK 时钟; ②通过8分频后送给Cortex 的系统定时器时钟STCLK; ③直接送给Cortex 的空闲运行时钟FCLK ; ④送给APB1 分频器。APB1 分频器可以选择1 、2 、4 、8 、16 分频,其输出一路供APB1 外设使用(PCLK1 ,最大频率36MHz ),另一路送给定时器(Timer)2 、3 、4 倍频器使用。该倍频器根据PCLK1的分频值自动选择1或者2倍频,时钟输出供定时器2、3、4使用。 ⑤送给APB2 分频器。APB2 分频器可以选择1 、2 、4 、8 、16 分频,其输出一路供APB2 外设使用(PCLK2 ,最大频率72MHz ),另外一路送给定时器(Timer)1 倍频使用。该倍频器根据PCLK2的分频值自动选择1 或2 倍频,时钟输出供定时器1使用。另外APB2 分频器还有一路输出供ADC 分频器使用,分频后送给ADC 模块使用。ADC 分频器可选择为 2 、4 、6 、8 分频。 需要注意的是定时器的倍频器,当APB 的分频为1 时,它的倍频值为1 ,否则它的倍频值就为2 。file:///C:/DOCUME~1/LU/LOCALS~1/Temp/msohtml1/01/clip_image002.jpg 2、APB1和APB2连接的模块 ①连接在APB1( 低速外设)上的设备有:电源接口、备份接口、CAN 、USB 、I2C1 、I2C2 、UART2 、UART3 、SPI2 、窗口看门狗、Timer2 、Timer3 、Timer4 。注意USB 模块虽然需要一个单独的48MHz 的时钟信号,但是它应该不是供USB 模块工作的时钟,而只是提供给串行接口引擎(SIE) 使用的时钟。USB 模块的工作时钟应该是由APB1 提供的。 ②连接在APB2 (高速外设)上的设备有:UART1 、SPI1 、Timer1 、ADC1 、ADC2 、GPIOx(PA~PE) 、第二功能IO 口。 file:///C:/DOCUME~1/LU/LOCALS~1/Temp/msohtml1/01/clip_image004.jpg 二、寄存器介绍: typedefstruct { __IO uint32_t CR;

相关文档