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

【经验分享】stm32l0xx时钟系统详解与代码配置

[复制链接]
STMCU小助手 发布时间:2021-11-16 00:13
时钟是嵌入式系统的脉搏,对嵌入式系统至关重要。处理器内核在时钟驱动下完成状态变换等动作,外设部件在时钟的驱动下完成各种工作,比如串口数据的发送、A/D转换、定时器计数等等。stm32l0xx系列低功耗新增MSI内部多频率可选时钟源,代码配置方面基于HAL库,与f系列相比存在一定的区别,本文以datasheet中的时钟树图为基础对时钟系统进行学习总结。时钟树如下图1所示:

20170111211434551.png


1、LSI RC,低速内部时钟(RC振荡器),是看门狗(WatchdogLS)的唯一时钟来源,可以作为实时时钟RTC和主时钟输出(MCO)的时钟源。

2、LSE OSC,外部低速时钟(晶振),输入输出引脚接OSC32_IN、OCS32_OUT可以作为实时时钟RTC和主时钟输出(MCO)的时钟源。精度高于内部低速时钟。

3、MSI RC,全称为Multispeedinternal RC oscillator,是stm32lxx低功耗系列独有的时钟,可提供12种频率的时钟源,范围可以从100KHZ到48MHZ之间变化。可以直接选择为系统时钟和AHB时钟,也可以作为MCO的时钟源。MSI为低功耗模式提供了更多的选择,但是精度不高。官方提供的例程中多以MSI作为时钟源。

4、HSI,内部高速时钟(RC振荡器),可以直接选择为系统时钟,可以作为PLL(锁相环倍频输出)时钟源,经倍频后选择作为系统的System Clock(系统时钟)和AHB时钟。HSI还可以作为ADCCLK时钟源。

5、HSE,外部高速时钟(晶振),输入输出引脚接OSC_IN、OCS_OUT,可以直接选择为系统时钟,可以作为PLL源,经倍频后选择作为系统的(系统时钟)和AHB时钟。还可以作为MCO和RTC时钟源。

6、System Clock,系统时钟,是供STM32 中绝大部分部件工作的时钟源,是其他所有外设的时钟的来源。System Clock通过 AHB 分频器分频后送给各模块使用。System Clock还是CK_PWR和MCO的时钟源。

7、HCLK,高速外设时钟,是AHB总线时钟源,SystemClock经AHB预分频得到。供内存和 DMA 等使用。

8、FCLK为自由振荡处理器时钟,用来保证在休眠是采样到中断和跟踪休眠事件,与HCLK时钟源相同。

9、PCLK1,System Clock经AHB预分频后,送给 APB1 分频器,得出PCLK1,是APB1时钟源,供 APB1 外设使用。APB1上面连接的是低速外设,包括电源接口、备份接口、CAN、USB、I2C1、I2C2、UART2、UART3 等等。另一路送给TIMx使用,若APB1分频系数为1,则不倍频,否则倍频系数为2。

9、PCLK2,System Clock经AHB预分频后,送给 APB2 分频器,得出PCLK2,是APB2时钟源,供 APB2外设使用,APB2 上面连接的是高速外设包括UART1、SPI1、Timer1、ADC1、ADC2、所有普通 IO 口(PA~PE)、第二功能 IO 口等。另一路送给TIMx使用,若APB2分频系数为1,则不倍频,否则倍频系数为2。



时钟初始化代码配置,选用了HSE外部时钟,未进行倍频和分频:

  1. void SystemClock_Config(void)
  2. {


  3.   RCC_OscInitTypeDef RCC_OscInitStruct;
  4.   RCC_ClkInitTypeDef RCC_ClkInitStruct;


  5.     /**Configure the main internal regulator output voltage
  6.     */
  7.   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);


  8.     /**Initializes the CPU, AHB and APB busses clocks
  9.     */
  10.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE;
  11.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  12.   RCC_OscInitStruct.LSIState = RCC_LSI_ON;
  13.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  14.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  15.   {
  16.     Error_Handler();
  17.   }


  18.     /**Initializes the CPU, AHB and APB busses clocks
  19.     */
  20.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  21.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  22.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE;
  23.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  24.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  25.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;


  26.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  27.   {
  28.     Error_Handler();
  29.   }


  30.     /**Configure the Systick interrupt time
  31.     */
  32.   HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);


  33.     /**Configure the Systick
  34.     */
  35.   HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);


  36.   /* SysTick_IRQn interrupt configuration */
  37.   HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
  38. }

复制代码


收藏 评论0 发布时间:2021-11-16 00:13

举报

0个回答

所属标签

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