谷动谷力

 找回密码
 立即注册
谷动谷力 首页 嵌入式 查看内容

STM32F103RCT6开发板M3单片机教程05--RCC配置

2021-11-10 23:11| 发布者: admin| 查看: 95| 评论: 6|原作者: sunsili

摘要: STM32F103RCT6开发板M3单片机教程04--RCC配置 首先了解一下是什么RCC(Reset Clock Control),复位和时钟控制(RCC) 小容量产品是指闪存存储器容量在16K至32K字节之间的STM32F101xx, STM32F102xx和STM32F103xx微控 . ...
STM32F103RCT6开发板M3单片机教程05--RCC配置


首先了解一下是什么RCC(Reset Clock Control),复位和时钟控制(RCC)
小容量产品是指闪存存储器容量在16K32K字节之间的STM32F101xxSTM32F102xxSTM32F103xx微控制器。
中容量产品是指闪存存储器容量在
64K128K字节之间的STM32F101xxSTM32F102xxSTM32F103xx微控制器。
大容量产品是指闪存存储器容量在
256K512K字节之间的STM32F101xxSTM32F103xx微控制器。
除非特别说明,本章节描述的模块应用于整个
STM32F103xx微控制器系列,因为我们使用是STM32F103RCT6开发板是mini最小系统板。
本教程使用是(光明谷SUN_STM32mini开发板


一、复位
STM32F10xxx支持三种复位形式,分别为系统复位、上电复位和备份区域复位。
1.1 系统复位
系统复位将复位除时钟控制寄存器CSR中的复位标志和备份区域中的寄存器以外的所有寄存器

当以下事件中的一件发生时,产生一个系统复位:
1. NRST管脚上的低电平(外部复位)
2. 窗口看门狗计数终止(WWDG复位)
3. 独立看门狗计数终止(IWDG复位)
4. 软件复位(SW复位)
5. 低功耗管理复位
可通过查看
RCC_CSR控制状态寄存器中的复位状态标志位识别复位事件来源。
软件复位
通过将Cortex™-M3中断应用和复位控制寄存器中的SYSRESETREQ位置’1’,可实现软件复位。请参考Cortex™-M3技术参考手册获得进一步信息。
低功耗管理复位
在以下两种情况下可产生低功耗管理复位:
1. 在进入待机模式时产生低功耗管理复位:
通过将用户选择字节中的
nRST_STDBY位置’1’将使能该复位。这时,即使执行了进入待机模式的过程,系统将被复位而不是进入待机模式。
2. 在进入停止模式时产生低功耗管理复位:
通过将用户选择字节中的
nRST_STOP位置’1’将使能该复位。这时,即使执行了进入停机模式的过程,系统将被复位而不是进入停机模式。
关于用户选择字节的进一步信息,请参考
STM32F10xxx闪存编程手册。

1.2 电源复位
当以下事件中之一发生时,产生电源复位:
1. 上电/掉电复位(POR/PDR复位)
2. 从待机模式中返回
电源复位将复位除了备份区域外的所有寄存器。
(见图3)
图中复位源将最终作用于RESET管脚,并在复位过程中保持低电平。复位入口矢量被固定在地
0x0000_0004。更多细节,参阅stm32f10xxx参考手册表36

STm32Rest.JPG

1.3 备份域复位
当以下事件中之一发生时,产生备份区域复位。
1. 软件复位,备份区域复位可由设置备份区域控制寄存器RCC_BDCR中的BDRST位产生。
2. VDDVBAT两者掉电的前提下, VDDVBAT上电将引发备份区域复位。





二、 时钟
三种不同的时钟源可被用来驱动系统时钟(SYSCLK)
HSI振荡器时钟
HSE振荡器时钟
PLL时钟
这些设备有以下
2种二级时钟源:
40kHz低速内部RC,可以用于驱动独立看门狗和通过程序选择驱动RTCRTC用于从停机/
待机模式下自动唤醒系统。
32.768kHz低速外部晶体也可用来通过程序选择驱动RTC(RTCCLK)
当不被使用时,任一个时钟源都可被独立地启动或关闭,由此优化系统功耗。

复位和时钟控制 STM32F10xxx参考手
1.3 备份域复位
当以下事件中之一发生时,产生备份区域复位。
1. 软件复位,备份区域复位可由设置备份区域控制寄存器RCC_BDCR中的BDRST位产生。
2. VDDVBAT两者掉电的前提下, VDDVBAT上电将引发备份区域复位。
6.2 时钟
三种不同的时钟源可被用来驱动系统时钟(SYSCLK)
HSI振荡器时钟
HSE振荡器时钟
PLL时钟
这些设备有以下
2种二级时钟源:
40kHz低速内部RC,可以用于驱动独立看门狗和通过程序选择驱动RTCRTC用于从停机/待机模式下自动唤醒系统。
32.768kHz低速外部晶体也可用来通过程序选择驱动RTC(RTCCLK)
当不被使用时,任一个时钟源都可被独立地启动或关闭,由此优化系统功耗。
stm32_clocktree.JPG
更多细节,参阅 STM32F10xxx参考手册
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()

了解基础知识下面实操吧
以前我们其实也有配置,但不具体,基本都本MCU默认的配置,真正用好STM32,还得熟悉RCC.

复制上节工程文件夹打开(这个方法比较方便)
  • 编辑main.c, 在上节基础上增加RCC配置函数。
    1. /**********************************************************************************
    2. * Sun STM32 mini Demo

    3. *   Description
    4.    
    5.     RCC Config Demo

    6.    
    7. * Version    Date       Auther      Reversed History
    8.   ----------------------------------------------------------------------------
    9.   V1.0.0    2021-11-07  Lojam Fan  Fisrt Created
    10.   
    11. * (C) Sunshine Silicon Corporation
    12. *  Website: http://www.sunsili.com  http://sunsili.taobao.com http://bbs.sunsili.com
    13. *  E-Mail : fan@sunsili.com

    14. **********************************************************************************/

    15. #include "stm32f10x.h"
    16. #include "usart.h"
    17. #include "SysTick.h"
    18. #include "led.h"
    19. #include "key.h"
    20. #include


    21. extern vu8 Usart1_R_Buff[USART1_REC_MAXLEN];        //串口1数据接收缓冲区
    22. extern vu8 Usart1_R_State;                                                //串口1接收状态
    23. extern vu16 Usart1_R_Count;                                                //当前接收数据的字节数        

    24. void RCC_Configuration(void);

    25. /*******************************************************************************
    26. * 函数名  : main
    27. * 描述    : 主函数,用户程序从main函数开始运行
    28. * 输入    : 无
    29. * 输出    : 无
    30. * 返回值  : int:返回值为一个16位整形数
    31. * 说明    : 无
    32. *******************************************************************************/
    33. int main(void)
    34. {
    35.     u8 keyVal;
    36.     RCC_Configuration();
    37.     SysTick_Init_Config();
    38.         USART1_Init_Config(115200);//USART1初始化配置
    39.     LED_GPIO_Config();
    40.     Key_GPIO_Config();
    41.     printf ("*===================================================*\n");
    42.     printf ("*  *  Name: Sun STM32 mini Demo Code.    *************\n");
    43.     printf ("*  * (C) Sunshine Silicon Corporation    *************\n");
    44.     printf ("*  *  Website: http://www.sunsili.com    *************\n");
    45.     printf ("*  *   E-Mail : fan@sunsili.com          *************\n");
    46.     printf ("*===================================================*\n");
    47.     printf ("* Sun STM32 mini Key Demo code .*\n");
    48.    
    49.         while (1)
    50.         {
    51.         keyVal = Key_Down_Scan();
    52.                 if(Usart1_R_State == 1)//一帧数据接收完成
    53.                 {
    54.                         USART1_SendData((u8 *)Usart1_R_Buff, Usart1_R_Count);   //USART1发送数据缓冲区数据(发送刚接收完成的一帧数据)
    55.                         Usart1_R_State =0;
    56.                         Usart1_R_Count =0;
    57.                 }
    58.         if(keyVal)
    59.         {
    60.             printf("KeyVal:%d\r", keyVal);
    61.             if(keyVal & 0x01) LED3_ON();            
    62.             else if(keyVal & 0x02) LED4_ON();            
    63.         }
    64.         else LED_ALL_OFF();
    65.         }
    66. }


    67. /*******************************************************************************
    68. * 函数名  : RCC_Configuration
    69. * 描述    : 设置系统时钟为72MHZ(这个可以根据需要改)
    70. * 输入    : 无
    71. * 输出    : 无
    72. * 返回值  : 无
    73. * 说明    : STM32F107x和STM32F105x系列MCU与STM32F103x系列MCU时钟配置有所不同
    74. *******************************************************************************/
    75. void RCC_Configuration(void)
    76. {
    77.   ErrorStatus HSEStartUpStatus;               //外部高速时钟(HSE)的工作状态变量
    78.   
    79.   RCC_DeInit();                               //将所有与时钟相关的寄存器设置为默认值
    80.   RCC_HSEConfig(RCC_HSE_ON);                  //启动外部高速时钟HSE
    81.   HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待外部高速时钟(HSE)稳定

    82.   if(SUCCESS == HSEStartUpStatus)             //如果外部高速时钟已经稳定
    83.   {
    84.     /* Enable Prefetch Buffer */
    85.     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //Flash设置
    86.     /* Flash 2 wait state */
    87.     FLASH_SetLatency(FLASH_Latency_2);
    88.    
    89.   
    90.     RCC_HCLKConfig(RCC_SYSCLK_Div1); //设置AHB时钟等于系统时钟(1分频)/72MHZ
    91.     RCC_PCLK2Config(RCC_HCLK_Div1);  //设置APB2时钟和HCLK时钟相等/72MHz(最大为72MHz)
    92.     RCC_PCLK1Config(RCC_HCLK_Div2);  //设置APB1时钟是HCLK时钟的2分频/36MHz(最大为36MHz)
    93.    
    94.     RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //PLLCLK = 8MHz * 9 = 72 MHz


    95.     RCC_PLLCmd(ENABLE); //使能PLL
    96.     while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //等待PLL稳定

    97.     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);          //设置系统时钟的时钟源为PLL

    98.     while(RCC_GetSYSCLKSource() != 0x08);               //检查系统的时钟源是否是PLL
    99.     RCC_ClockSecuritySystemCmd(ENABLE);                 //使能系统安全时钟
    100.    
    101.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO,ENABLE);
    102.   }
    103. }



    104. /******************* (C) COPYRIGHT SUNSHINE SILICON  **************************
    105. ********************        END OF FILE main.c        *******************/
    复制代码

  • 编译调试
保存直接编译,发现编译出错,提示FLASH_PrefetchBufferCmd 和 FLASH_SetLatency函数未定义。解决方法添加库文件stm32f10x_flash.c
重新编译,通过。
调试

方法不再重复,经过前两节练习,大家应该是会了.
效果与前一节是一样,只是我们多了RCC配置。现在效果一样,但是真正项目里RCC是配置不一样,是致命的。

课后作业
改变CPU运行频率

工程源码
05STM32F103RCT6_RCC.zip




鲜花

握手

雷人

路过

鸡蛋

相关阅读

发表评论

最新评论

sunsili 2021-11-21 23:58
会员登录后,可看到更多内容,例程源码,及工程文档下载。
sunsili 2021-11-21 23:59
微信扫码登录连注册一次完成
鸣涧_GC96O 2021-11-22 00:04
非常棒的教程
鸣涧 2022-1-6 13:02
学习了
谷谷小师妹 2022-5-23 21:56
赞一个

查看全部评论(6)

最新热点

QQ|Archiver|手机版|深圳市光明谷科技有限公司|光明谷商城|Sunshine Silicon Corpporation ( 粤ICP备14060730号|Sitemap

GMT+8, 2023-12-7 22:24 , Processed in 0.104245 second(s), 37 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

返回顶部