STM32F1 使用内部时钟修改

STM32F1 的内部高速(HSI)晶振为8MHz,最大可调整系统时钟为64MHz

修改在SystemInit (void)中被调用的SetSysClock()函数。

/* If none of the define above is enabled, the HSI is used as System clock
    source (default after reset) */ 

在外部晶振失效时,系统也是可以工作的,此时的系统时钟是8MHZ,此时外设时钟需要更改相应配置。

原工程配置72M时钟,定义了SYSCLK_FREQ_72MHz,

第一步注释SYSCLK_FREQ_72MHz,增加 SYSCLK_FREQ_64MHz 

第二步增加SetSysClockTo64();函数
 

(1)
#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
/* #define SYSCLK_FREQ_HSE    HSE_VALUE */
 #define SYSCLK_FREQ_24MHz  24000000
#else
/* #define SYSCLK_FREQ_HSE    HSE_VALUE */
/* #define SYSCLK_FREQ_24MHz  24000000 */ 
/* #define SYSCLK_FREQ_36MHz  36000000 */
/* #define SYSCLK_FREQ_48MHz  48000000 */
/* #define SYSCLK_FREQ_56MHz  56000000 */
//#define SYSCLK_FREQ_72MHz  72000000
#define SYSCLK_FREQ_64MHz  64000000   //HSI(内部高速时钟最大速度)

#endif


(2)
static void SetSysClockTo64()
{
	__IO uint32_t HSIStartUpStatus = 0;
	
	HSIStartUpStatus = RCC->CR & RCC_CR_HSIRDY;
	
	if (HSIStartUpStatus == RCC_CR_HSIRDY)
	{
	    /* Enable Prefetch Buffer */
	    FLASH->ACR |= FLASH_ACR_PRFTBE;
	   
	    /* Flash 2 wait state */
	    FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
	    FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;
	   
	    RCC_HCLKConfig(RCC_SYSCLK_Div1);
	   
	    RCC_PCLK2Config(RCC_HCLK_Div1);
	   
	    RCC_PCLK1Config(RCC_HCLK_Div2);
	   
	    RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_16);
	   
	    RCC_PLLCmd(ENABLE);
	   
	    while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
	    {}
	   
	    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
	   
	    while (RCC_GetSYSCLKSource() != 0x08){
	    }
	}else{
        while (1){}
	}
}


(3)
static void SetSysClock(void)
{
#ifdef SYSCLK_FREQ_HSE
  SetSysClockToHSE();
#elif defined SYSCLK_FREQ_24MHz
  SetSysClockTo24();
#elif defined SYSCLK_FREQ_36MHz
  SetSysClockTo36();
#elif defined SYSCLK_FREQ_48MHz
  SetSysClockTo48();
#elif defined SYSCLK_FREQ_56MHz
  SetSysClockTo56();  
#elif defined SYSCLK_FREQ_72MHz
  SetSysClockTo72();
#elif defined SYSCLK_FREQ_64MHz
  SetSysClockTo64();	
#endif
 
 /* If none of the define above is enabled, the HSI is used as System clock
    source (default after reset) */ 
}

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: STM32F1系列芯片是具有高性价比的ARM Cortex-M3内核微处理器,内部晶振频率为8MHz,可以通过配置寄存器来使用内部晶振程序。使用内部晶振有以下几点好处: 1. 减少硬件成本:使用内部晶振程序可以节省外部晶振器的成本,尤其适合一些成本敏感的产品和小批量生产的场景。 2. 简化电路设计:使用内部晶振程序可以减少电路板上的元器件数量,简化电路设计,提高电路板的可靠性。 3. 减少PCB面积:少用几个元器件,能给PCB面积带来极为可观的降低。 4. 减少功耗:相比于外部晶振器,使用内部晶振能降低芯片的功耗,因为没有晶振驱动电路的额外负载。 但是,使用内部晶振也存在一些弊端: 1. 精度受环境影响:由于受环境温度、电压等因素的影响,内部晶振精度相较于外部振荡器较低,故若要实现更高的精度,需要选择更精准的时钟源。 2. 异频模式要自己实现:由于没有外部时钟源,内部晶振在异步通信中不能与外部时钟同步,需要在软件中特殊处理。 综上所述,对于一些应用程序需求较高的场景,需要使用外部晶振。如果是一些成本敏感、量产需求不高的场景,则可以使用内部晶振。 ### 回答2: STM32F1系列微控制器经过优化,采用了内部低功耗RC晶振,可取代传统的外部晶振。这种设计可以显著简化电路设计,减少外部器件的占位面积,提高系统可靠性和降低成本。STM32F1内部晶振的频率与核心时钟相同,可提供稳定的时钟信号,适用于多种工作模式下的应用场景。 在使用STM32F1内部晶振时,需要在软件编程中设置晶振的参数。首先,用户需要了解芯片的时钟结构和工作原理。然后,使用STM32时钟配置单元设置内部晶振的频率,并将外设时钟分频器配置为适当的值。在系统初始化时,需要使用时钟初始化函数来启动内部晶振,以提供稳定的时钟信号。 在确定内部晶振的频率时,用户可以根据系统需求选择不同的内部晶振频率,最大可达到72MHz。在访问外部存储器或与外部设备通信时,用户需要根据实际需求设置合适的时钟分频器。内部晶振的使用可以带来更加简洁的电路设计、更高的系统可靠性和更低的成本,以及更简单的软件编程过程。 ### 回答3: 在STM32F1中,可以选择使用内部RC振荡器作为系统时钟源,这比使用外部振荡器更便宜,更方便。使用内部RC振荡器作为时钟源的主要缺点是其稳定性低于使用外部晶体时钟源。内部RC振荡器的稳定性受到温度和电源电压的影响,该内部RC振荡器的频率随温度的变化可能会超过10%。然而,如果可以接受一些误差,那么内部RC振荡器仍然是一个合理的选择,特别是在成本敏感的应用中。 要在STM32F1使用内部RC振荡器,必须在RCC寄存器中配置时钟源。默认情况下,时钟源设置为高速外部晶体振荡器,可以通过设置位0和位1从HSI模式切换到另一种模式。将位0和位1都设置为1时,使RCC使用HSI振荡器作为系统时钟源。当使用HSI时,系统时钟频率为8MHz。 总之,STM32F1使用HSI内部RC振荡器程序非常方便和经济,但是在某些关键应用中,外部晶体振荡器应该作为时钟源以确保更好的稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值