0

我第一次使用 Systick 使用 samd21e15b,所以我的目标是能够计算延迟之间的时间。所以这就是我尝试做的

SysTick->CTRL = 0;
SysTick->LOAD = 0x7A11FFul;
SysTick->VAL = 0;
SysTick->CTRL = 0x5;
while(SysTick->VAL == 0);
uint32_t start = SysTick->VAL;
delay_ms(1000);
uint32_t stop = SysTick->VAL;
uint32_t volatile temps = start - stop;

所以我设置SysTick->LOAD = 0x7A11FFul是因为我的 CPU 以 8Mhz 运行并且我想要 1s 滴答声,所以来自这个数学

N = (SysTick 延迟时间/系统时钟周期) - 1

=(SysTick 延迟时间 * 系统时钟频率) - 1

= (1s * 8MHz) - 1 = 8M - 1 = 7,999,99

因此,如果我的 cpu 以 8MHz 运行,我每 125ns 有一个 cpu 周期,对吗?但是如果我检查temps变量我有一个311延迟 1s 后的值,我不明白这个值

4

1 回答 1

1

一些问题:

  • 在 SAM 部件上,您首先必须配置通用时钟设置和各种“GCLK”选项,但假设已经完成并且您确实有一个运行在 8MHz 的时钟,那么一个滴答声确实是 125ns。

  • LOAD寄存器想要,delay / frequency - 1所以如果我们想要 1s 那么 1 / 125x10 -9 = 8x10 6

    因此:SysTick->LOAD = 8000000u - 1。我们想要以正常的以 10 为基数的自记录代码。没有神秘的十六进制魔法数字。并在评论中记录您从何处获得此号码!

    我不确定将 SysTick 设置为使用 1s 是否有意义——我总是将其设置为 1ms。否则我不确定像delay_ms(1000);.

  • while(SysTick->VAL == 0);我不明白你为什么这样做,你会在那里引入时钟不准确。时钟应该在您启用它后立即开始运行。

    这又不是用“幻数”而是命名常量来完成的。使用 ASF 并假设外部时钟的示例:

    SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | 
                    SysTick_CTRL_ENABLE_Msk;
    
  • start - stop错了,时钟向上计数。你会想要stop - start的。

于 2021-09-14T14:44:19.453 回答