历史上的今天
返回首页

历史上的今天

今天是:2024年09月22日(星期日)

正在发生

2020年09月22日 | stm32时钟设置函数

2020-09-22 来源:eefocus

这里涉及到一个很重要的寄存器,时钟配置寄存器: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 }


推荐阅读

史海拾趣

EUCHNER公司的发展小趣事

EUCHNER公司一直将产品创新视为其核心竞争力。公司不断投入研发资源,推出了一系列具有创新性的产品,如安全限位开关CES-CMFS系列、机械式安全开关MGB系列以及多光束安全栅ESPE系列等。这些产品在汽车制造、轨道交通、环保监测等领域得到了广泛应用,并赢得了客户的广泛赞誉。通过产品创新和市场拓展,EUCHNER公司的市场份额逐年提升。

华宇创公司的发展小趣事

随着市场的不断发展,华宇创意识到单一产品无法满足日益增长的市场需求。于是,公司加大了对研发的投入,积极引进高端人才,与国内外知名科研机构建立合作关系。经过不懈努力,华宇创成功研发出一系列智能电子设备,包括智能手表、智能眼镜、智能家居控制器等。这些新产品的推出不仅丰富了公司的产品线,也进一步提升了华宇创的市场竞争力。

Avel Lindberg公司的发展小趣事

为了进一步扩大市场份额,华宇创开始积极拓展国内外市场。公司参加了多场国际电子展和博览会,与全球各地的客户建立了广泛的联系。同时,华宇创还与国际知名电子企业建立了战略合作关系,共同研发新技术、新产品。这些国际合作不仅为华宇创带来了更多的商业机会,也提升了公司在国际市场的地位和影响力。

台湾诚阳(BC)公司的发展小趣事

随着国内市场的逐渐饱和,台湾诚阳(BC)公司开始积极寻求海外市场的发展机会。公司通过参加国际展会、与海外企业建立合作关系等方式,不断拓展国际市场。同时,公司还针对不同地区的市场需求,推出定制化的产品和服务,进一步提升了其在国际市场中的竞争力。

DFI公司的发展小趣事

DFI公司自创立之初,就致力于技术创新。在电子主板领域,DFI凭借其对高性能主板的深入研究,成功开发出多款领先行业的产品。例如,在2002年,DFI推出了LanParty UT nF4 SLI-DR Venus限量版主板,这款产品凭借其出色的性能和稳定性,迅速赢得了全球玩家的青睐。这一系列的创新举措不仅提升了DFI的品牌知名度,也为其在电子主板市场占据了重要地位。

成都成电硅海公司的发展小趣事

成都成电硅海公司自2009年成立以来,就以其独特的技术创新能力在电子行业中崭露头角。公司创始人李德全深谙半导体行业的技术趋势,带领团队攻克了一个又一个技术难题。在成立初期,公司就成功研发出一款高性能的硅基材料,这一创新不仅打破了国外企业的技术垄断,还为公司赢得了市场的初步认可。

问答坊 | AI 解惑

寻找几个C语言编程高手

非常希望认识几个对51单片机的C语言编程开发高手,我的QQ:836587669…

查看全部问答>

arm9 ldr r13,=0x1000

  我用的是飞凌的 ok2440 ,哎 菜鸟一只         AREA |DATA|,CODE,READONLY         ENTRY         ldr r13,=0x1000         IMPORT LedMain ...…

查看全部问答>

如何利用PB5来开发CE设备驱动程序?

我最近想学习一下CE驱动程序的开发。买了一本书,上面大谈本机驱动,流驱动,但是它并没有演示如何具体的去做一个驱动。只是给出了一些驱动代码。现在我主要是对WINCE5.0如何开发驱动程序的这个流程不清楚。根本不知道我的驱动代码该写在哪里,如何 ...…

查看全部问答>

GetDC 然后ReleaseDC(),出现内存泄露

内存绘图之后, memDC, pDC, 我都RealseDC了。 但是最终,还是出现内存不足,循环一分钟就提示内存不足,内存泄露。 http://support.microsoft.com/kb/819635/zh-cn 上面的连接说明了这是一个bug. 但是他都是使用的是句柄,我用的MFC,然后不 ...…

查看全部问答>

请教关于I2C的延时应该怎么计算?

各位用过I2C模拟通信的前辈,我刚学这个,有一些地方不明白,还望大虾指点: 用的是带有I2C接口的tea5990收音机芯片,它支持100KHZ和400KHZ, 在电路板上是使用主控(其主频是184MHZ)的IO口产生的模拟I2C与它连接, 我自己写的软件模拟I2C,数据通过I2C写 ...…

查看全部问答>

请教用gsm modem以Text模式发送信息 AT

在我超级终端中进行AT命令测试如下: at ok at+cmgf=1  //设置成Text模式,我不要使用PDU模式 ok at+cmgs=\"00310033003000330037003300330037003900380032\"  //指定收短信的手机号码130xxxxxxx >123  &nbs ...…

查看全部问答>

内存泄漏,请帮忙看看问题出在哪里?

void CRS2USBDlg::OnTimer(UINT nIDEvent) {         // TODO: Add your message handler code here and/or call default         HKEY hKey = HKEY_LOCAL_MACHINE;         DWO ...…

查看全部问答>

单片机入门求助

本人大二学生 专业是电子信息工程 学过c语言 模电 数电等 现在想自学单片机 学哪种好呢?我们学校智能车队用的是飞思卡尔的 机器人队用的是mega16 我看网上还有51什么的 这些差别很大吗?我学哪种好呢?另外我用买开发板吗?或者其他什么材料?我问 ...…

查看全部问答>

MSP430FR573x, MSP430FR572x C Code Examples (IAR and CCS) (Rev. B)

MSP430FR573x, MSP430FR572x C Code Examples (IAR and CCS) (Rev. B)…

查看全部问答>

【TI首届低功耗设计大赛】求教TTP229触摸板电路

本帖最后由 lonerzf 于 2014-9-27 09:04 编辑 最近看到一个利用TTP229做的电容式触摸开关电路。预期把它应用到MSP430FR5969中去,不知道PCB设计这块有什么要注意的。有已经使用过该方案的坛友还请指导下。谢谢~ 下面是淘宝上的模块。 中英 ...…

查看全部问答>