STM32F1系列-UCOSIII配置之delay_init()函数详解

时间:2024-04-06 19:37:09

一、时钟选择

STM32F1系列-UCOSIII配置之delay_init()函数详解

  • SysTick_CLKSourceConfig();选择systick时钟,函数配置的寄存器如下所示
    STM32F1系列-UCOSIII配置之delay_init()函数详解

  • 找到该函数的定义,其两个参数的数值如下
    STM32F1系列-UCOSIII配置之delay_init()函数详解
    STM32F1系列-UCOSIII配置之delay_init()函数详解

  • 该函数选择的参数是SysTick_CLKSource_HCLK_Div8,说明选择的是外部时钟源除以8,为什么是除以8呢?大家可以看中文参考手册的第六章的时钟配置,如下图所示,我们一般配置时会将AHB配置成72M,然后这个时钟会自动除以8后进入cortex内核,所以systick的时钟为9M(不要告诉我你不知道systick是内核的外设…)
    STM32F1系列-UCOSIII配置之delay_init()函数详解

二、fac_us微秒延时倍乘数配置

STM32F1系列-UCOSIII配置之delay_init()函数详解

  • 首先fac_us是个系数,不是时间,它表示1us时钟跳变次数。
    STM32F1系列-UCOSIII配置之delay_init()函数详解

  • 接着SystemCoreClock 为 72M
    STM32F1系列-UCOSIII配置之delay_init()函数详解

  • 所以 fac_us = 72M / 8M = 9, 1us时钟跳变9次

关于fac_us还存在一些问题,我移植的代码中是/8M,而我看原子哥的视频讲解时,里面却是/8。但原子哥得出的结论却是9,而不是9M,可能是由于视频函数不一样或者是以前的bug吧,反正我看现在所以的例程都是/8M的

  • 我的理解fac_us表示1us systick需要计的数。systick的时钟是SystemCoreClock的1/8。那么1us systick需要计的数不就是(SystemCoreClock/8)/10000000=SystemCoreClock/80000000了!
  • 即计数9次是1us,计数9M次则有1s。

三、reload的配置

STM32F1系列-UCOSIII配置之delay_init()函数详解

  • reload到底表面什么呢?首先我们要搞清楚的是reload的是systick的预装载值,该值决定了OS的时钟节拍。 第一句跟上面一样,计算完结果为9,然后第二句
    STM32F1系列-UCOSIII配置之delay_init()函数详解
    STM32F1系列-UCOSIII配置之delay_init()函数详解
    STM32F1系列-UCOSIII配置之delay_init()函数详解

  • delay_ostickspersec为ucosIII时钟节拍,delay_ostickspersec跟了半天发现最后的值是200,说明一秒钟有200个节拍,即一个节拍为1/200s,转化成us再乘以1000000,最后在乘以1us跳的次数9,最后结果就是滴答定时器的重装载值。

  • 看到着是不是还是有点懵,有点饶,我也是, 哈哈,那么大家可以看下下面计算时间的公式,计算完t = 1/200s,刚好是一个节拍的时间。

STM32F1系列-UCOSIII配置之delay_init()函数详解
STM32F1系列-UCOSIII配置之delay_init()函数详解

  • 其中有有句注释,给大家说明以下。如下图所示。
    STM32F1系列-UCOSIII配置之delay_init()函数详解
    STM32F1系列-UCOSIII配置之delay_init()函数详解

四、Systick寄存器配置

  • fac_ms的计算大家根据上面的公式推一推即出来了,最后就是systick寄存器的配置了。

STM32F1系列-UCOSIII配置之delay_init()函数详解