STM32——关于时钟源的实际使用及解释

STM32——关于时钟源的实际使用及解释LSI 是一种低功耗 高精度的时钟信号 是一种以内部电源为驱动的振荡器 适用于一些应用场景 尤其是对功耗要求较高的场合 用于供给独立看门狗和自动唤醒单元使用

大家好,欢迎来到IT知识分享网。

1、STM32内部有5个时钟源,分别为HSI、HSE、LSE、LSI、PLL。

HSE:高速外部时钟,可接石英谐振器、陶瓷谐振器,或者接外部时钟源,其频率范围为4MHZ~16MHZ。

LSE: 低速外部时钟,接频率为32.768KHZ的石英晶体。

HSI:高速内部时钟,RC振荡器,频率为8MHZ。

LSI:低速内部时钟,RC振荡器,频率为40KHZ。

PLL:锁相环倍频输出。其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频选择2~16倍,但是其输出频率最大不得超过72MHZ。

6688f0e17cb344ada371ba0fd1537cca.png

2、根据STM32F103的参考手册,我们能够看到LSE和LSI未通向AHB预分频器,即未参与挂载在AHB总线上的各种外设。

LSE是用来个RTC(实时时钟)来提供准确的时钟信号。

LSI是一种低功耗,高精度的时钟信号,是一种以内部电源为驱动的振荡器,适用于一些应用场景,尤其是对功耗要求较高的场合,用于供给独立看门狗和自动唤醒单元使用。

3、在程序中如何使用HSE和HSI?

1、LED.C #include "stm32f10x.h" // Device header #include "Delay.h" void LED_Init(void) { /*当我们直接在程序中使用RCC_APB2PeriphClockCmd时, 其是由内部时钟控制的。它用于使能或禁用外设的时 钟,通过控制内部时钟的分频器来控制外设的时钟。*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); //开启APB2外设时钟 GPIO_DeInit(GPIOC); //对整个GPIOC引脚进行复位操作 GPIO_InitTypeDef GPIO_InitStructure; //声明结构体GPIO_InitStructure GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC,&GPIO_InitStructure); } void LED(void) { GPIO_WriteBit(GPIOB,GPIO_Pin_7,(BitAction)0); //BitAction为强制类型转换符 Delay_ms(500); GPIO_WriteBit(GPIOB,GPIO_Pin_7,Bit_SET); Delay_ms(500); } void PC13_ON(void) { GPIO_ResetBits(GPIOC,GPIO_Pin_13); //低电平点亮PC13LED灯 Delay_ms(500); } void PC13_OFF(void) { GPIO_SetBits(GPIOC,GPIO_Pin_13); //高电平点亮PC13LED灯 Delay_ms(500); } uint8_t LED_GetNum(void) { return GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13 ); //读取PC13号端口的输入值 }

feb16ef87a234f31a76cd7bf5875ced8.png

 

 void HSE_Init(uint16_t PLL) { ErrorStatus HSEStart_UpStatus; //将RCC寄存器重新设置为默认值 RCC_DeInit(); //打开外部高速时钟晶振HSE RCC_HSEConfig(RCC_HSE_ON); //等待外部高速时钟晶振工作 HSEStart_UpStatus = RCC_WaitForHSEStartUp(); if(HSEStart_UpStatus == SUCCESS) //SUCCESS:HSE晶振稳定且就绪 { //设置AHB时钟 RCC_HCLKConfig(RCC_SYSCLK_Div1); //设置高速AHB时钟 RCC_PCLK2Config(RCC_HCLK_Div1); //设置低速AHB时钟 RCC_PCLK1Config(RCC_HCLK_Div2); //设置FLASH存储器延时时钟周期数 FLASH_SetLatency(FLASH_ACR_LATENCY_2); //选择FLASH预取指缓存的模式 FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //设置PLL时钟源及倍频系数 switch(PLL) { case 2:RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_2); break; case 3:RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_3); break; case 4:RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_4); break; case 5:RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_5); break; case 6:RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_6); break; case 7:RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_7); break; case 8:RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_8); break; case 9:RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); break; default:RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_2); break; } //使能PLL RCC_PLLCmd(ENABLE); //检查指定的RCC标志位 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){} //设置系统时钟(SYSCLK) RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//RCC_SYSCLKSource_PLLCLK选择PLL作为系统时钟 //PLL返回用作系统时钟的时钟源 / * @brief Returns the clock source used as system clock. * @param None * @retval The clock source used as system clock. The returned value can * be one of the following: * - 0x00: HSI used as system clock * - 0x04: HSE used as system clock * - 0x08: PLL used as system clock */ while(RCC_GetSYSCLKSource()!= 0X08) { } } }

 

 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/125393.html

(0)
上一篇 2025-09-27 18:20
下一篇 2025-09-27 18:33

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信