<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > STM32F051應用筆記-系統(tǒng)時間選擇及PLL倍頻設

          STM32F051應用筆記-系統(tǒng)時間選擇及PLL倍頻設

          作者: 時間:2016-11-21 來源:網絡 收藏
          對于廣大初次接觸STM32的讀者朋友(甚至是初次接觸ARM器件的讀者朋友)來說,在熟悉了開發(fā)環(huán)境的使用之后,往往“栽倒”在同一個問題上。這問題有個關鍵字叫:時鐘樹。
          眾所周知,微控制器(處理器)的運行必須要依賴周期性的時鐘脈沖來驅動——往往由一個外部晶體振蕩器提供時鐘輸入為始,最終轉換為多個外部設備的周期性運作為末,這種時鐘“能量”擴散流動的路徑,猶如大樹的養(yǎng)分通過主干流向各個分支,因此常稱之為“時鐘樹”。在一些傳統(tǒng)的低端8位單片機諸如51,AVR,PIC等單片機,其也具備自身的一個時鐘樹系統(tǒng),但其中的絕大部分是不受用戶控制的,亦即在單片機上電后,時鐘樹就固定在某種不可更改的狀態(tài)(假設單片機處于正常工作的狀態(tài))。比如51單片機使用典型的12MHz晶振作為時鐘源,則外設如IO口、定時器、串口等設備的驅動時鐘速率便已經是固定的,用戶無法將此時鐘速率更改,除非更換晶振。
          而STM32微控制器的時鐘樹則是可配置的,其時鐘輸入源與最終達到外設處的時鐘速率不再有固定的關系,而不同的外設也對應有不同的時鐘,使用任何一個外設都必須打開相應的時鐘。這樣的好處就是,如果不使用一個外設的時候,就把它的時鐘關掉,從而可以降低系統(tǒng)的功耗,達到節(jié)能,實現(xiàn)低功耗的效果。
          1、啟動代碼分析—SystemInit (void)系統(tǒng)時鐘初始化
          SystemInit (void)是系統(tǒng)初始化函數(shù),很多新手不知其在何處調用,小肖馬上為你解惑。
          startup_stm32f0xx.s文件中匯編代碼為STM32啟動代碼。
          啟動代碼步驟一般為:
          1)堆和棧的初始化;
          2)向量表定義;
          3)地址重映射及中斷向量表的轉移;
          4)設置系統(tǒng)時鐘頻率;
          5)中斷寄存器的初始化;
          6)進入主程序。
          廢話太多,估計也看煩了?,F(xiàn)在挑重點講,重點在第4個步驟。(第5、6一般編程時在用戶代碼中執(zhí)行)。
          Reset_Handler
          PROC;標記一個函數(shù)的開始,也就是復位入口。
          IMPORT
          __main ; 通知編譯器要使用的標號在其他文件
          IMPORT
          SystemInit; 同上
          關鍵在這里了,
          LDR
          R0, =SystemInit;
          這里的“=”表示LDR目前是偽指令不是標準指令。這里是把SystemInit的地址給RO。也就是說SystemInit (void)在這里被調用編譯。所以用戶編在寫程序時無需編寫PLL配置程序。
          BX
          R0;BX是ARM指令集和THUMB指令集之間程序的跳轉。
          其他省略。詳情如下圖所示:
          SystemInit初始化RCC之后調用SetSysClock(void)系統(tǒng)時鐘設置函數(shù)
          代碼如下:
          void SystemInit (void)
          {
          RCC->CR |= (uint32_t)0x00000001;
          RCC->CFGR &= (uint32_t)0xF8FFB80C;
          RCC->CR &= (uint32_t)0xFEF6FFFF;
          RCC->CR &= (uint32_t)0xFFFBFFFF;
          RCC->CFGR &= (uint32_t)0xFFC0FFFF;
          RCC->CFGR2 &= (uint32_t)0xFFFFFFF0;
          RCC->CFGR3 &= (uint32_t)0xFFFFFEAC;
          RCC->CR2 &= (uint32_t)0xFFFFFFFE;
          RCC->CIR = 0x00000000;
          SetSysClock();
          }
          2、SetSysClock()設置系統(tǒng)時鐘
          由于之前選擇定義了PLL_SOURCE_HSE,執(zhí)行條件編譯。
          RCC->CR |= ((uint32_t)RCC_CR_HSEON);//使能HSE,如下圖所示:
          等待HSE設置完畢,代碼如下。
          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;
          }
          設置完成,HSEStatus賦值1,代碼如下:
          if ((RCC->CR & RCC_CR_HSERDY) != RESET)
          {
          HSEStatus = (uint32_t)0x01;
          }
          else
          {
          HSEStatus = (uint32_t)0x00;
          }
          HSEStatus HSE==1表示HSE狀態(tài)正常,啟用緩沖區(qū)和設置FLASH延遲、HCLKPCLK。PLL倍頻如下圖紅線所示,修改RCC_CFGR_PLLMULL實現(xiàn)倍頻(默認6倍頻)。



          評論


          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();