stm32时钟设置函数

发布者:huijiazi5210最新更新时间:2020-09-22 来源: eefocus关键字:stm32  时钟  设置函数 手机看文章 扫描二维码
随时随地手机看文章

这里涉及到一个很重要的寄存器,时钟配置寄存器:RCC_CFGR


 1 #if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)

 2 /* #define SYSCLK_FREQ_HSE    HSE_VALUE */

 3  #define SYSCLK_FREQ_24MHz  24000000

 4 #else

 5 /* #define SYSCLK_FREQ_HSE    HSE_VALUE */

 6 /* #define SYSCLK_FREQ_24MHz  24000000 */ 

 7 /* #define SYSCLK_FREQ_36MHz  36000000 */

 8 /* #define SYSCLK_FREQ_48MHz  48000000 */

 9 /* #define SYSCLK_FREQ_56MHz  56000000 */

10 #define SYSCLK_FREQ_72MHz  72000000

11 #endif


 1 /**

 2   * @brief  Setup the microcontroller system

 3   *         Initialize the Embedded Flash Interface, the PLL and update the 

 4   *         SystemCoreClock variable.

 5   * @note   This function should be used only after reset.

 6   * @param  None

 7   * @retval None

 8   */

 9 void SystemInit (void)

10 {

11   /* Reset the RCC clock configuration to the default reset state(for debug purpose) */

12   /* Set HSION bit */

13   RCC->CR |= (uint32_t)0x00000001;

14 

15   /* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */

16 #ifndef STM32F10X_CL

17   RCC->CFGR &= (uint32_t)0xF8FF0000;

18 #else

19   RCC->CFGR &= (uint32_t)0xF0FF0000;

20 #endif /* STM32F10X_CL */   

21   

22   /* Reset HSEON, CSSON and PLLON bits */

23   RCC->CR &= (uint32_t)0xFEF6FFFF;

24 

25   /* Reset HSEBYP bit */

26   RCC->CR &= (uint32_t)0xFFFBFFFF;

27 

28   /* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */

29   RCC->CFGR &= (uint32_t)0xFF80FFFF;

30 

31 #ifdef STM32F10X_CL

32   /* Reset PLL2ON and PLL3ON bits */

33   RCC->CR &= (uint32_t)0xEBFFFFFF;

34 

35   /* Disable all interrupts and clear pending bits  */

36   RCC->CIR = 0x00FF0000;

37 

38   /* Reset CFGR2 register */

39   RCC->CFGR2 = 0x00000000;

40 #elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)

41   /* Disable all interrupts and clear pending bits  */

42   RCC->CIR = 0x009F0000;

43 

44   /* Reset CFGR2 register */

45   RCC->CFGR2 = 0x00000000;      

46 #else

47   /* Disable all interrupts and clear pending bits  */

48   RCC->CIR = 0x009F0000;

49 #endif /* STM32F10X_CL */

50     

51 #if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL)

52   #ifdef DATA_IN_ExtSRAM

53     SystemInit_ExtMemCtl(); 

54   #endif /* DATA_IN_ExtSRAM */

55 #endif 

56 

57   /* Configure the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers */

58   /* Configure the Flash Latency cycles and enable prefetch buffer */

59   SetSysClock();

60 

61 #ifdef VECT_TAB_SRAM

62   SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */

63 #else

64   SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */

65 #endif 

66 }


/**

  * @brief  Configures the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers.

  * @param  None

  * @retval None

  */

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

  SetSysClockTo72();

#endif


 设置RCC_CFGR寄存器的位参数,使其与外部晶振匹配得到72M系统时钟。


  1 /**

  2   * @brief  Sets System clock frequency to 72MHz and configure HCLK, PCLK2 

  3   *         and PCLK1 prescalers. 

  4   * @note   This function should be used only after reset.

  5   * @param  None

  6   * @retval None

  7   */

  8 static void SetSysClockTo72(void)

  9 {

 10   __IO uint32_t StartUpCounter = 0, HSEStatus = 0;

 11   

 12   /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/    

 13   /* Enable HSE */    

 14   RCC->CR |= ((uint32_t)RCC_CR_HSEON);

 15  

 16   /* Wait till HSE is ready and if Time out is reached exit */

 17   do

 18   {

 19     HSEStatus = RCC->CR & RCC_CR_HSERDY;

 20     StartUpCounter++;  

 21   } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));

 22 

 23   if ((RCC->CR & RCC_CR_HSERDY) != RESET)

 24   {

 25     HSEStatus = (uint32_t)0x01;

 26   }

 27   else

 28   {

 29     HSEStatus = (uint32_t)0x00;

 30   }  

 31 

 32   if (HSEStatus == (uint32_t)0x01)

 33   {

 34     /* Enable Prefetch Buffer */

 35     FLASH->ACR |= FLASH_ACR_PRFTBE;

 36 

 37     /* Flash 2 wait state */

 38     FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);

 39     FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;    

 40 

 41  

 42     /* HCLK = SYSCLK */

 43     RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;//AHB一分频

 44       

 45     /* PCLK2 = HCLK */

 46     RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;

 47     

 48     /* PCLK1 = HCLK */

 49     RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;

 50 

 51 #ifdef STM32F10X_CL

 52     /* Configure PLLs ------------------------------------------------------*/

 53     /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */

 54     /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */

 55         

 56     RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |

 57                               RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);

 58     RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |

 59                              RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);

 60   

 61     /* Enable PLL2 */

 62     RCC->CR |= RCC_CR_PLL2ON;

 63     /* Wait till PLL2 is ready */

 64     while((RCC->CR & RCC_CR_PLL2RDY) == 0)

 65     {

 66     }

 67     

 68    

 69     /* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */ 

 70     RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);

 71     RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | 

 72                             RCC_CFGR_PLLMULL9); 

 73 #else    

 74     /*  PLL configuration: PLLCLK = HSE * 9 = 72 MHz */

 75     RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |

 76                                         RCC_CFGR_PLLMULL));

 77     RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);

 78 #endif /* STM32F10X_CL */

 79 

 80     /* Enable PLL */

 81     RCC->CR |= RCC_CR_PLLON;

 82 

 83     /* Wait till PLL is ready */

 84     while((RCC->CR & RCC_CR_PLLRDY) == 0)

 85     {

 86     }

 87     

 88     /* Select PLL as system clock source */

 89     RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));

 90     RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;    

 91 

 92     /* Wait till PLL is used as system clock source */

 93     while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)

 94     {

 95     }

 96   }

 97   else

 98   { /* If HSE fails to start-up, the application will have wrong clock 

 99          configuration. User can add here some code to deal with this error */

100   }

101 }


关键字:stm32  时钟  设置函数 引用地址:stm32时钟设置函数

上一篇:STM32——时钟系统
下一篇:STM32中的位带(bit-band)操作

推荐阅读最新更新时间:2024-11-13 15:14

stm32时钟及其滴答定时器
stm32时钟设置(F1其余型号同理): Reset handler Reset_Handler PROC EXPORT Reset_Handler IMPORT __main IMPORT SystemInit LDR R0, =SystemInit BLX R0 LDR R0, =__main BX R0 ENDP void SystemInit (void) {.............................. /* 打开 HSI
[单片机]
基于stm32的自定义HID设备开发与上位机通讯实现
1.HID通信的实现 2.使用USB外设 3.使用HID设备 4.配置时钟 5.USB中断放低点 6.生成代码,替换配置描述符 /* USB HID device Configuration Descriptor */ __ALIGN_BEGIN static uint8_t USBD_HID_CfgDesc __ALIGN_END = { 0x09, /* bLength: Configuration Descriptor size */ USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ USB_HID_CO
[单片机]
基于<font color='red'>stm32</font>的自定义HID设备开发与上位机通讯实现
STM32+BH1750光敏传感器获取光照强度
一、环境介绍 MCU: STM32F103ZET6 光敏传感器: BH1750数字传感器(IIC接口) 开发软件: Keil5 代码说明:使用IIC模拟时序驱动,方便移植到其他平台,采集的光照度比较灵敏. 合成的光照度返回值范围是 0~255。 0表示全黑 255表示很亮。 实测: 手机闪光灯照着的状态返回值是245左右,手捂着的状态返回值是10左右. 完整工程代码下载: https://download.csdn.net/download/xiaolong1126626497/18500653 二、BH1750介绍 三、核心代码 BH1750说明: ADDR引脚接地,地址就是0x46 3
[单片机]
STM32+BH1750光敏传感器获取光照强度
STM32位带操作总结
51单片机估计都用过,可以单独对P1口的第一个IO进行操作,然而STM32是不允许这样做的,为了像51单片机一样能够单独的对某一个IO单独操作,就引入了位带操作这样的概念,简而言之,言而总之,就是为了单独操作32里面的某个端口,所以才有了位带这样的操作机制。 位带区,和位带别名区,位带区,就是你想单独操作的IO的区域,也就是PA,PB等等这一堆IO口的内存所在区,而位带别名区,就是给每一位重新起了个名字的那一片地址区域。M3内核 存储器映射表,1M内存的BitBand区,还有与之对应的32M内存的BitBand别名区,因为你将每一位膨胀成为了一个32位,所以相应的别名区的内存也会是位带区的32倍。 官方给出的相应的计算公式
[单片机]
<font color='red'>STM32</font>位带操作总结
说说STM32的堆栈与内存
1.概念 这里所说的堆栈,是针对单片机所说的“堆”与“栈”,指的是内存中一片特殊用途的区域。而不是数据结构中的堆栈(虽然其实规则一样)。 这里所说的内存,是指RAM,RAM包括SRAM,DRAM等。而不是什么手机内存卡之类。 这里所说的flash,指的是用作为ROM的存储器,保存代码与常量数据。而不是动画制作。。。 栈的生长方向:指的是入栈方向,从高地址向低地址生长叫做向下生长,或逆向生长;反过来就叫向上生长,或正向生长。STM32的栈是向下生长。 2.内存中的堆栈安排 确切地说,是keil mdk根据STM32的特性,对stm32的RAM甚至flash进行部署。 编译工程后,在生成的.map文件里可以看到具体
[单片机]
说说<font color='red'>STM32</font>的堆栈与内存
stm32用什么语言编程 STM32单片机原理
STM32可以使用多种语言进行编程,包括: 1. C语言:C语言是最常用的STM32编程语言。STMicroelectronics提供了专门的C编译器和开发工具链,使开发者可以使用C语言进行STM32的软件开发。 2. C++语言:除了C语言,STM32也可以使用C++语言进行编程。C++是C的扩展,提供了面向对象的编程能力,可以使STM32的软件更加模块化和可重用。 3. 基于HAL库的C语言:STMicroelectronics还提供了一套称为HAL(Hardware Abstraction Layer)的库,可以方便地进行硬件抽象和驱动开发。使用HAL库,开发者可以使用C语言编写高层次的代码,而不需要直接操作寄存器。 4.
[单片机]
Stm32使用Usart代码例子轮询、中断、DMA
/* 转载请注明出处:tedeum.iteye.com / 首先是不使用中断的方法使用usart1,管脚pa9,pa10,此方法已在f3discovery上验证通过,来源:https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Flat.aspx?RootFolder=%2Fpublic%2FSTe2ecommunities%2Fmcu%2FLists%2Fcortex_mx_stm32%2Fusart%20code&FolderCTID=0x01200200770978C69A1141439FE559EB459D7580009C4E1
[单片机]
<font color='red'>Stm32</font>使用Usart代码例子轮询、中断、DMA
简单初始化STM32的RTC
RTC嘛 就跟DS1302 差不多吧...当然了可分频又有32位的计数器...报警、秒、溢出中断.....等等。RTC在APB1总线上.... 要使用 RTC,一般来说也顺带地使用上后备寄存器 这是因为RTC 是一个简单的秒中断 定时器,年月日时分秒的信息必须要找个地方能掉电保存才有意义.STM32 的备份寄存器(BKP)是42个16位的寄存器,可用来存储84个字节的用户应用程序数据。他们处在备份域里,当VDD电源被切断,他们仍然由VBAT维持供电。当系统在待机模式下被唤醒,或系统复位或电源复位时,他们也不会被复位。 此外,BKP控制寄存器用来管理侵入检测和RTC校准功能。 复位后,对备份寄存器和RTC的访问被禁止,并且备份域被
[单片机]
简单初始化<font color='red'>STM32</font>的RTC
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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