STM32使用外部16MHZ晶振总结

做小封装产品设计的朋友或许知道3225-4PIN的晶振,为何8MHZ晶振批量价格要到2元一片,而16MHZ晶振只需要0.4元甚至更少。究其原因是因为3225封装的晶振目前全球最低频率一般为8MHZ,而国内8MHZ达不到精度指标,所以市场上的8MHZ晶振一般为进口晶振,因此成本被垄断。

    
图1  3225封装晶振
   STM32单片机学习者一开始用的晶振一般是2PIN的8MHZ晶振,一旦正真做产品研发的时候,使用到3225的8MHZ晶振的话,成本是个不小的挑战。笔者现针对这个问题,提出使用16MHZ晶振代替的方法。

图2  STM32时钟树状图
   由上图可以看出,如果想兼容8MHZ晶振,必须在时钟倍频前2分频。程序设计如下,在system_stm32f10x.c文件下修改系统时钟配置,配置为72MHZ。

图3  系统时钟配置
   修改SetSysClockTo72(void)文件如下:

static void SetSysClockTo72(void)
{
  __IO uint32_t StartUpCounter = 0, HSEStatus =0;

    
    
  RCC->CR |= ((uint32_t)RCC_CR_HSEON);


  do
  {
    HSEStatus =RCC->CR & RCC_CR_HSERDY;
   StartUpCounter++; 
  } while((HSEStatus == 0) &&(StartUpCounter != HSE_STARTUP_TIMEOUT));
  if ((RCC->CR & RCC_CR_HSERDY) !=RESET)
  {
    HSEStatus =(uint32_t)0x01;
  }
  else
  {
    HSEStatus =(uint32_t)0x00;
  } 
  if (HSEStatus == (uint32_t)0x01)
  {
   
   FLASH->ACR |= FLASH_ACR_PRFTBE;
   
   FLASH->ACR &=(uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
   FLASH->ACR |=(uint32_t)FLASH_ACR_LATENCY_2;   

   
    RCC->CFGR|= (uint32_t)RCC_CFGR_HPRE_DIV1;
     
   
    RCC->CFGR|= (uint32_t)RCC_CFGR_PPRE2_DIV1;
   
   
    RCC->CFGR|= (uint32_t)RCC_CFGR_PPRE1_DIV2;
#ifdef STM32F10X_CL
   
   
   
       
   RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 |RCC_CFGR2_PLL2MUL |
                             RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);
   RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 |RCC_CFGR2_PLL2MUL8 |
                            RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);

   
    RCC->CR|= RCC_CR_PLL2ON;
   
   while((RCC->CR & RCC_CR_PLL2RDY) == 0)
    {
    }
   
       RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC| RCC_CFGR_PLLMULL);
    RCC->CFGR|= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1|
                           RCC_CFGR_PLLMULL9);
#else   
   
    //16MHZ2分频如下改动,添加RCC_CFGR_PLLXTPRE_HSE_Div2
    RCC->CFGR&= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE|
                                        RCC_CFGR_PLLXTPRE_HSE_Div2 |RCC_CFGR_PLLMULL));
    RCC->CFGR|= (uint32_t)( RCC_CFGR_PLLXTPRE_HSE_Div2  | RCC_CFGR_PLLSRC_HSE |RCC_CFGR_PLLMULL9);
#endif
   
    RCC->CR|= RCC_CR_PLLON;
   
   while((RCC->CR & RCC_CR_PLLRDY) == 0)
    {
    }
   
   
    RCC->CFGR&= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
    RCC->CFGR|=(uint32_t)RCC_CFGR_SW_PLL;   
   
    while((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) !=(uint32_t)0x08)
    {
    }
  }
  else
  {
  }
}

   到此,很多读者认为设计已经完毕,这个系统也如愿地倍频至72MHZ了,但忽略了一个小细节。我们需要修改stm32f10x.h文件里面的外部时钟宏定义,有一些外设的时钟是直接使用外部时钟配置的,比如串口等。
          
#if !defined  HSE_VALUE
#ifdefSTM32F10X_CL  
  #defineHSE_VALUE   ((uint32_t)25000000)
#else
  #defineHSE_VALUE   ((uint32_t) 16000000 )
#endif
#endif

   至此,程序修改完毕。整个系统围绕8MHZ倍频至72MHZ欢畅的运行
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F207是一款32位的ARM Cortex-M3微控制器,它可以通过外部晶振来提供系统时钟。下面是配置和使用STM32F207外部晶振的步骤: 1. 确定晶振参数:首先,你需要确定外部晶振的频率和稳定性要求。通常,晶振的频率可以选择为8MHz、12MHz16MHz等。根据你的需求选择合适的晶振。 2. 连接晶振:将晶振的两个引脚连接到STM32F207微控制器上的相应引脚。通常,晶振的一个引脚连接到微控制器的晶振输入引脚(例如PC14),另一个引脚连接到晶振输出引脚(例如PC15)。 3. 配置时钟源:在使用外部晶振之前,需要配置时钟源。可以通过RCC(Reset and Clock Control)模块来配置。具体步骤如下: a. 启用外部晶振作为主时钟源:设置RCC_CFGR寄存器的SW位为10,表示选择外部晶振作为主时钟源。 b. 配置PLL(Phase-Locked Loop):如果需要更高的系统时钟频率,可以使用PLL来倍频外部晶振频率。设置RCC_CFGR寄存器的PLLSRC位为1,表示选择外部晶振作为PLL输入源。然后,设置RCC_CFGR寄存器的PLLM和PLLN位来配置PLL的分频和倍频系数。 c. 等待PLL稳定:在配置完PLL后,需要等待PLL稳定。可以通过检查RCC_CR寄存器的PLLRDY位来判断PLL是否稳定。 4. 配置系统时钟:配置完时钟源后,需要将系统时钟配置为所需的频率。可以通过设置FLASH_ACR寄存器的LATENCY位来配置Flash访问延迟。然后,设置RCC_CFGR寄存器的HPRE、PPRE1和PPRE2位来配置AHB、APB1和APB2总线的分频系数。 5. 启动外部晶振:最后,启动外部晶振。可以通过设置RCC_CR寄存器的HSEON位来启动外部晶振。 以上是配置和使用STM32F207外部晶振的基本步骤。具体的配置寄存器和位操作可以参考STM32F207的参考手册和相关资料。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值