使用24位差的SysTick代码是什么意思?
What does the SysTick code using 24-bit difference mean?
我是 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...
}
因为 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 位变量(至少这个编译器没有)。
他们正在做 24 位减法,通过做 32 位减法,然后将额外的 8 位设置为 0。
将额外位设置为 0 很重要,因为在 16777215(所有位设置为 1)之后,计数器重置为 0(所有位设置为 0)。如果你只是减去它们,你会看到 1 - 16777215 是 -16777214(有符号)或 4278190082(无符号),但正确答案是 2 个报价发生在报价 16777215 和报价 1 之间。
我是 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...
}
因为 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 位变量(至少这个编译器没有)。
他们正在做 24 位减法,通过做 32 位减法,然后将额外的 8 位设置为 0。
将额外位设置为 0 很重要,因为在 16777215(所有位设置为 1)之后,计数器重置为 0(所有位设置为 0)。如果你只是减去它们,你会看到 1 - 16777215 是 -16777214(有符号)或 4278190082(无符号),但正确答案是 2 个报价发生在报价 16777215 和报价 1 之间。