STM32F103ZET6时钟

更新时间:2023-07-13 14:05:46 阅读: 评论:0

STM32F103ZET6时钟
1、STM32F103ZET6时钟说明
  STM32F103ZET6的时钟树图如下所⽰:
  STM32F103ZET6有很多个时钟源,分别有:
  HSE:⾼速外部时钟信号。
  HSI:⾼速内部部时钟信号。
  LSI:低速内部时钟信号。
  LSE:低速外部时钟信号。
  HSI和LSI是芯⽚内置的时钟源,它们的频率⼤⼩是固定的,HSI是8MHZ,LSI是⼤约40KHZ。
  时钟树中的序号1是⾼速外部时钟信号HSE:
  HSE是由有源晶振或⽆源晶振通过OSC_OUT和OSC_IN脚提供的,从图⽚中可以看到,HSE频率从4
MHZ到16MHZ不等。当使⽤有源晶振时,时钟从OSC_IN引脚进⼊,OSC_OUT引脚悬空;当使⽤⽆源晶振时,时钟从OSC_IN和OSC_OUT进⼊,并且要配谐振电容。HSE最常使⽤的就是8MHZ的⽆源晶振。
  时钟树中的序号D是外部低速时钟LSE:
  LSE是由有源晶振或⽆源晶振通过OSC32_OUT和OSC32_IN脚提供的。LSE⼀般使⽤的是32.768KHZ的⽆源晶振。
  时钟树中的序号2是选择PLL(倍频后的时钟)的时钟源:
  从图中可以看出,PLL时钟的来源可以是HSE或HSI/2,通过PLLSRC(CFGR寄存器的bit16)来选择使⽤哪⼀个时钟源。HSI是8MHZ的内部⾼速时钟信号,HSI会根据温度和环境的情况频率会有漂移,⼀般不作为PLL的时钟来源。⼀般使⽤HSE作为PLL的时钟源。
  时钟树中的序号3是设置PLL的倍频因⼦:
  可以对PLL的时钟来源进⾏倍频,然后得到PLLCLK时钟源。倍频因⼦可以通过时钟配置寄存器CFGR的bit21~bit18:PLLMUL[3:0]来配置,分别可配置成2、3、4、5、6、7、8、9、10、11、12、13、14、15、16倍频。举个例⼦来说,如果选择HSE作为PLL的时钟源,⽽且HSE=8MHZ,且将PLL
的倍频因⼦设置为9倍频,那么PLLCLK=9*8MHZ = 72MZH。需要注意的是PLLCLK的频率不要超过72MHZ,想跑超频也可以,最⼤可以跑到128MHZ,不过⼀旦出问题ST是不负责的。
a level课程  时钟树中的序号4是系统时钟SYSCLK时钟源的选择:
  从图中可以看出,系统时钟SYSCLK的来源可以选择为HSI、PLLCLK、HSE。可以通过时钟配置寄存器CFGR的bit1~bit0:SW[1:0]来选择系统时钟SYSCLK的来源,⼀般选⽤PLLCLK,将系统时钟SYSCLK设置为72MHZ。
  在SMT32刚上电的时候,由于还没有配置过时钟,所以⽤的是系统内部8MHZ的HSI时钟,也就是说上电的时候系统时钟SYSCLK的频率为8MHZ。
  时钟树中的序号5是AHB总线时钟HCLK:
  从图中可以看出AHB总线时钟HCLK是系统时钟SYSCLK经过AHB预分频器分频之后得到的时钟。时钟配置寄存器CFGR的bit7~bit4:HPRE[3:0]可以设置AHB总线时钟HCLK的分频系数,分频系数可以设置为:1、2、4、8、16、64、128、256、512等。⼀般分频系数设置为1,即HCLK = SYSCLK。
  时钟树中的序号B是CortexM3的系统滴答时钟SYSTICK:
  从图中可以看出系统滴答时钟SYSTICK的来源是AHB总线时钟HCLK经过8分频之后的时钟。AHB总线时钟HCK⼀般是不分频的,所以系统滴答时钟SYSTICK的频率就等于SYSCLK/8,如果SYSCLK为72MHZ,那么系统滴答时钟SYSTICK的频率就是9MHZ。
  时钟树中的序号6是APB1总线时钟PCLK1:
  这是APB1总线上外设的时钟。从图中可以看出,APB1总线时钟PCLK1的最⼤频率为36MHZ,所以挂载在APB1总线时钟PCLK1上的外设,最⼤时钟都是36MHZ,除了APB1总线时钟PCLK1上的定时器除外。
  从图中可以看出,如果APB1总线时钟PCLK1的分频系数为1(即不分频),那么挂载在APB1总线上的定时器的频率就是APB1总线时钟PCLK1的频率;如果APB1总线时钟PCLK1的分频系数不为1(即分频),那么挂载在APB1总线上的定时器的频率就是APB1总线时钟PCLK1的频率的2倍。
  ⼀般将APB1总线时钟PCLK1的时钟配置为36MHZ,如果AHB总线时钟HCLK设置为72MHZ,那么APB1总线时钟PCLK1的分频系数就设置为1。
  时钟树中的序号7是APB2总线时钟PCLK2:
  这是APB2总线上外设的时钟。从图中可以看出,APB2总线时钟PCLK2的最⼤频率为72MHZ,所以
挂载在APB2总线时钟PCLK2上的外设,最⼤时钟都是72MHZ,除了APB2总线时钟PCLK2上的定时器除外。
  从图中可以看出,如果APB2总线时钟PCLK2的分频系数为1(即不分频),那么挂载在APB2总线上的定时器的频率就是APB2总线时钟PCLK2的频率;如果APB2总线时钟PCLK2的分频系数不为1(即分频),那么挂载在APB2总线上的定时器的频率就是APB2总线时钟PCLK2的频率的2倍。
  APB2总线时钟PCLK2可以通过预分频器设置,⼀般默认设置为1,即不分频。
  时钟树中的序号C是ADC的时钟:
  从图中可以看出,ADC的时钟源是由APB2总线时钟PCLK2经过分频后得到的。
  时钟树中的序号E是主时钟输出信号:
  从图中可以看出MCO的脚位可以输出主时钟的信号,MCO可以输出PLLCLK/2、HSI、HSE、SYSCLK等信号。
  ⼀般将STM32F103ZET6的时钟配置如下:
  HSE = 8MHZ。
  PLLCLK = HSE * 9 = 72MHZ。
  SYSCLK = PLLCLK = 72MHZ。
  AHB总线时钟HCLK = SYSCLK/1 = 72MHZ。
  APB1总线时钟PCLK1 = AHB总线时钟HCLK/2 = 36MHZ。
  APB2总线时钟PCLK2 = AHB总线时钟HCLK/1 = 72MHZ。
2、HAL库版本配置时钟
  HAL库是通过HAL_RCC_OscConfig和HAL_RCC_ClockConfig这两个函数对STM32F103ZET6的时钟进⾏配置。函数如下:
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct)!= HAL_OK)
{
while(1);
}
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
儿童英语谜语>摘要英文翻译RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2)!= HAL_OK)
{
while(1);
}
}
  HAL_RCC_OscConfig函数的作⽤是选择时钟源,设置PLLCLK的时钟频率。
  HAL_RCC_ClockConfig函数的作⽤是配置系统时钟SYSCLK、AHB总线时钟HCLK、APB1总线时钟PCLK1、APB2总线时钟PCLK2的频率。
  HAL_RCC_OscConfig函数参数说明:
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE是选择外部⾼速时钟HSE。
  RCC_OscInitStruct.HSEState = RCC_HSE_ON是使能外部⾼速时钟HSE。
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1是选择HSE时钟还是HSE/2时钟作为PLL的时钟输⼊。
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON是使能PLL功能。
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE是通过PLLSRC(CFGR寄存器的bit16)选择HSE作为PLL的输⼊时钟。
    RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9是设置PLL的倍频系数。
  HAL_RCC_ClockConfig函数参数说明:
  RCC_ClkInitStruct.ClockType =
RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2是选择时钟类型。
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK是选择系统时钟SYSCLK的时钟源。
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1是设置AHB总线时钟HCLK的分频系数。
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2是设置APB1总线时钟PCLK1的分频系数。
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1是设置APB2总线时钟PCLK2的分频系数。
  从上⾯的程序还可以才看出,如果HAL_RCC_OscConfig和HAL_RCC_ClockConfig这两个函数如果配置不成功,那么就会进⼊死循环,⽆法运⾏下去。
3、寄存器版本配置时钟
  这⾥的配置时钟的函数是摘录了正点原⼦的时钟配置函数来进⾏说明,函数如下:
//系统时钟初始化函数
//pll:选择的倍频数,从 2 开始,最⼤值为 16他妈的用英语怎么说
void Stm32_Clock_Init(u8 PLL)
{
  unsigned char temp=0;
  MYRCC_DeInit(); //复位并配置向量表
  RCC->CR|=0x00010000; //外部⾼速时钟使能 HSEON
  while(!(RCC->CR>>17));//等待外部时钟就绪
  RCC->CFGR=0X00000400; //APB1=DIV2;APB2=DIV1;AHB=DIV1;
  PLL-=2;//抵消 2 个单位
  RCC->CFGR|=PLL<<18; //设置 PLL 值 2~16
  RCC->CFGR|=1<<16; //PLLSRC ON
  FLASH->ACR|=0x32; //FLASH 2 个延时周期
  RCC->CR|=0x01000000; //PLLON
讽刺的英文  while(!(RCC->CR>>25));//等待 PLL 锁定
  RCC->CFGR|=0x00000002;//PLL 作为系统时钟
  while(temp!=0x02) //等待 PLL 作为系统时钟设置成功
  {
benevolence    temp=RCC->CFGR>>2;
    temp&=0x03;
  }
}
  在Stm32_Clock_Init函数中,设置了APB1总线时钟PCLK1为2分频,APB2总线时钟PCLK2为1分频,AHB总线时钟HCLK为1分频,同时选择PLLCLK作为系统时钟SYSCLK。Stm32_Clock_Init函数只有⼀个PLL的参数,是⽤设置PLL的倍频系数的。⽐如当HSE = 8MHZ,PLL的倍频系数设置为9,那么STM32将运⾏在72MHZ的速度下。
  MYRCC_DeInit函数实现外设的复位,并关断所有中断,同时调⽤向量表配置函数MY_NVIC_SetVectorTable,配置中断向量表。
//把所有时钟寄存器复位
void MYRCC_DeInit(void)
{
  RCC->APB1RSTR = 0x00000000;//复位结束
  RCC->APB2RSTR = 0x00000000;
  RCC->AHBENR = 0x00000014; //睡眠模式闪存和 SRAM 时钟使能.其他关闭.
  RCC->APB2ENR = 0x00000000; //外设时钟关闭.
  RCC->APB1ENR = 0x00000000;
  RCC->CR |= 0x00000001; //使能内部⾼速时钟 HSION
  RCC->CFGR &= 0xF8FF0000;
  //复位 SW[1:0],HPRE[3:0],PPRE1[2:0],PPRE2[2:0],ADCPRE[1:0],MCO[2:0]
  RCC->CR &= 0xFEF6FFFF; //复位 HSEON,CSSON,PLLON
云的英文  RCC->CR &= 0xFFFBFFFF; //复位 HSEBYP
  RCC->CFGR &= 0xFF80FFFF;//复位 PLLSRC, PLLXTPRE, PLLMUL[3:0] and USBPRE
  RCC->CIR = 0x00000000; //关闭所有中断
  //配置向量表
  #ifdef VECT_TAB_RAM
初中数学计算公式    MY_NVIC_SetVectorTable(0x20000000, 0x0);
  #el
    MY_NVIC_SetVectorTable(0x08000000,0x0);
  #endif
}
  MY_NVIC_SetVectorTable函数是⽤来配置中断向量表基址和偏移量的,决定向量表在哪个区域。
//设置向量表偏移地址
//NVIC_VectTab:基址
当众讲话培训班//Offt:偏移量
void MY_NVIC_SetVectorTable(u32 NVIC_VectTab, u32 Offt)
{
  SCB->VTOR = NVIC_VectTab|(Offt & (u32)0x1FFFFF80);//设置NVIC的向量表偏移寄存器
  //⽤于标识向量表是在CODE区还是在RAM区
}
4、通过MCO⼝输出系统时钟SYSCLK
面裂
  如果想验证时钟是否配置成功,可以通过MCO输出相应的时钟,通过⽰波器检验输出是否正确。  MCO可以输出PLLCLK/2、HSI、HSE、SYSCLK等信号。

本文发布于:2023-07-13 14:05:46,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/176198.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:时钟   总线   配置   设置   频率
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图