1. 程式人生 > >嵌入式常用模組——軟定時器

嵌入式常用模組——軟定時器

文章目錄

硬體的資源總是緊張的,用這些有限的資源去做更多的事情,這大概就是每個硬體工程師一直在計較的事情了吧。定時器應該是很常用的一個功能了,很多地方都需要。然而硬定時器就那麼幾個。所以面對一些對時間精度要求沒那麼高的地方,軟定時器就很有用了。

簡單描述

所謂軟定時器,不過藉助硬定時器產生一個累積計數值。然後以此為基準生出若干個不太準確的軟定時器。為什麼不準確呢 因為他可能被其他中斷服務打斷,因此存在一定的遲滯。但是對於一些對時間精度不是很敏感的場景來說 這點遲滯是可以接受的。

實現原理及流程

建一個全域性變數timeCount使用一個硬體定時器,設定一個比較小的定時值,比如1ms。,然後在中斷服務函式中對這個全域性做自增運算。這樣我們的時基就有了,接下來是啟動定時器函式,就是獲取當前timeCount

的值並儲存。然後就是觸發定時,假定定時值是40ms。每次迴圈中判斷,當前的timeCount值減去啟動定時器函式時儲存的值大於等於40時候,就開始執行定時任務。大概就這麼一個思路。

程式碼

程式碼上需要注意的一點就是全域性變數用volatile修飾,原因百度。
time.c檔案

struct etimer {
    uint32_t start;
};

extern volatile unsigned int Millisecond_Counter;
uint32_t timer_milliseconds(
    void)
{
    return Millisecond_Counter;
} void timer_elapsed_start( struct etimer *t) { uint32_t now = timer_milliseconds(); if (t) { t->start = now; } } uint32_t timer_elapsed_time( struct etimer *t) { uint32_t now = timer_milliseconds(); uint32_t delta = 0; if (t) { delta = now - t->
start; } return delta; } bool timer_elapsed_milliseconds( struct etimer *t, uint32_t milliseconds) { return (timer_elapsed_time(t) >= milliseconds); }

user.c檔案,我這麼用的 當然你也可以不加這層函式直接用timer_elapsed_start和timer_elapsed_milliseconds也是一樣的(嗯 會省一層呼叫)。

struct etimer Silence_UartTimer;
static void uart_silence_reset(void)
{
    timer_elapsed_start(&Silence_UartTimer);
}
static bool uart_silence_elapsed(uint32_t interval)
{
    return timer_elapsed_milliseconds(&Silence_UartTimer, interval);
}

硬體定時器中斷,這裡我用的stm32,定時用的系統滴答 定時1ms,只有中斷服務函式,關於配置初始化自行解決吧。

volatile unsigned int Millisecond_Counter;
void SysTickHandler(void)
{
	Millisecond_Counter++;
}

應該是沒錯的,有錯的話留言或者自己直接解決吧 我相信你!