新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32 SysTick 系統時鐘 超簡易定時器SysTick

        STM32 SysTick 系統時鐘 超簡易定時器SysTick

        作者: 時間:2016-11-13 來源:網絡 收藏
        /**

        * @brief Configures the SysTick. 系統時鐘配置函數main.c
        * @param None
        * @retval None
        */
        void SysTick_Configuration(void)
        {
        /* Setup SysTick Timer for 100 msec interrupts */
        if (SysTick_Config((SystemCoreClock) / 10))// 1/10s=100ms
        {
        /* Capture error */
        while (1);
        }

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

        NVIC_SetPriority(SysTick_IRQn, 0x0);
        }

        /**
        * @brief This function handles SysTick Handler. 系統時鐘中斷函數stm32f10x_it.c
        * @param None
        * @retval None
        */
        void SysTick_Handler(void)
        {
        /* Generate TIM1 COM event by software */
        TIM_GenerateEvent(TIM1, TIM_EventSource_COM);
        }

        SysTick_Config(SystemFrequency / 10) 函數的形參就是systick重裝定時器的值。
        systck計數頻率為每秒72000000次,所以72000次就是1/10秒,也就是100ms。

        SysTick是1個24bit遞減計數器,通過對SysTick控制與狀態寄存器的設置,可選擇HCLK時鐘(72M)或HCLK的8分頻(9M,缺省是這個)作為SysTick的時鐘源。
        SysTick的重裝寄存器決定了定時器頻率。

        若SysTick的時鐘源是72M, SystemFrequency = 72000000Hz
        所以 SysTick_Config(SystemFrequency / 1000); 就是1ms時基。
        // 1/1000 s=1ms

        關于SysTick校準寄存器的介紹(大多數情況下,我們可以不必理會它)


        校準值寄存器提供了這樣一個解決方案:它使系統即使在不同的CM3產品上運行,也能產生恒定的SysTick中斷頻率。最簡單的作法就是:直接把TENMS的值寫入重裝載寄存器,這樣一來,只要沒突破系統極限,就能做到每10ms來一次 SysTick異常。如果需要其它的SysTick異常周期,則可以根據TENMS的值加以比例計算。只不過,在少數情況下,CM3芯片可能無法準確地提供TENMS的值(如,CM3的校準輸入信號被拉低),所以為保險起見,最好在使用TENMS前檢查器件的參考手冊。
        SysTick定時器除了能服務于操作系統之外,還能用于其它目的:如作為一個鬧鈴,用于測量時間等。要注意的是,當處理器在調試期間被喊停(halt)時,則SysTick定時器亦將暫停運作。

        下面利用 SysTick 產生的 硬件延時函數 延時 dly_ms 毫秒

        /*******************************************************************************
        * Function Name : SysTickHandler
        * Description :系統時鐘,一般調教到1MS中斷一次
        *******************************************************************************/

        void SysTick_Handler(void)
        {
        if(Timer1)
        Timer1--;
        }

        /********************************************
        **函數名:SysTickDelay
        **功能:使用系統時鐘的硬延遲
        **注意事項:一般地,不要在中斷中調用本函數,否則會存在重入問題.另外如果屏蔽了全局中斷,則不要使用此函數
        ********************************************/
        volatile u16 Timer1;
        void SysTickDelay(u16 dly_ms)
        {
        Timer1=dly_ms;
        while(Timer1);
        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 日照市| 博罗县| 阿图什市| 河间市| 扬州市| 荣成市| 和静县| 苏州市| 萨迦县| 二连浩特市| 滨海县| 阳信县| 汉源县| 宁乡县| 承德市| 关岭| 澎湖县| 南郑县| 镇平县| 蚌埠市| 历史| 金沙县| 罗定市| 甘南县| 彭阳县| 雅江县| 东宁县| 华蓥市| 吕梁市| 临湘市| 河北区| 莲花县| 大英县| 正镶白旗| 东方市| 乌兰县| 商都县| 平遥县| 丹阳市| 凌源市| 博野县|