第6章 复位与时钟控制_第1页
第6章 复位与时钟控制_第2页
第6章 复位与时钟控制_第3页
第6章 复位与时钟控制_第4页
第6章 复位与时钟控制_第5页
已阅读5页,还剩27页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第6章复位与时钟控制目录1复位2时钟控制3SysTick定时器4实战任务6-1:代码分析(1)5实战任务6-2:代码分析(2)6实战任务6-3:设置系统时钟7实战任务6-4:利用SysTick实现精准延时6.1复位STM32F10x系列支持三种复位形式系统复位电源复位备份域复位。

除了时钟控制器的控制状态寄存器RCC_CSR中的复位标志位外,系统复位将所有寄存器设置为复位值。当发生以下任一事件时,产生一个系统复位:外部复位WWDG复位IWDG复位SW复位低功耗管理复位系统复位电源复位设置所有寄存器初始值,除了备份域。当以下事件之一发生时,产生电源复位:上电/掉电复位(POR/PDRreset)从待机模式(StandBy)中返回电源复位备份域复位仅影响备份区域。当以下事件之一发生时,产生备份域复位:软件复位,可由设置备份域控制寄存器(RCC_BDCR)控制。在VDD和VBAT两者掉电的前提下,VDD或VBAT上电将引发备份区域复位。备份域复位6.2时钟控制系统时钟(SYSCLK)可由以下3种时钟源驱动:内部高速振荡时钟(HSI)外部高速振荡时钟(HSE)PLL时钟设备有以下2种二级时钟源:40kHz低速内部RC振荡时钟(LSI)32.768kHz低速外部晶振时钟(LSE)6.2时钟控制RCC寄存器时钟控制寄存器(RCC_CR)

时钟配置寄存器(RCC_CFGR)

时钟中断寄存器(RCC_CIR)

APB2外设复位寄存器(RCC_APB2RSTR)APB1外设复位寄存器(RCC_APB1RSTR)AHB外设时钟使能寄存器(RCC_AHBENR)APB2外设时钟使能寄存器(RCC_APB2ENR)APB1外设时钟使能寄存器(RCC_APB1ENR)备份域控制寄存器(RCC_BDCR)控制/状态寄存器(RCC_CSR)RCC库函数RCC相关库函数存放在stm32f10x_rcc.h和stm32f10x_rcc.c两个文件中。其中,stm32f10x_rcc.h是头文件,存放相关的库函数声明、结构体和宏定义;stm32f10x_rcc.c是源代码文件,存放相关的库函数定义。如果在用户应用程序中要使用STM32F10x时钟系统相关库函数,需要将时钟系统相关库函数的头文件包含进来,该步骤要通过在用户应用程序文件开头添加#include"stm32f10x_rcc.h"语句,或在工程目录下的stm32f10x_conf.h文件中去除//#include"stm32f10x_rcc.h"语句前的注释符//来完成。RCC库函数RCC库函数中涉及的结构体如下:typedefstruct{__IOuint32_tCR;__IOuint32_tCFGR;__IOuint32_tCIR;__IOuint32_tAPB2RSTR;__IOuint32_tAPB1RSTR;__IOuint32_tAHBENR;__IOuint32_tAPB2ENR;__IOuint32_tAPB1ENR;__IOuint32_tBDCR;__IOuint32_tCSR;uint32_tRESERVED0;__IOuint32_tCFGR2;}RCC_TypeDef;RCC库函数常用的STM32F10x时钟系统相关库函数有:(1)uint8_tRCC_GetSYSCLKSource(void);功能:返回用作系统时钟的时钟源。注释:该函数输入参数无,输出参数无。返回值可以是以下取值之一:

若采用HSI作为系统时钟,则返回值为0x00;

若采用HSE作为系统时钟,则返回值为0x04;若采用PLL作为系统时钟,则返回值为0x08。RCC库函数(2)voidRCC_GetClocksFreq(RCC_ClocksTypeDef*RCC_Clocks);功能:返回不同芯片时钟的频率。注释:实际应用时,根据外部晶振的实际值,修改库函数中定义HSE_Value的宏的值,且该数值不能为分数。输入参数无,输出参数RCC_Clocks为指向结构体RCC_ClocksTypeDef的指针,包括了各个时钟的频率(单位均为Hz):SYSCLK_Frequency:返回SYSCLK的频率;HCLK_Frequency:返回HCLK的频率;PCLK1_Frequency:返回PCLK1的频率;PCLK2_Frequency:返回PCLK2的频率;ADCCLK_Frequency:返回ADCCLK的频率。RCC库函数(3)voidRCC_AHBPeriphClockCmd(uint32_tRCC_AHBPeriph,FunctionalStateNewState);功能:使能或者

禁止AHB总线上的外设时钟。注释:该函数的输入参数为RCC_AHBPeriph和NewState,RCC_AHBPeriph用于指定被使能或禁止时钟的AHB外设,根据具体目标微控制器AHB总线上连接的外设模块;NewState用于设置AHB总线上指定外设时钟的新状态,可以取ENABLE或DISABLE,用于打开或关闭AHB总线上指定外设的时钟。该函数无输出参数,无返回值。RCC库函数(4)voidRCC_APB2PeriphClockCmd(uint32_tRCC_APB2Periph,FunctionalStateNewState);功能:使能或者禁止APB2高速总线上的外设时钟。注释:该函数的输入参数为RCC_APB2Periph和NewState。RCC_APB2Periph用于指定被使能或禁止时钟的APB2外设,根据具体目标微控制器APB2总线上连接的外设模块。NewState用于设置APB2总线上指定外设时钟的新状态,可以取ENABLE或DISABLE,用于打开或关闭AHB2总线上指定外设的时钟。该函数无输出参数,无返回值。RCC库函数(5)voidRCC_APB1PeriphClockCmd(uint32_tRCC_APB1Periph,FunctionalStateNewState);功能:使能或者禁止APB1总线上的外设时钟。注释:该函数的输入参数为RCC_APB1Periph和NewState。RCC_APB1Periph用于指定被使能或禁止时钟的APB1外设,根据具体目标微控制器APB1总线上连接的外设模块。NewState用于设置APB1总线上指定外设时钟的新状态,可以取ENABLE或DISABLE,用于打开或关闭AHB1总线上指定外设的时钟。该函数无输出参数,无返回值。RCC库函数voidRCC_DeInit(void);voidRCC_HSEConfig(uint32_tRCC_HSE);ErrorStatusRCC_WaitForHSEStartUp(void);voidRCC_AdjustHSICalibrationValue(uint8_tHSICalibrationValue);voidRCC_HSICmd(FunctionalStateNewState);voidRCC_PLLConfig(uint32_tRCC_PLLSource,uint32_tRCC_PLLMul);voidRCC_PLLCmd(FunctionalStateNewState);voidRCC_SYSCLKConfig(uint32_tRCC_SYSCLKSource);voidRCC_HCLKConfig(uint32_tRCC_SYSCLK);RCC库函数voidRCC_PCLK1Config(uint32_tRCC_HCLK);voidRCC_PCLK2Config(uint32_tRCC_HCLK);voidRCC_ITConfig(uint8_tRCC_IT,FunctionalStateNewState);voidRCC_USBCLKConfig(uint32_tRCC_USBCLKSource);voidRCC_ADCCLKConfig(uint32_tRCC_PCLK2);voidRCC_LSEConfig(uint8_tRCC_LSE);voidRCC_LSICmd(FunctionalStateNewState);voidRCC_RTCCLKConfig(uint32_tRCC_RTCCLKSource);voidRCC_RTCCLKCmd(FunctionalStateNewState);RCC库函数voidRCC_APB2PeriphResetCmd(uint32_tRCC_APB2Periph,FunctionalStateNewState);voidRCC_APB1PeriphResetCmd(uint32_tRCC_APB1Periph,FunctionalStateNewState);voidRCC_BackupResetCmd(FunctionalStateNewState);voidRCC_ClockSecuritySystemCmd(FunctionalStateNewState);voidRCC_MCOConfig(uint8_tRCC_MCO);FlagStatusRCC_GetFlagStatus(uint8_tRCC_FLAG);voidRCC_ClearFlag(void);ITStatusRCC_GetITStatus(uint8_tRCC_IT);voidRCC_ClearITPendingBit(uint8_tRCC_IT);RCC初始化以8MHz外部HSE时钟为例,程序的时钟设置参数流程如下:(1)RCC_DeInit();(2)RCC_HSEConfig(RCC_HSE_ON);(3)HSEStartUpStatus=RCC_WaitForHSEStartUp();(4)RCC_HCLKConfig(RCC_SYSCLK_Div1);(5)RCC_PCLK2Config(RCC_HCLK_Div1);(6)RCC_PCLK1Config(RCC_HCLK_Div2);(7)RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);(8)RCC_PLLCmd(ENABLE);(9)while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);(10)RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);(11)while(RCC_GetSYSCLKSource()!=0x08);6.3SysTick定时器SysTick是一个24位的系统节拍定时器(SystemTickTimer,SysTick),具有自动重载和溢出中断功能。SysTick定时器寄存器SysTick寄存器在core_cm3.h中定义的结构体如下:typedefstruct{__IOuint32_tCTRL;//Offset:0x000(R/W)SysTickControlandStatusRegister__IOuint32_tLOAD;//Offset:0x004(R/W)SysTickReloadValueRegister__IOuint32_tVAL; //Offset:0x008(R/W)SysTickCurrentValueRegister__IOuint32_tCALIB;//Offset:0x00C(R/)SysTickCalibrationRegister}SysTick_Type;SysTick定时器寄存器SysTick定时器寄存器:

SysTick控制与状态寄存器(STCTRL)SysTick重装值寄存器(STRELOAD)SysTick当前计数值寄存器(STCURR)

SysTick校正值寄存器(STCALIB)SysTick库函数此处介绍的SysTick相关的库函数基于STM32F10x标准外设库的最新版本3.5,较之前的版本有较大的改动。该版本中,主要有两个SysTick相关库函数:SysTick_CLKSourceConfig(),在misc.c文件中定义;SysTick_Config(uint32_tticks),在core_cm3.h头文件中进行定义。voidSysTick_CLKSourceConfig(uint32_tSysTick_CLKSource);SysTick_Config(uint32_tticks);6.4实战任务6-1:代码分析(1)对STM32f10x时钟系统相关库函数进行阅读和分析。

1.RCC寄存器定义(stm32f10x.h)2.系统时钟频率定义(stm32f10x.c)/*#defineSYSCLK_FREQ_HSEHSE_VALUE*//*#defineSYSCLK_FREQ_24MHz24000000*//*#defineSYSCLK_FREQ_36MHz36000000*//*#defineSYSCLK_FREQ_48MHz48000000*//*#defineSYSCLK_FREQ_56MHz56000000*/#defineSYSCLK_FREQ_72MHz720000006.5实战任务6-2:代码分析(2)本小节的任务是对STM32f10x时钟系统启动过程相关代码进行阅读和分析。

通常情况下,时钟系统的函数调用顺序为

startup_stm32f10x_hd.s

SystemInit()SetSysClock()SetSysClockTo72()6.6实战任务6-3:设置系统时钟本小节的任务是掌握STM32f10x时钟系统设置的方法。

voidRCC_HSE_Configuration()//自定义系统时间(可以修改时钟){RCC_DeInit();//将外设

RCC寄存器重设为缺省值

RCC_HSEConfig(RCC_HSE_ON);//设置外部高速晶振(HSE)if(RCC_WaitForHSEStartUp()==SUCCESS)//等待

HSE起振{RCC_HCLKConfig(RCC_SYSCLK_Div1);//设置

AHB时钟(HCLK)RCC_PCLK1Config(RCC_HCLK_Div2);//设置低速

AHB时钟(PCLK1)

RCC_PCLK2Config(RCC_HCLK_Div1);//设置高速

AHB时钟(PCLK2)

RCC_PLLConfig(RCC_PLLSource_HSE_Div2,RCC_PLLMul_9);//设置

PLL时钟源及倍频系数

RCC_PLLCmd(ENABLE);//使能或者禁止

PLL

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);//检查指定的

RCC标志位设置与否,PLL就绪

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//设置系统时钟(SYSCLK)

while(RCC_GetSYSCLKSource()!=0x08);//返回用作系统时钟的时钟源,0x08:PLL作为系统时钟}}intmain()

{led_Init();

//LED端口初始化

RCC_HSE_Configuration(); //自定义系统时间,可修改分频

while(1)

{GPIO_SetBits(GPIOB,LED);

delay_ms(500); //精确延时为

0.5s

GPIO_ResetBits(GPIOB,LED);

delay_ms(500); //精确延时为

0.5s}}6.7实战任务6-4:利用SysTick实现精准延时本小节任务是,利用SysTick定时器实现精准延时,以本书采用的MiniSTM32为例,实现的功能是精准延时,控制系统板上两个LED灯闪烁。

1.调用SysTick_Config()函数实现第一种方法的编程要点是,调用SysTick_Config()函数设置计数器的重装载值。SysTick_Delay_Ms()和SysTick_Delay_Us()分别实现n个1ms定时和n个1µs定时的功能。以SysTick_Delay_Ms()为例,其中的SysTick_Config(72000)定义了每间隔1ms触发一次SysTick定时器中断,当然,同时STCTR

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论