打印
[应用相关]

SysTick仔细探究

[复制链接]
392|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
刚开始使用SysTick这个滴答时,也没有仔细想它是怎么来的,只是照葫芦画瓢,若是做项目的话,用它来分配时间片最好,设定每个时间片用来干什么,轮询查看,这样才不耽误系统的时间。

使用特权

评论回复
沙发
和下土|  楼主 | 2021-3-28 23:15 | 只看该作者

刚开始使用SysTick这个滴答时,也没有仔细想它是怎么来的,只是照葫芦画瓢,若是做项目的话,用它来分配时间片最好,设定每个时间片用来干什么,轮询查看,这样才不耽误系统的时间。
   3 SysTick仔细探究
      首先看STM官方芯片资料,上面真正涉及到得很少,其中在系统时钟树有个简单的说明如下:

使用特权

评论回复
板凳
和下土|  楼主 | 2021-3-28 23:16 | 只看该作者

使用特权

评论回复
地板
和下土|  楼主 | 2021-3-28 23:17 | 只看该作者
手册如下说明: RCC通过AHB时钟(HCLK)8分频后作为Cortex系统定时器(SysTick)的外部时钟。通过对SysTick控制与状态寄存器的设置,可选择上述时钟或Cortex(HCLK)时钟作为SysTick时钟。通过这句话,可以看出SysTick时钟的来源,从图上也可以详细的看出SysTick是经过8分频得来的,这样好理解了,我们在手册上再仔细找,很能找到一句话:系统嘀嗒校准值固定为9000,当系统嘀嗒时钟设定为9MHz(HCLK/8的最大值),产生1ms时间基准。简单的说,我们把SysTick设置为9000时,就能产生1ms时间基准,说的明白点就是一个中断信号。

使用特权

评论回复
5
和下土|  楼主 | 2021-3-28 23:18 | 只看该作者
计算一下:
                   系统的晶振是8MHZ,PLL9倍频以后为8MHZ*9=72MHz,然后经过8分频为9MHZ,即给systick分配的时钟9MHz,接下来我们再计算,一个计数周期的时间为1/9000000S, 这样写更容易明白点,我要计时1ms的话,即1/1000s的时间,(1/1000)/(1/9000000)=9000,可以看出我们要计时1ms的话设置为9000是这样得来的。其实上面的公式自己可以推导一下,设系统的时钟频率为SystemFrequency,我们要给滴答定时器设置的值为SystemFrequency / (1/时间基准)。例如1ms的设置72000000 / (1/0.001S)=9000.通过这里我们可以很容易的分配时间。注意设置的时候不要超过24位的最大值0xffffff.

使用特权

评论回复
6
和下土|  楼主 | 2021-3-28 23:19 | 只看该作者
  其中在库中有专门的配置函数如下:
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
  if (ticks > SYSTICK_MAXCOUNT)  return (1);                                                /* Reload value impossible */

  SysTick->LOAD  =  (ticks & SYSTICK_MAXCOUNT) - 1;                                         /* set reload register */
  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);                               /* set Priority for Cortex-M0 System Interrupts */
  SysTick->VAL   =  (0x00);                                                                 /* Load the SysTick Counter Value */
  SysTick->CTRL = (1 << SYSTICK_CLKSOURCE) | (1<<SYSTICK_ENABLE) | (1<<SYSTICK_TICKINT);    /* Enable SysTick IRQ and SysTick Timer */
  return (0);                                                                               /* Function successful */
}

使用特权

评论回复
7
和下土|  楼主 | 2021-3-28 23:19 | 只看该作者
看这个函数就很好理解,配置好要基准的时间,就等中断发生吧。
void SysTick_Handler(void)
{
}

使用特权

评论回复
8
和下土|  楼主 | 2021-3-28 23:20 | 只看该作者
在中断函数,我们可以划分时间片,不要使CPU空等待.也就是到达你想要的那个时间就执行你想做的动作,主要不超出时间片的时间就行。今晚就先总结到这里,简单的知识写出来容易理解一些,反复来回进度有点慢了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

92

主题

1048

帖子

0

粉丝