本帖最后由 强仔00001 于 2015-1-13 18:43 编辑
转载自:http://bbs.eeworld.com.cn/thread-452537-1-1.html
今天我跟大家探讨一下STM32L053R8的时钟系统。今天看芯片的参考手册,发现STM32L053R8的时钟系统很强大也比较复杂。
在STM32L053R8这款芯片中的时钟源选择有5个,如下图:
分别是: • 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个,如下图:
整个芯片的时钟树如下图: 关于时钟树这里我就不多说了,大家可以参考f10xx或者f4xx,值得注意的是用内部HSI和外部HSE时,或者经过PLL产生的系统时钟最大频率只能是32M。如下图:
下面我就用自己建的模板,使用内部的HSI然后通过PLL产生的时钟通过MCO1的PA8脚输出,通过示波器观察系统时钟的频率。
代码如下: - #include "stm32l0xx.h"
- void LED_Init()
- {
- GPIO_InitTypeDef GPIO_InitStruct;
- __GPIOA_CLK_ENABLE();
-
- GPIO_InitStruct.Pin = (GPIO_PIN_5);
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
- GPIO_InitStruct.Pull = GPIO_PULLUP;
- GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
-
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
-
- }
- static void Error_Handler(void)
- {
- /* Turn LED2 on */
- HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
-
- while(1)
- {
- }
- }
- void LSE_Init()
- {
- RCC_OscInitTypeDef RCC_OscInitStruct;
- RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;
- RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI | RCC_OSCILLATORTYPE_LSE;
- RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
- RCC_OscInitStruct.LSEState = RCC_LSE_ON;
- RCC_OscInitStruct.LSIState = RCC_LSI_OFF;
- if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
- {
- while(1)
- {
- Error_Handler();
- }
- }
- PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
- PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
- if(HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
- {
- Error_Handler();
- }
- }
- void LSI_Init()
- {
- RCC_OscInitTypeDef RCC_OscInitStruct;
- RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;
- RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI | RCC_OSCILLATORTYPE_LSE;
- RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
- RCC_OscInitStruct.LSEState = RCC_LSI_ON;
- RCC_OscInitStruct.LSIState = RCC_LSE_OFF;
- if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
- {
- while(1)
- {
- Error_Handler();
- }
- }
- PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
- PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;
- if(HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
- {
- Error_Handler();
- }
- }
- void HSI_Init()
- {
- RCC_OscInitTypeDef RCC_OscInitStruct;
- RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
- RCC_OscInitStruct.HSIState = RCC_HSI_ON;
- RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
- RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
- RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_6;
- RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_4;
- RCC_OscInitStruct.HSICalibrationValue = 0x10;
-
- if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
- {
- /* Initialization Error */
- Error_Handler();
- }
- }
- void PLL_Init()
- {
- RCC_ClkInitTypeDef RCC_ClkInitStruct;
-
- RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
- RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; //RCC_SYSCLKSOURCE_PLLCLK
- RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
- RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
- RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
- if(HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
- {
- Error_Handler();
- }
- }
- int main()
- {
- LED_Init();
- __PWR_CLK_ENABLE();
-
-
- //LSE_Init();
- HSI_Init();
- PLL_Init();
-
- //HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_LSE, RCC_MCODIV_1); //LSE频率输出
- HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_SYSCLK, RCC_MCODIV_1); //PLL输出
-
- while (1)
- {
- HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5,1);
- }
- }
复制代码效果如下图:
附上源代码: |
你也在这里
哈哈 嗯啊 在这里看看你发的帖子 学习学习
谢谢支持