2016-04-16 43 views
2

我想通過嵌入式C做一個秒錶來編程ST STM32F407VG。 我知道如何編寫一個時鐘程序來製作百分之一秒,但我知道這將不準確,當我使用10ms的延遲。 我應該怎麼辦嵌入式精確計時秒錶C

+2

'多達17個定時器:多達12個16位和兩個32位定時器,最高168 MHz,每個定時器最多4個IC/OC/PWM或脈衝計數器和正交(增量)編碼器輸入'我確定你可以管理好10ms以上.... –

+1

爲什麼你「知道」它不準確?這完全取決於你如何實現延遲。該器件具有與您的時鐘源一樣精確的硬件定時器。 – Clifford

回答

5

雖然STM32被賦予了許多硬件定時器,所有 Cortex-M的設備都有一個共同的SYSTICK計時器,所以最簡單和最便攜的方法是使用。

下面創建一個1個毫秒週期內自由運行計數器msTicks

static uint32_t start_time ; 
void start(void) 
{ 
    start_time = msTicks ; 
} 

uint32_t getMillisecondsSinceStart(void) 
{ 
    return msTicks - start_time ; 
} 

例如::

bool running = false ; // needs <stdbool.h> included 
uint32_t time_millisec = 0 ; 

for(;;) 
{ 
    if(startButtonPressed()) 
    { 
     running = true ; 
     start() ; 
    } 

    if(stopButtonPressed()) 
    { 
     running = false ; 
    } 

    if(running) 
    { 
     time_millisec = getMillisecondsSinceStart() ; 
    } 

    displayTime(time_millisec) ; 
} 

#include "stm32f4xx.h" 
#include <stdint.h> 

static volatile uint32_t msTicks = 0; // Milliseconds 

int main(void) 
{ 
    SysTick_Config(SystemCoreClock/1000) ; // 1ms interrupt 

    for(;;) 
    { 
     ... // your code here 
    } 
} 

// SYSTICK interrupt handler 
void SysTick_Handler(void) 
{ 
    msTicks++ ; 
} 

那麼你的秒錶可以具有兩個功能從而實現

準確性將完全取決於駕駛c礦石時鐘 - 通常是外部晶體或振盪器。內部RC振盪器精度會降低 - 工廠調整爲+/- 1%。您的特定部件還具有一個32KHz RC振盪器,用於驅動可校準的RTC,但不能用於驅動核心時鐘(systick),並且與上述方法相比,其便攜性更小,精度更低且更復雜。