硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2724|回复: 7
收起左侧

为啥systick的定时器值,非要减去1?

[复制链接]

41

主题

215

回帖

338

积分

高级会员

积分
338
发表于 2021-3-16 16:30:07 | 显示全部楼层 |阅读模式
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
  if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */

SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* set reload register */
  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Cortex-M0 System Interrupts */
  SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
                   SysTick_CTRL_TICKINT_Msk   |
                   SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */
  return (0);                                                               /* Function successful */
}
比如说时钟168M,定时1us,tick=168,这是个倒计时的,计数到0就产生中断。为啥ticks要减去1,放到SysTick->LOAD中?

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2021-3-16 16:59:50 | 显示全部楼层
从0开始计数的。比如计数10次,计到9就可以了。
回复

使用道具 举报

41

主题

215

回帖

338

积分

高级会员

积分
338
 楼主| 发表于 2021-3-16 17:17:14 | 显示全部楼层
哦。您的意思是说计数0,也经过了一段时间? 计数0也要算时间,这真的是让人费解。
回复

使用道具 举报

2

主题

73

回帖

84

积分

初级会员

积分
84
发表于 2021-3-16 19:46:34 | 显示全部楼层
snakeemail 发表于 2021-3-16 17:17
哦。您的意思是说计数0,也经过了一段时间? 计数0也要算时间,这真的是让人费解。

从 9 跳到 0,这里难道不是也有一个 TICK ?
回复

使用道具 举报

5

主题

133

回帖

148

积分

初级会员

积分
148
发表于 2021-3-17 16:38:09 | 显示全部楼层
计数到0之后 tick不是立马变成167的,也就是说从0到167也是一个tick
回复

使用道具 举报

41

主题

215

回帖

338

积分

高级会员

积分
338
 楼主| 发表于 2021-3-17 17:34:52 | 显示全部楼层
tsetse 发表于 2021-3-16 19:46
从 9 跳到 0,这里难道不是也有一个 TICK ?

设1个tick是1秒。
如果要定时2秒,写到SysTick->LOAD = 2-1.
过了1秒钟,这个SysTick->LOAD变成0,然后发生中断。
我就是这里没想过来。
回复

使用道具 举报

2

主题

73

回帖

84

积分

初级会员

积分
84
发表于 2021-3-18 08:55:35 | 显示全部楼层
snakeemail 发表于 2021-3-17 17:34
设1个tick是1秒。
如果要定时2秒,写到SysTick->LOAD = 2-1.
过了1秒钟,这个SysTick->LOAD变成0,然后 ...

COUNTER 初始值是 0,LOAD 你预设了 167,开始计数后,从 0 变成 167 已经计了1次,然后再自减 167 次
回复

使用道具 举报

0

主题

125

回帖

125

积分

初级会员

积分
125
发表于 2021-3-23 13:54:29 | 显示全部楼层
最后一个计算是用来SetEvent及更新状态寄存器, 所以要减一, 否则计算100次, 后再用一个时钟周期通知你及更新状态寄存器, 就变成延迟一个了时钟
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-17 15:24 , Processed in 0.170308 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表