打印
[应用相关]

STM32学习之路

[复制链接]
401|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
SysTick时钟,俗称“嘀嗒定时器”,这家伙能按固定的时间产生一次中断,通常是多长时间产生一次中断呢?官方给出的一个时间是1ms
那么,它是怎么准确的产生1ms的呢.. 先来看看这家伙在时钟树的哪里吧。

使用特权

评论回复
沙发
实际测量不符|  楼主 | 2021-4-26 22:06 | 只看该作者
是它,是它,就是它,红色框里的东东,可以看到,它是由HCLK/8得到的,也就是:72MHz/8=9MHz

我们还能在STM32手册上找到这么一句话:系统嘀嗒校准值固定位9000,当系统嘀嗒时钟设为9MHz,产生1ms时间基准.

让我们来看看9000是怎么来的,这里要看下SysTick寄存器的配置了

使用特权

评论回复
板凳
实际测量不符|  楼主 | 2021-4-26 22:07 | 只看该作者

使用特权

评论回复
地板
实际测量不符|  楼主 | 2021-4-26 22:07 | 只看该作者
当然,这个图截得真他妈丑..不过来是可以看到SysTick共有4个寄存器.下面的图盗自别人的博客的, = =  但是链接没法给出,说是禁止URL 真蛋疼

使用特权

评论回复
5
实际测量不符|  楼主 | 2021-4-26 22:08 | 只看该作者

使用特权

评论回复
6
实际测量不符|  楼主 | 2021-4-26 22:09 | 只看该作者

使用特权

评论回复
7
实际测量不符|  楼主 | 2021-4-26 22:09 | 只看该作者

使用特权

评论回复
8
实际测量不符|  楼主 | 2021-4-26 22:10 | 只看该作者
注意看上面的CTRL寄存器的CLKSOURCE位(时钟源位),它有两个选择,一个是内核时钟源FLCK(72MHz),一个是外部时钟源HCLK,这里应该是

分频以后的了,所以应该是HCLK/8(9MHz);注意这里,这里选不同的值,重装寄存器里的值也是不同的.到下面配置的时候再说说.

使用特权

评论回复
9
实际测量不符|  楼主 | 2021-4-26 22:11 | 只看该作者
好,那么我们来解释下9000的固定校准值是怎么来的:

我们知道,我们设定一个计数, 那么每次计数器减到 0 ,时间经过了:系统时钟周期  * 计数器初值. 我们使用 72M 作为系统时钟, 那么每次计数器减 1 所用的时间是 1/72M , 计数器的初值如果是 72000 ,那么每次计数器减到 0 ,时间经过 (1/72M)*72000= 0.001 , (简单理解:用 72M 的时钟频率,即 1s 计数 72M=72000000 次,那 1ms 计数 72000 次,所以计数值为 72000 ) ,那么它的固定校准值是怎么来的呢..其实我也不知道的,可能和8分频有关系吧.. = = 实在不知道..官方系统库中也找不到关于它的设置 - - 可能是我蠢..

使用特权

评论回复
10
实际测量不符|  楼主 | 2021-4-26 22:12 | 只看该作者
让我们来看看这些寄存器的配置:

系统库core_cm3.h中

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 */}这里只用到了没有用到校准寄存器. = = 所以我就发现不了它是干嘛的.. 等以后或许能发现的时候再回来补吧

使用特权

评论回复
11
实际测量不符|  楼主 | 2021-4-26 22:13 | 只看该作者
再看看

/* SysTick Control / Status Register Definitions */#define SysTick_CTRL_COUNTFLAG_Pos 16 /*!< systick="" ctrl:="" countflag="" position="" */#define="" systick_ctrl_countflag_msk="" (1ul="">< systick_ctrl_countflag_pos)="">< systick="" ctrl:="" countflag="" mask="" */#define="" systick_ctrl_clksource_pos="" 2="">< systick="" ctrl:="" clksource="" position="" */#define="" systick_ctrl_clksource_msk="" (1ul="">< systick_ctrl_clksource_pos)="">< systick="" ctrl:="" clksource="" mask="" */#define="" systick_ctrl_tickint_pos="" 1="">< systick="" ctrl:="" tickint="" position="" */#define="" systick_ctrl_tickint_msk="" (1ul="">< systick_ctrl_tickint_pos)="">< systick="" ctrl:="" tickint="" mask="" */#define="" systick_ctrl_enable_pos="" 0="">< systick="" ctrl:="" enable="" position="" */#define="" systick_ctrl_enable_msk="" (1ul="">< systick_ctrl_enable_pos)="">< systick="" ctrl:="" enable="" mask="" *//*="" systick="" reload="" register="" definitions="" */#define="" systick_load_reload_pos="" 0="">< systick="" load:="" reload="" position="" */#define="" systick_load_reload_msk="" (0xfffffful="">< systick_load_reload_pos)="">< systick="" load:="" reload="" mask="" *//*="" systick="" current="" register="" definitions="" */#define="" systick_val_current_pos="" 0="">< systick="" val:="" current="" position="" */#define="" systick_val_current_msk="" (0xfffffful="">< systick_val_current_pos)="">< systick="" val:="" current="" mask="">
代码上说得很明白了~简单的抓一个来解释下吧.. 就抓CTRL吧.. 从上面的寄存器图上可以看到,它只需要配置4个位,即:16、2、1、0位,其它的保留不变不用鸟

使用特权

评论回复
12
实际测量不符|  楼主 | 2021-4-26 22:14 | 只看该作者
#define SysTick_CTRL_CLKSOURCE_Pos          2                                             /*!< systick="" ctrl:="" clksource="" position="" */="">

#define SysTick_CTRL_CLKSOURCE_Msk         (1ul < systick_ctrl_clksource_pos)=""  =""  =""  =""  =""  ="">< systick="" ctrl:="" clksource="" mask="" */="">

ul是unsigned long 型, 这两行代码的意思是1左移2位,也就是将2这位置1,这里就是选择了内核时钟源FCLK(72MHz),所以我们要把计数初值设置为72000,这样才能

产生1ms的基准时钟哦~ 当然,如果这里将1改为0,那么就要将计数初值设为9000了~ 哟西~~

好吧~ 其它的就慢慢对着瞧吧.. 剩下的就是写例子了~ 下篇吧. 有点累了!

使用特权

评论回复
13
coshi| | 2021-5-11 20:45 | 只看该作者
到现在时钟我也搞不清楚

使用特权

评论回复
14
zljiu| | 2021-5-11 20:46 | 只看该作者
最大分辨率是多长啊

使用特权

评论回复
15
wiba| | 2021-5-11 20:46 | 只看该作者
专门用来做什么的呢

使用特权

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

本版积分规则

43

主题

589

帖子

1

粉丝