打印
[应用相关]

STM32滴答定时器sysTick详细解析

[复制链接]
1397|48
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
610u|  楼主 | 2022-1-28 15:43 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
ST, AD, TI, ck, ic
参看:https://blog.csdn.net/u012351051/article/details/51251504

在ARM Cortex-M3内核中有一个Systick定时器,一个24bit的倒计数定时器,当计数到0时,它就会从Load寄存器中自动重装定时初值,只要不把CTRL寄存器中的ENABLE清0,它就永不停。



使用特权

评论回复
沙发
610u|  楼主 | 2022-1-28 15:45 | 只看该作者
1. 滴答定时器的时钟来源

使用特权

评论回复
板凳
610u|  楼主 | 2022-1-28 15:46 | 只看该作者
看上面的图会有一个错觉,以为滴答定时器是系统时钟的1/8,其实不是,滴答定时器的时钟既可以是HCLK/8,也可以是HCLK,这个是通过CTRL寄存器进行设定的,了解这一点,对于操作系统的时钟计算很重要,因为要精确计算时钟时间。

使用特权

评论回复
地板
610u|  楼主 | 2022-1-28 15:47 | 只看该作者
2. 滴答定时器的寄存器。

参看:https://blog.csdn.net/qq_29350001/article/details/81630311

使用特权

评论回复
5
610u|  楼主 | 2022-1-28 15:48 | 只看该作者

使用特权

评论回复
6
610u|  楼主 | 2022-1-28 15:50 | 只看该作者

使用特权

评论回复
7
610u|  楼主 | 2022-1-28 15:51 | 只看该作者
3. 滴答定时器的库函数

1)寄存器的定义: 在core_cm3.h中(此文件在我的eclipse工程目录:D:\c_workspace\rtuarch\st-m3l\stlib\cmsis)

使用特权

评论回复
8
610u|  楼主 | 2022-1-28 15:55 | 只看该作者

使用特权

评论回复
9
610u|  楼主 | 2022-1-28 15:56 | 只看该作者
此结构体被define为SysTick:

#define SysTick             ((SysTick_Type   *)     SysTick_BASE  )   /*!< SysTick configuration struct       */

使用特权

评论回复
10
610u|  楼主 | 2022-1-28 15:57 | 只看该作者
2)设定步骤:

①选择时钟源:misc.c(D:\c_workspace\rtu\arch\st-m3l\stlib\src)

使用特权

评论回复
11
610u|  楼主 | 2022-1-28 15:59 | 只看该作者
其中这两种时钟源 :
  SysTick_CLKSource_HCLK_Div8 外部时钟 72/8=9M
  SysTick_CLKSource_HCLK 内部时钟 HCLK=72M

②设定重载数

③开启中断

④启动滴答定时器

②③④:core_cm3.h

使用特权

评论回复
12
610u|  楼主 | 2022-1-28 15:59 | 只看该作者

使用特权

评论回复
13
610u|  楼主 | 2022-1-28 16:00 | 只看该作者
解析:

作用: 使能Systick定时器,开启SysTick中断,配置中断时间间隔

使用特权

评论回复
14
610u|  楼主 | 2022-1-28 16:01 | 只看该作者
参数ticks: 设置多少个Systick时钟周期产生一次中断

__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
  if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk)  return (1);      /* ticks参数有效性检查 */

  SysTick->LOAD  = ticks - 1;                                  /* 设置重装载值,

                                                                                       -1:因为装载时消耗掉一个systick时钟周期*/
  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Systick Interrupt 配置NVIC */
  SysTick->VAL   = 0;                                              /* 初始化VAL=0,使能Systick后立刻进入重装载 */
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |  \*选择时钟源*\
                   SysTick_CTRL_TICKINT_Msk   |                           \*开启Systick中断*\
                   SysTick_CTRL_ENABLE_Msk;                    /* 使能Systick定时器 */
  return (0);                                                  /* Function successful */
}

SysTick_Handler()处理:

void SysTick_Handler(void)
{
    rt_interrupt_enter();
    rt_tick_increase();
    rt_interrupt_leave();
}

使用特权

评论回复
15
610u|  楼主 | 2022-1-28 16:01 | 只看该作者
说明:我的工程是eclipse工程,用的是rt_thread系统。

使用特权

评论回复
16
pl202| | 2022-2-20 13:37 | 只看该作者
系统定时器systick有什么用

使用特权

评论回复
17
ghuca| | 2022-2-20 16:37 | 只看该作者
都有滴答定时器吗?

使用特权

评论回复
18
soodesyt| | 2022-2-21 15:10 | 只看该作者
在STM32标准库中是通过SysTick_Config()函数配置时钟中断的

使用特权

评论回复
19
yujielun| | 2022-2-21 15:19 | 只看该作者

Systick允许的最长和最短定时是多少

使用特权

评论回复
20
gygp| | 2022-2-21 15:28 | 只看该作者
需要用要SysTick 来做定时器做中断。

使用特权

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

本版积分规则

49

主题

517

帖子

0

粉丝