首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用24位差的SysTick代码是什么意思?

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

Stack Overflow用户
提问于 2020-07-17 22:24:50
回答 2查看 110关注 0票数 1

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

代码语言:javascript
复制
 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...
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-17 23:17:31

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

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

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

票数 1
EN

Stack Overflow用户

发布于 2020-07-17 22:34:43

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

... & 0x00ffffff可以做到这一点。

您还可以

代码语言:javascript
复制
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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62956028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档