嵌入式C准确的秒表

时间:2016-04-16 11:49:24

标签: c embedded stm32

我想通过嵌入式C制作秒表,以便在ST STM32F407VG上进行编程。 我知道如何编写一个时钟程序来制作百分之一秒,但是当我使用10ms的延迟时,我知道它不准确。 我该怎么办

2 个答案:

答案 0 :(得分:5)

虽然STM32拥有许多硬件定时器,但所有 Cortex-M设备都有一个共同的SYSTICK定时器,因此最简单,最便携的方法是使用它。

以下内容创建一个1毫秒的自由运行计数器msTicks

#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++ ;
}

然后你的秒表可以用两个功能来实现:

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 ) ;
}

精度完全取决于驱动核心时钟的任何因素 - 通常是外部晶振或振荡器。内部RC振荡器不太精确 - 工厂调整为+/- 1%。您的特定部件还具有32KHz RC振荡器,用于驱动可校准的RTC,但不能用于驱动核心时钟(systick),并且与上述方法相比,便携性更低,精度更低,更复杂。 / p>

答案 1 :(得分:0)

最好的选择是使用该微控制器的内部定时器模块。您可以在数据表中探索。