stm32之RCC

简介:   stm32时钟系统的意义:     1、电源的开关作用,达到低功耗效果;     2、调节时钟的速度; 对于每个外设,都要设置设置,stm32的时钟系统为了更低功耗; STM32时钟系统框图分析: 时钟源:   时钟是STM32的脉搏,是驱动源。

  stm32时钟系统的意义:

    1、电源的开关作用,达到低功耗效果;

    2、调节时钟的速度;

对于每个外设,都要设置设置,stm32的时钟系统为了更低功耗;

STM32时钟系统框图分析:

时钟源:

  时钟是STM32的脉搏,是驱动源。使用任何一个外设都必须打开相应的时钟。这样的好处就是,如果不是用一个外设的时候,就把它的时钟关掉,从而可以降低系统的功耗,达到节能,实现低功耗的效果;

  stm32的时钟可以有以下4个时钟源提供:

    1、HSI:高速内部时钟信号stm32单片机内带的时钟(8M频率),缺点是精度较差;

    2、HSE:高速外部时钟信号,精度高  来源:(1)、外部晶振 (2)、HSE用户外部时钟;

    3、LSE:低速外部晶振 32.768khz主要提供一个精准的时钟源,一般作为RTC时钟使用;

    4、LSI:内部低速时钟,提供独立看门狗,也可以给RTC;

  STM32将时钟信号(例如HSE)经过分频或倍频(PLL)后,得到系统时钟,系统时钟经过分频,产生外设所使用的时钟;

RCC设置流程: 

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

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

  3、等待外部高速时钟晶振工作      HSEStartUpStatus = RCC_WaitForHSEStartUp();

  4、设置AHB时钟            RCC_HCLKConfig

  5、设置高速APB时钟          RCC_PCLK2Config

  6、设置低速APB时钟          RCC_PCLK1Config

  7、设置PLL              RCC_PLLConfig

  8、打开PLL              RCC_PLLCmd(ENABLE)

  9、等待PLL工作            while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)

  10、设置系统时钟           RCC_SYSCLOCKConfig

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

  12、打开要使用的外设时钟      RCC_APB2PerphClockCmd()/RCC_APB1PeriphClockCmd()

实例:

 1 /*******************************************************************************
 2 * Function Name  : RCC_Configuration
 3 * Description    : Configures the different system clocks.
 4 * Input          : None
 5 * Output         : None
 6 * Return         : None
 7 *******************************************************************************/
 8 void RCC_Configuration(void)
 9 {
10     /*------使用外部RC晶振----------*/
11     RCC_DeInit();    //时钟默认初始化
12     RCC_HSEConfig(RCC_HSE_ON);//使能外部的高速时钟
13     while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);//等待外部的高速时钟就绪
14 
15     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //使能指令预存取
16     FLASH_SetLatency(FLASH_Latency_2); //等待两个周期
17 
18     RCC_HCLKConfig(RCC_SYSCLK_Div1); //设置AHB时钟为系统时钟
19     RCC_PCLK2Config(RCC_HCLK_Div1);     //设置APB2时钟为AHB时钟
20     RCC_PCLK1Config(RCC_HCLK_Div2);     //设置APB1时钟为AHB/2时钟
21     //以下3行是PLL的设置
22     RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);    //设置PLL时钟为外部高速时钟的9倍频
23     RCC_PLLCmd(ENABLE);    //使能PLL时钟
24     while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);    //等待PLL时钟使能就绪
25      //选择为PLL的CLOCK
26     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);     //配置PLL时钟为系统时钟
27     while(RCC_GetSYSCLKSource()!=0x08);    //等待PLL时钟作为系统时钟
28 
29     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC);
30     RCC_APB1PeriphClockCmd(RCC_APB1Periph_UASRT3,ENABLE);
31 }

RTC模块:

  RTC(Real_Time Clock)实时时钟;

实时时钟是一个独立的定时器,RTC模块拥有一组连续计数的计数器,在相应软件的配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期;

  RTC由两个主要部分组成。第一部分(APB1接口)用来和APB1总线相连。此单元包含一组16位寄存器,可通过APB1总线对其进行读写操作。APB1接口以APB1总线时钟为时钟;

  另一部分(RTC核)由一系列可编程计数器组成,分成两个主要模块;

    第一个模块是RTC的预分频模块,它可编程产生最长为1秒的RTC时间基准TR_CLK,RTC的预分频模块包含了一个20位的可编程分频器(RTC预分频器)。在每个TR_CLK周期中,如果在RTC_CR寄存器中设置了相应允许位,则RTC产生一个中断(秒中断)

    第二个模块是一个32位的可编程的计数器,它可以被初始化为当前的系统时钟时间。系统时间以TR_CLK速度增长并与存储在RTC_ALR寄存器中的可编程的时间相比较,如果RTC_CR控制寄存器设置了相应允许为则比较匹配时将产生一个闹钟中断;

RTC主要特性:
  􀁺 可编程的预分频系数:分频系数最高为220。
  􀁺 32 位的可编程计数器,可用于较长时间段的测量。
  􀁺 2个单独的时钟:用于APB1 接口的PCLK1 和RTC 时钟(此时的RTC 时钟必须小于
PCLK1 时钟的四分之一以上)
  􀁺 2种独立的复位类型:
  ─ APB1 接口由系统复位
  ─ RTC 只能由后备域复位。
  􀁺 3个专门的可屏蔽中断:
  ─ 闹钟中断,用来产生一个软件可编程的闹钟中断。
  ─ 秒中断,用来产生一个可编程的周期性中断信号(最长可达1 秒)。
  ─ 溢出中断,检测内部可编程计数器溢出并回转为0 的状态。

  

RTC的一些设置是保存在后备区域中的:RTC_PRL, RTC_ALR, RTC_CNT 和RTC_DIV寄存器;

这些寄存器仅能通过备份复位信号复位,不受系统复位或电源复位的影响;

备份区域复位:

  当以下时间中之一发生时,产生备份区域复位:

    1、软件复位,备份区域复位可有设置备份区域控制器RCC_BDCR中的BDRST位产生;

    2、后备电池和系统电源都没电的情况下;引发备份区域复位;

配置RTC:

  RTC有两种模式(工作模式和配置模式),要对RTC进行配置,首先设置RTC处于设置模式下;通过对RTC_CRL寄存器中的CNF位置位使RTC进入配置模式;另外,对RTC的任何寄存器的写操作都必须在前一次写操作结束之后再进行,要使用软件来查询当前的状态,同可通过查询RTC_CR寄存器中的RT0FF状态位来判断RTC寄存器是否处于更新中,仅当RTOFF状态位是“1”时,RTC寄存器可写入新的值;(这些是对RTC的保护措施)

  配置过程:

    1、查询RTOFF位,直到RTOFF的值变为“1”

    2、置CNF值为1,进入配置模式;

    3、对一个或多个RTC寄存器进行写操作;

    4、清楚CNF标志位,退出配置模式;

    5、查询RTOFF,直到RTOFF位变为“1”,以确认写操作已经完成;

  仅当CNF标志位被清零时,写操作才能进行;这个过程至少需要3个RTCCLK周期;

配置实例:

 1 /*************************************************************************************
 2 **名称        ;void RTC_Configuration(void)
 3 **功能        ;RTC实时时钟的配置
 4 **入口参数    ;无
 5 **出口参数    ;无
 6 *************************************************************************************/
 7 
 8 void RTC_Configuration(void)
 9 {
10     /* Enable PWR and BKP clocks */   //使能APB1外设PWR and BKP 的时钟
11     /*打开电源和后备时钟*/
12     RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP,ENABLE);
13     
14     /* Allow access to BKP Domain*/  //允许RTC 和后备区域寄存器的访问
15     PWR_BackupAccessCmd(ENABLE);
16     
17     /* Reset Backup Domain*/        //将外设BKP的全部 寄存器重设为缺省值
18     BKP_DeInit();
19     
20     /* Enable LSE */                //设置(打开)外部低速时钟
21        RCC_LSEConfig(RCC_LSE_ON);
22     
23     /* Wait till LSE is ready */        //等待外部低速时钟准备好
24     while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);
25     
26     /* Select LSE as RTC Clock Source */    //设置LSE为RTC时钟
27     RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
28     
29     /* Enable RTC Clock */                //使能RT时钟
30     RCC_RTCCLKCmd(ENABLE);
31 
32     //开始设置RTC,下面同步原因是:有两个时钟
33     /* Wait for RTC registers synchronization *///等待RTC寄存器(RTC_CNT,RTC_ALR and RTC_PRL)与RTC的APB时钟同步
34     RTC_WaitForSynchro();
35 
36     /* Wait untill last write operation on RTC register has finised *///等待最近一次对RTC的写操作完成
37     RTC_WaitForLastTask();
38 
39    /* Enable the RTC Second interrup */    //使能RTC的秒中断
40    RTC_ITConfig(RTC_IT_SEC,ENABLE);
41 
42    /* Wait untill last write operation on RTC register has finised */
43                                                             //等待最近一次对RTC的写操作完成
44     RTC_WaitForLastTask(); 
45 
46     //分频值为32767+1=32768
47     //计数频率=(32.768khz/32768)= 1hz
48    /* Set RTC prescaler : set RTC period to 1 sec*/        //设置RTC预分频的值
49    RTC_SetPrescaler(32767);
50 
51     /* Wait untill last write operation on RTC register has finised */
52                                                         //等待最近一次对RTC的写操作完成
53     RTC_WaitForLastTask();
54     
55     //设置当前的时间值
56     /*2014.4.5 10:20:4
57     *t = 4+20*60+10*60*60 + 5*24*60*60+
58     *
59     */
60     RTC_SetCounter((u32)t);
61     RTC_WaitForLastTask();        
62 }

 

  

 

相关文章
|
4月前
|
监控 前端开发
STM32F103标准外设库——RCC时钟(六)
STM32F103标准外设库——RCC时钟(六)
212 0
STM32F103标准外设库——RCC时钟(六)
|
2月前
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
344 0
|
3月前
使用STM32F103标准库实现定时器控制LED点亮和关闭
通过这篇博客,我们学习了如何使用STM32F103标准库,通过定时器来控制LED的点亮和关闭。我们配置了定时器中断,并在中断处理函数中实现了LED状态的切换。这是一个基础且实用的例子,适合初学者了解STM32定时器和中断的使用。 希望这篇博客对你有所帮助。如果有任何问题或建议,欢迎在评论区留言。
220 2
|
4月前
|
传感器
|
3月前
|
IDE 开发工具
使用STM32F103标准库实现自定义键盘
通过本文,我们学习了如何使用STM32F103标准库实现一个简单的自定义键盘。我们首先初始化了GPIO引脚,然后实现了一个扫描函数来检测按键状态。这个项目不仅能够帮助我们理解STM32的GPIO配置和按键扫描原理,还可以作为进一步学习中断处理和低功耗设计的基础。希望本文对你有所帮助,祝你在嵌入式开发的道路上不断进步!
402 4
|
3月前
|
存储 数据采集 数据安全/隐私保护
使用STM32F103读取TF卡并模拟U盘:使用标准库实现
通过以上步骤,你可以实现用STM32F103将TF卡内容变成U盘进行读取。这种功能在数据采集、便携式存储设备等应用中非常有用。如果你有更多的需求,可以进一步扩展此项目,例如添加文件管理功能、加密存储等。希望这篇博客能帮到你,如果有任何问题,欢迎在评论区留言讨论!
120 1
|
3月前
|
传感器
【经典案例】STM32F407使用HAL库配置I2C详解
STM32F407是一个强大的微控制器,广泛应用于嵌入式系统中。在许多应用中,我们需要使用I2C总线来与传感器、EEPROM、显示屏等外设进行通信。本文将详细介绍如何使用STM32 HAL库来配置和使用I2C接口。
353 2
|
3月前
|
开发者
【经典案例】使用HAL库配置STM32F407的SPI外设
在嵌入式系统开发中,STM32F407是一款广泛应用的微控制器,而SPI(Serial Peripheral Interface)是一种常用的通信接口。本文将详细介绍如何使用STM32的硬件抽象层(HAL)库配置STM32F407的SPI外设,并提供完整的代码示例。
251 1
|
2月前
|
传感器 编解码 API
【STM32开发入门】温湿度监测系统实战:SPI LCD显示、HAL库应用、GPIO配置、UART中断接收、ADC采集与串口通信全解析
SPI(Serial Peripheral Interface)是一种同步串行通信接口,常用于微控制器与外围设备间的数据传输。SPI LCD是指使用SPI接口与微控制器通信的液晶显示屏。这类LCD通常具有较少的引脚(通常4个:MISO、MOSI、SCK和SS),因此在引脚资源有限的系统中非常有用。通过SPI协议,微控制器可以向LCD发送命令和数据,控制显示内容和模式。