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

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扩展软件包
关注我们
st-img 微信公众号
st-img 手机版