c-使用24位差的SysTick代码意味着什么



我是ARM Cortex M MCU编程的新手。在使用SysTick功能时,我发现了这个功能来检查计时。然而,我没有得到第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...
}

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

他们正在做一个24位减法,通过做一个32位减法,然后将额外的8位设置为0。

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

因为最后&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;
}

相关内容

  • 没有找到相关文章