久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 28116|回復: 0
打印 上一主題 下一主題
收起左側

STM32使用外部16MHZ晶振總結

[復制鏈接]
跳轉到指定樓層
樓主
ID:82083 發表于 2015-6-9 00:08 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  做小封裝產品設計的朋友或許知道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歡暢的運行

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久免费国产 | 一区二区三区av | 日韩中文字幕在线播放 | 成人免费观看视频 | 在线观看成人免费视频 | 国产91在线播放 | 人人艹人人爽 | 精品伊人久久 | 久久国产欧美日韩精品 | 欧美日韩久久久久 | 午夜爱爱毛片xxxx视频免费看 | 夜夜久久| 日韩欧美一区二区三区四区 | 日本黄色免费大片 | 在线91| 在线观看亚洲 | 中文字幕亚洲视频 | 亚洲精品电影在线观看 | 国产高清在线精品一区二区三区 | 国家一级黄色片 | 久久久久国产精品 | 成人精品国产 | 成人在线免费网站 | 久久久蜜桃一区二区人 | 91佛爷在线观看 | 国产日韩欧美精品一区二区 | 免费观看日韩av | 亚洲网站观看 | 91看国产| 午夜伊人| 国产高清免费视频 | 久婷婷 | 伊人色综合久久天天五月婷 | 欧美日韩免费 | 久久精品国产一区 | 精品一区二区久久久久久久网站 | 国产精品久久久亚洲 | 欧美精品一区在线发布 | 国产视频中文字幕在线观看 | 亚州国产 | 亚洲日韩中文字幕 |