你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32l053的RCC时钟

[复制链接]
强仔00001 发布时间:2015-1-7 01:30
本帖最后由 强仔00001 于 2015-1-13 18:43 编辑

转载自:http://bbs.eeworld.com.cn/thread-452537-1-1.html  
今天我跟大家探讨一下STM32L053R8的时钟系统。今天看芯片的参考手册,发现STM32L053R8的时钟系统很强大也比较复杂。
在STM32L053R8这款芯片中的时钟源选择有5个,如下图:
QQ截图20141126010534.png
分别是:
HSI16 (high-speed internal) oscillator clock
HSE (high-speed external) oscillator clock
PLL clock
MSI (multispeed internal) oscillator clock
37 kHz low speed internal RC (LSI RC)
32.768 kHz low speed external crystal (LSE crystal)
其中能作为主系统时钟源的有4个,如下图:

QQ截图20141126010400.png
整个芯片的时钟树如下图:
QQ截图20141126010553.png
关于时钟树这里我就不多说了,大家可以参考f10xx或者f4xx,值得注意的是用内部HSI外部HSE时,或者经过PLL产生的系统时钟最大频率只能是32M。如下图:
QQ截图20141126011606.png
QQ截图20141126012033.png
下面我就用自己建的模板,使用内部的HSI然后通过PLL产生的时钟通过MCO1PA8脚输出,通过示波器观察系统时钟的频率。

代码如下:
  1. #include "stm32l0xx.h"

  2. void LED_Init()
  3. {
  4.         GPIO_InitTypeDef  GPIO_InitStruct;
  5.   __GPIOA_CLK_ENABLE();
  6.         
  7.         GPIO_InitStruct.Pin = (GPIO_PIN_5);
  8.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  9.   GPIO_InitStruct.Pull = GPIO_PULLUP;
  10.   GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
  11.   
  12.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  13.          
  14. }

  15. static void Error_Handler(void)
  16. {
  17.   /* Turn LED2 on */
  18.   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
  19.   
  20.   while(1)
  21.   {
  22.   }
  23. }
  24. void LSE_Init()
  25. {
  26.   RCC_OscInitTypeDef RCC_OscInitStruct;
  27.   RCC_PeriphCLKInitTypeDef  PeriphClkInitStruct;


  28.   RCC_OscInitStruct.OscillatorType =  RCC_OSCILLATORTYPE_LSI | RCC_OSCILLATORTYPE_LSE;
  29.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  30.   RCC_OscInitStruct.LSEState = RCC_LSE_ON;
  31.   RCC_OscInitStruct.LSIState = RCC_LSI_OFF;
  32.   if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  33.   {
  34.     while(1)
  35.     {
  36.                                 Error_Handler();
  37.     }
  38.   }

  39.   PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
  40.   PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
  41.   if(HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
  42.   {
  43.                         Error_Handler();
  44.   }
  45. }

  46. void LSI_Init()
  47. {
  48.   RCC_OscInitTypeDef RCC_OscInitStruct;
  49.   RCC_PeriphCLKInitTypeDef  PeriphClkInitStruct;


  50.   RCC_OscInitStruct.OscillatorType =  RCC_OSCILLATORTYPE_LSI | RCC_OSCILLATORTYPE_LSE;
  51.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  52.   RCC_OscInitStruct.LSEState = RCC_LSI_ON;
  53.   RCC_OscInitStruct.LSIState = RCC_LSE_OFF;
  54.   if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  55.   {
  56.     while(1)
  57.     {
  58.                                 Error_Handler();
  59.     }
  60.   }

  61.   PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
  62.   PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;
  63.   if(HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
  64.   {
  65.                         Error_Handler();
  66.   }
  67. }


  68. void HSI_Init()
  69. {
  70.   RCC_OscInitTypeDef RCC_OscInitStruct;
  71.         RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  72.   RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  73.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  74.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  75.   RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_6;
  76.   RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_4;
  77.   RCC_OscInitStruct.HSICalibrationValue = 0x10;
  78.   
  79.   if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  80.   {
  81.     /* Initialization Error */
  82.     Error_Handler();
  83.   }
  84. }

  85. void PLL_Init()
  86. {
  87.         RCC_ClkInitTypeDef RCC_ClkInitStruct;
  88.         
  89.         RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
  90.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;  //RCC_SYSCLKSOURCE_PLLCLK
  91.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  92.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;  
  93.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;  
  94.   if(HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
  95.   {
  96.     Error_Handler();
  97.   }
  98. }



  99. int main()
  100. {

  101.         LED_Init();
  102.   __PWR_CLK_ENABLE();
  103.         
  104.         
  105.         //LSE_Init();
  106.         HSI_Init();
  107.   PLL_Init();
  108.         
  109.         //HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_LSE, RCC_MCODIV_1);        //LSE频率输出
  110.         HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_SYSCLK, RCC_MCODIV_1);        //PLL输出
  111.         

  112.         while (1)
  113.   {
  114.     HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5,1);

  115.   }
  116. }
复制代码
效果如下图:
IMG_20141125_235019.jpg
IMG_20141126_000314.jpg
IMG_20141126_005345.jpg
附上源代码:
RCC_Test.zip (646.95 KB, 下载次数: 29)
收藏 评论7 发布时间:2015-1-7 01:30

举报

7个回答
iwqt1983 回答时间:2015-1-7 09:09:21
这芯片比较新,低功耗方面如何?有人测试过吗?
与非朋 回答时间:2015-1-7 11:06:33
不错强仔  支持  学习啦
强仔00001 回答时间:2015-1-7 15:10:39
与非朋 发表于 2015-1-7 11:06
不错强仔  支持  学习啦

你也在这里
与非朋 回答时间:2015-1-7 16:56:49

哈哈  嗯啊  在这里看看你发的帖子  学习学习
强仔00001 回答时间:2015-1-7 16:57:47
与非朋 发表于 2015-1-7 16:56
哈哈  嗯啊  在这里看看你发的帖子  学习学习

谢谢支持
coolblood 回答时间:2015-1-7 17:00:28
不错   学习学习
强仔00001 回答时间:2015-1-7 17:01:19
coolblood 发表于 2015-1-7 17:00
不错   学习学习

这个功能还不错,可以直观看到时钟多少

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版