嵌入式常用模組——軟定時器
阿新 • • 發佈:2018-12-14
文章目錄
嗯
硬體的資源總是緊張的,用這些有限的資源去做更多的事情,這大概就是每個硬體工程師一直在計較的事情了吧。定時器應該是很常用的一個功能了,很多地方都需要。然而硬定時器就那麼幾個。所以面對一些對時間精度要求沒那麼高的地方,軟定時器就很有用了。
簡單描述
所謂軟定時器,不過藉助硬定時器產生一個累積計數值。然後以此為基準生出若干個不太準確的軟定時器。為什麼不準確呢 因為他可能被其他中斷服務打斷,因此存在一定的遲滯。但是對於一些對時間精度不是很敏感的場景來說 這點遲滯是可以接受的。
實現原理及流程
建一個全域性變數timeCount使用一個硬體定時器,設定一個比較小的定時值,比如1ms。,然後在中斷服務函式中對這個全域性做自增運算。這樣我們的時基就有了,接下來是啟動定時器函式,就是獲取當前timeCount
程式碼
程式碼上需要注意的一點就是全域性變數用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++;
}
應該是沒錯的,有錯的話留言或者自己直接解決吧 我相信你!