繁体   English   中英

使用 24 位差异的 SysTick 代码是什么意思?

[英]What does the SysTick code using 24-bit difference mean?

我是编程 ARM Cortex M MCU 的新手。 在使用 SysTick 功能时,我遇到了这个 function 来检查计时。 但是我没有得到第 5 行的代码。 关于24位差异的一个。 为什么他们在那条线上做一个按位运算符? 它应该做什么?

 unsigned long Last;     // 24-bit time at previous call (12.5ns)
 unsigned long Elapsed;  // 24-bit time between calls (12.5ns)
void Action(void){      // function under test
  Now = NVIC_ST_CURRENT_R;         // what time is it now?
  Elapsed = (Last-Now)&0x00FFFFFF; // 24-bit difference
  Last = Now;                      // set up for next...
}

因为 Last & Elapsed 有 24 位(3 字节)的有意义数据,但它们是 32 位(4 字节),您需要将最高有效 8 位归零。

... & 0x00ffffff做到了。

你也可以

typedef struct 
{
    uint32_t cnt:24;
}SYSTICK_cnt_t;


uint32_t GetElapsed(uint32_t Now, uint32_t Start)
{
    SYSTICK_cnt_t t = {Now - Start};

    return t.cnt;
}

计数器是 24 位的,但是当你读取它时,你会得到 32 位,因为 C 没有 24 位变量(至少在这个编译器中没有)。

他们通过执行 32 位减法然后将额外的 8 位设置为 0 来执行 24 位减法。

将额外的位设置为 0 很重要,因为在 16777215(所有位设置为 1)之后,计数器重置为 0(所有位设置为 0)。 如果你只是减去它们,你会看到 1 - 16777215 是 -16777214(有符号)或 4278190082(无符号),但正确的答案是在 16777215 和 1 之间发生了 2 个刻度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM