新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32 入門教程 系統時鐘 SysTick

        STM32 入門教程 系統時鐘 SysTick

        作者: 時間:2016-11-21 來源:網絡 收藏
        (一) 背景介紹

        在傳統的嵌入式系統軟件按中通常實現 Delay(N) 函數的方法為:

        本文引用地址:http://www.104case.com/article/201611/319239.htm

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

        x --- 對應于 對應于 N 毫秒的循環值

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


        (二) STM32 SysTick 介紹

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

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

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

        (三) ST SysTick 庫文件

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


        (四) SystemTick 工程實戰

        外部晶振為 8 MHz,9 倍頻,系統時鐘為 72MHz,SysTick 的最高頻率為9MHz(最大為HCLK / 8),在這個條件下,把 SysTick 效驗值設置成9000,將 SysTick 時鐘設置為 9 MHz, 就能夠產生 1ms 的時間基值,即 SysTick 產生 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 中斷函數

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


        volatile vu32 TimingDelay = 0;
        vu8 TestSig = 0;

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


        第三步: 編寫 Delay 延時函數

        Delay: 系統延時函數, 使用系統時鐘操作.

        void Delay(u32 nTime)
        {

        SysTick_CounterCmd(SysTick_Counter_Enable);

        TimingDelay = nTime;

        while(TimingDelay != 0);


        SysTick_CounterCmd(SysTick_Counter_Disable);

        SysTick_CounterCmd(SysTick_Counter_Clear);
        }


        第四步: 主函數中調用 Delay

        在 Mini-STM32 開發板上有兩個 LED 燈, 分別是 PA0, PA1. 我們做個流水燈程序, 讓他們循環點亮.
        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);
        }


        (五) 仿真調試

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

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

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

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



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 汕尾市| 建德市| 阜宁县| 咸丰县| 桂阳县| 米林县| 乐清市| 高要市| 花垣县| 镇康县| 彰化县| 舟山市| 内黄县| 中宁县| 玛纳斯县| 玉树县| 江孜县| 正宁县| 定边县| 安宁市| 德钦县| 普宁市| 公主岭市| 盐池县| 东方市| 安新县| 民丰县| 龙门县| 长子县| 大新县| 石景山区| 剑阁县| 新沂市| 鹤山市| 乌恰县| 五家渠市| 曲阜市| 玛沁县| 贵南县| 庆阳市| 曲周县|