stm32_Systick

一、概述

 SysTick 提供 1 24 位、降序、零约束、写清除的计数器,Systick设定初值并使能后,每经过1个系统时钟周期,计数值就减1。

计数到0时,Systick计数器自动重装载初值并继续计数,同时内部的COUNTFLAG标志置位,触发中断(如果中断使能)

二、相关寄存器

1.  SysTick Control and Status Register

  Systick控制及状态寄存器

位段 名称 类型 复位值 描述
16 COUNTFLAG
R 0  如果在上次读取本寄存器后,Systick已经数到0,则该位为1。如果读取该位,该位将自动清零。
2 CLKSOURCE
R/W 0

0=使用HCLK/8作为Systick时钟

1=使用HCLK作为Systick时钟

1 TICKINT
R/W 0

0=数到0时无动作

1=Systick倒数到0后产生Systick异常请求

0 ENABLE
R/W 0

 Systick定时器使能位

0=关闭Systick功能

1=开启Systick功能

 

 

2.  SysTick Reload Value Register

  Systick重装载数值寄存器

位段 名称 类型 复位值 描述
23:0 RELOAD
R/W 0 当Systick倒数计数至0时,将被重装载的值

 

3.  SysTick Current Value Register

  Systick当前数值寄存器

位段 名称 类型 复位值 描述
23:0 CURRENT
R/W 0

读取时返回当前倒计数的值,写它则使之清零,

同时还会清除在SysTick控制及状态寄存器中的COUNTFLAG 标志

三、Systick逻辑图

RCC通过AHB时钟(HCLK)8分频后作为Cortex系统定时器(Systick)的外部时钟。

四、代码示例

系统时钟为72MHz时,微秒/毫秒延时

 1 void delay_us(u32 i)
 2 {
 3     u32 temp;
 4     SysTick->LOAD=9*i;         //设置重装数值, 系统时钟为72MHz
 5     SysTick->CTRL=0x01;         //使能,减到零是无动作,采用外部时钟源
 6     SysTick->VAL=0;                //清零计数器
 7     do
 8     {
 9         temp=SysTick->CTRL;           //读取当前倒计数值
10     }
11     while((temp&0x01)&&(!(temp&(1<<16))));     //等待时间到达
12     SysTick->CTRL=0;    //关闭计数器
13     SysTick->VAL=0;        //清空计数器
14 }
 1 void delay_ms(u32 i)
 2 {
 3     u32 temp;
 4     SysTick->LOAD=9000*i;      //设置重装数值, 系统时钟为72MHz
 5     SysTick->CTRL=0X01;        //使能,减到零是无动作,采用外部时钟源
 6     SysTick->VAL=0;            //清零计数器
 7     do
 8     {
 9         temp=SysTick->CTRL;       //读取当前倒计数值
10     }
11     while((temp&0x01)&&(!(temp&(1<<16))));    //等待时间到达
12     SysTick->CTRL=0;    //关闭计数器
13     SysTick->VAL=0;        //清空计数器
14 }

 

posted @ 2019-05-27 16:56  Will_CKH  阅读(272)  评论(0编辑  收藏  举报