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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > STM32 開發(fā)板入門教程 (三) 系統(tǒng)時鐘 SysTick

          STM32 開發(fā)板入門教程 (三) 系統(tǒng)時鐘 SysTick

          作者: 時間:2016-11-28 來源:網(wǎng)絡(luò) 收藏
          (一) 背景介紹

          在傳統(tǒng)的嵌入式系統(tǒng)軟件按中通常實現(xiàn) Delay(N) 函數(shù)的方法為:

          for(i = 0; i <=x; i ++);

          x---對應(yīng)于對應(yīng)于 N 毫秒的循環(huán)值

          對于STM32系列微處理器來說,執(zhí)行一條指令只有幾十個 ns,進行 for 循環(huán)時,要實現(xiàn) N 毫秒的 x 值非常大,而且由于系統(tǒng)頻率的寬廣,很難計算出延時N 毫秒的精確值。針對 STM32 微處理器,需要重新設(shè)計一個新的方法去實現(xiàn)該功能,以實現(xiàn)在程序中使用 Delay(N)。


          (二) STM32 SysTick 介紹

          Cortex-M3 的內(nèi)核中包含一個 SysTick 時鐘。SysTick 為一個 24 位遞減計數(shù)器,SysTick 設(shè)定初值并使能后,每經(jīng)過 1 個系統(tǒng)時鐘周期,計數(shù)值就減 1。計數(shù)到 0 時,SysTick 計數(shù)器自動重裝初值并繼續(xù)計數(shù),同時內(nèi)部的 COUNTFLAG 標(biāo)志會置位,觸發(fā)中斷 (如果中斷使能情況下)。

          在 STM32 的應(yīng)用中,使用 Cortex-M3 內(nèi)核的 SysTick 作為定時時鐘,設(shè)定每一毫秒產(chǎn)生一次中斷,在中斷處理函數(shù)里對 N 減一,在Delay(N) 函數(shù)中循環(huán)檢測 N 是否為 0,不為 0 則進行循環(huán)等待;若為 0 則關(guān)閉 SysTick 時鐘,退出函數(shù)。

          注: 全局變量 TimingDelay , 必須定義為 volatile 類型 , 延遲時間將不隨系統(tǒng)時鐘頻率改變。



          (三) ST SysTick 庫文件

          使用ST的函數(shù)庫使用systick的方法
          1、調(diào)用SysTick_CounterCmd()-- 失能SysTick計數(shù)器
          2、調(diào)用SysTick_ITConfig ()-- 失能SysTick中斷
          3、調(diào)用SysTick_CLKSourceConfig()-- 設(shè)置SysTick時鐘源。
          4、調(diào)用SysTick_SetReload()-- 設(shè)置SysTick重裝載值。
          5、調(diào)用SysTick_ITConfig ()-- 使能SysTick中斷
          6、調(diào)用SysTick_CounterCmd()-- 開啟SysTick計數(shù)器


          (四) SystemTick 工程實戰(zhàn)

          外部晶振為 8 MHz,9 倍頻,系統(tǒng)時鐘為 72MHz,SysTick 的最高頻率為9MHz(最大為HCLK / 8),在這個條件下,把 SysTick 效驗值設(shè)置成9000,將 SysTick 時鐘設(shè)置為 9 MHz, 就能夠產(chǎn)生 1ms 的時間基值,即 SysTick 產(chǎn)生 1ms 的中斷。


          RCC_Configuration();
          SysTick_Configuration();


          第一步: 配置 RCC 寄存器 和 SysTick 寄存器

          RCC_Configuration: 配置 RCC 寄存器
          void RCC_Configuration(void)
          {

          RCC_DeInit();


          RCC_HSEConfig(RCC_HSE_ON);


          HSEStartUpStatus = RCC_WaitForHSEStartUp();

          if(HSEStartUpStatus == SUCCESS)
          {

          RCC_HCLKConfig(RCC_SYSCLK_Div1);


          RCC_PCLK2Config(RCC_HCLK_Div1);


          RCC_PCLK1Config(RCC_HCLK_Div2);


          FLASH_SetLatency(FLASH_Latency_2);

          FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);


          RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);


          RCC_PLLCmd(ENABLE);


          while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
          {
          }


          RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);


          while(RCC_GetSYSCLKSource() != 0x08)
          {
          }
          }


          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |
          RCC_APB2Periph_AFIO, ENABLE);
          }



          SysTick_Configuration: 配置 SysTick
          void SysTick_Configuration(void)
          {

          SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);


          NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick, 3, 0);


          SysTick_SetReload(72000);


          SysTick_ITConfig(ENABLE);
          }



          第二步: 配置 SysTick 中斷函數(shù)

          這里我們定義了一個 TestSig 全局變量, 用于我們使用 Keil 軟件自帶的邏輯分析儀來分析.


          volatile vu32 TimingDelay = 0;
          vu8 TestSig = 0;

          void SysTickHandler(void)
          {
          TimingDelay--;
          if(TimingDelay % 2)
          {
          TestSig = 1;
          }
          else
          {
          TestSig = 0;
          }
          }


          第三步: 編寫 Delay 延時函數(shù)

          Delay: 系統(tǒng)延時函數(shù), 使用系統(tǒng)時鐘操作.

          void Delay(u32 nTime)
          {

          SysTick_CounterCmd(SysTick_Counter_Enable);

          TimingDelay = nTime;

          while(TimingDelay != 0);


          SysTick_CounterCmd(SysTick_Counter_Disable);

          SysTick_CounterCmd(SysTick_Counter_Clear);
          }


          第四步:主函數(shù)中調(diào)用 Delay

          在 Mini-STM32 開發(fā)板上有兩個 LED 燈, 分別是 PA0, PA1. 我們做個流水燈程序, 讓他們循環(huán)點亮.
          while(1)
          {
          GPIO_SetBits(GPIOA,GPIO_Pin_0);
          Delay(100);
          GPIO_ResetBits(GPIOA,GPIO_Pin_0);
          Delay(100);
          GPIO_SetBits(GPIOA,GPIO_Pin_1);
          Delay(100);
          GPIO_ResetBits(GPIOA,GPIO_Pin_1);
          Delay(100);
          }


          (五) 仿真調(diào)試

          把工程通過后, 進入軟件仿真
          如下圖所示:點擊工程快捷菜單的邏輯分析儀

          在邏輯分析儀中我們點擊 Setup 按鍵會彈出安裝對話框.
          點右上方的 "新建" 圖標(biāo), 在菜單中輸入 "TestSig" 這個全局變量.
          添加完之后就可以點 Close 了. 如果您仿真完可以點擊 左下方的 "Kill All" 刪除所有監(jiān)視變量.

          全速運行后就可以看到下面的波形了哦


          如果你使用仿真器在 Mini-STM32 上調(diào)試的話你還可以看到兩個 LED 在跑跑馬燈程序了.
          到此我們這章節(jié)的教程就結(jié)束了, 相信大家也掌握了 System Tick 的用法了.


          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁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); })();