在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 系統(tǒng)滴答SysTick兩種實現(xiàn)方式

            系統(tǒng)滴答SysTick兩種實現(xiàn)方式

            作者: 時間:2016-11-17 來源:網(wǎng)絡(luò) 收藏
            其實系統(tǒng)滴答就是一個24位的倒計時定時器,而且能夠自動裝置。儀器8位單片機如AVR/51要跑操作系統(tǒng),需要專門占用一個定時器,但是由于優(yōu)先級的原因很容易被其他程序打亂。而STM32以Cortex M3為內(nèi)核,它專門開辟了一個硬件定時器,具有很高的優(yōu)先級,即使在系統(tǒng)處于睡眠狀態(tài)也能工作。我們使用系統(tǒng)滴答點亮LED燈的方法有兩種:

            第一種方法:就是將系統(tǒng)滴答作為普通的定時器,采用查詢的方法。首先使用SysTick->LOAD裝置初值,即要倒計的值。然后時鐘SysTick->CTRL控制寄存器使能計數(shù)器工作在連拍模式,也就是計數(shù)減到0的時候,會出現(xiàn)一個標(biāo)志位:COUNTFLAG,然后在使用while不斷地查詢這一位。按照這種編程方法封裝的文件代碼為:

            本文引用地址:http://www.biyoush.com/article/201611/315438.htm

            SYSTICK.C

            #include "systick.h"

            //延時Nms

            //注意Nms的范圍

            //Nms<=0xffffff*8/SYSCLK

            //對72M條件下,Nms<=1864

            void delay_ms(u16 Nms)

            {

            SysTick->LOAD=(u32)Nms*9000; //給重裝載寄存器賦值,9000時,將產(chǎn)生1ms的時基

            SysTick->CTRL|=0x01; //開始倒數(shù)

            while(!(SysTick->CTRL&(1<<16))); //等待時間到達(dá)

            SysTick->CTRL=0X00000000; //關(guān)閉計數(shù)器

            SysTick->VAL=0X00000000; //清空計數(shù)器

            }

            //延時us

            void delay_us(u32 Nus)

            {

            SysTick->LOAD=Nus*9; //時間加載

            SysTick->CTRL|=0x01; //開始倒數(shù)

            while(!(SysTick->CTRL&(1<<16)));//等待時間到達(dá)

            SysTick->CTRL=0X00000000; //關(guān)閉計數(shù)器

            SysTick->VAL=0X00000000; //清空計數(shù)器

            }

            SYSTICK.H

            #ifndef __SYSTICK_H

            #define __SYSTICK_H

            #include "stm32f10x_conf.h"

            void delay_ms(u16 Nms);

            void delay_us(u32 Nus);

            #endif

            第二種方法:中斷的方法。程序調(diào)用core_cm3.c里的SysTick_Config的函數(shù),方便不同cortex M3處理之間的移植。里面設(shè)置裝置寄存器,內(nèi)核時鐘,向下計數(shù)到0導(dǎo)致systick 中斷,和使能寄存器。

            SysTick_Config的函數(shù)定義為

            static __INLINE uint32_t SysTick_Config(uint32_t ticks)

            {

            if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */

            SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */

            NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */

            SysTick->VAL = 0; /* Load the SysTick Counter Value */

            SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |

            SysTick_CTRL_TICKINT_Msk |

            SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */

            return (0); /* Function successful */

            }

            #endif

            這里要注意的是系統(tǒng)滴答是24位寄存器,不能超過2的24次方,大約16M左右,所以我這里設(shè)置的是:系統(tǒng)時鐘的五分之一,14.4M。

            SysTick_Config(SystemCoreClock/5);//這樣每隔0.2s中斷發(fā)生一次

            主要程序代碼為:

            unsigned char num=0;//第幾盞燈亮

            void LED_Spark(void)

            {

            switch(num++)

            {

            case 0://燈1亮

            LED1_ON();LED2_OFF();LED3_OFF();LED4_OFF();

            break;

            case 1://燈2亮

            LED1_OFF();LED2_ON();LED3_OFF();LED4_OFF();

            break;

            case 2://燈3亮

            LED1_OFF();LED2_OFF();LED3_ON();LED4_OFF();

            break;

            case 3://燈4亮

            LED1_OFF();LED2_OFF();LED3_OFF();LED4_ON();

            break;

            default://全滅

            num=0;LED1_OFF();LED2_OFF();LED3_OFF();LED4_OFF();

            break;

            }

            }

            int main(void)

            {

            /* Setup STM32 system (clock, PLL and Flash configuration) */

            SystemInit();

            /* Add your application code here

            */

            LED_Configuration();

            SysTick_Config(SystemCoreClock/5);//每隔0.2s中斷調(diào)用一次

            NVIC_SetPriority(SysTick_IRQn, 0x0);//設(shè)置優(yōu)先級

            /* Infinite loop */

            while (1)

            {

            }

            }



            評論


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

            關(guān)閉