3、SysTick定时器:

1、SysTick 为一个 24 位递减计数器,SysTick 设定初值并使能后,每经过 1 个系统时钟周期,计数值就减 1。

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

2、寄存器

STK_CSR,    0xE000E010, 控制寄存器

STK_LOAD,   0xE000E014, 重载寄存器

STK_VAL,   0xE000E018, 当前值寄存器

STK_CALRB,  0xE000E01C, 校准值寄存器

3、STK_CSR控制寄存器

第0位:ENABLE,Systick 使能位  (0:关闭Systick功能;1:开启Systick功能)

第1位:TICKINT,Systick 中断使能位 (0:关闭Systick中断;1:开启Systick中断)

第2位:CLKSOURCE,Systick时钟源选择 (0:使用HCLK/8 作为Systick时钟;1:使用HCLK作为Systick时钟)

第16位:COUNTFLAG,Systick计数比较标志,如果在上次读取本寄存器后,SysTick 已经数到了0,则该位为1。如果读取该位,该位将自动清零

4、STK_LOAD重载寄存器
   Systick是一个递减的定时器,当定时器递减至0时,重载寄存器中的值就会被重装载,继续开始递减。
   STK_LOAD  重载寄存器是个24位的寄存器最大计数0xFFFFFF。

5、STK_VAL当前值寄存器
    也是个24位的寄存器,读取时返回当前倒计数的值,写它则使之清零,同时还会清除在SysTick 控制及状态寄存器中的COUNTFLAG标志。

6、STK_CALRB校准值寄存器

7、定时器使用例程

 1 /*main.c*/
 2
 3 #include"pbdata.h"//调用自定义公共函数库
 4
 5 void RCC_Configuration(void);//系统时钟初始化函数声明
 6 void GPIO_Configuration(void);//GPIO初始化函数声明
 7
 8 int main(void)//void不能void定义主函数
 9 {
10     RCC_Configuration();    //系统时钟初始化
11
12
13
14
15     GPIO_Configuration();//端口初始化
16
17
18 /*进入GPIO处理*/
19   while(1)
20   {
21     GPIO_SetBits(GPIOB,GPIO_Pin_5);//指定端口设置为高电平
22
23     delay_ms(1000);//1s,delay,公共函数库中自己定义
24
25     GPIO_ResetBits(GPIOB,GPIO_Pin_5);//指定端口设置低电平
26
27     delay_ms(1000);//1s,delay,公共函数库中自己定义
28   }
29 }
30
31
32     void RCC_Configuration(void)//系统时钟高初始化函数
33   {
34
35     SystemInit();//系统初始化
36     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//对应GPIO时钟使能
37     }
38
39
40     void GPIO_Configuration(void)//GPIO初始化函数
41   {
42     GPIO_InitTypeDef GPIO_InitStructure;//定义一个GPIO设置的结构体变量
43
44         /*结构体变量赋值*/
45       GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;////引脚配置
46       GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//配置频率
47       GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出
48
49          /*对应的GPIO初始化*/
50       GPIO_Init(GPIOB,&GPIO_InitStructure);
51   }
52
53
54
55
56     

 1 /*pbdata.c*/
 2
 3 #include"pbdata.h"
 4
 5
 6 u8 dt=0;
 7
 8 void delay(u32 nCount)
 9 {
10   for(;nCount!=0;nCount--);
11 }
12
13
14
15
16 /*微秒级别延时*/
17 void delay_us(u32 nus)
18 {
19     u32 temp;
20     SysTick->LOAD = 9*nus;//载入初值,72M/8=9M,也就是1/9us,9*1/9us,所以是执行9次
21     SysTick->VAL=0X00;//清空计数器,清空后,就自动设置自己设定的计数器的值
22     SysTick->CTRL=0X01;//使能,减到零动作(不发生中断),采用外部时钟
23
24     do
25     {
26           temp=SysTick->CTRL;//标志位,等到一直减到0
27          }while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
28
29     SysTick->CTRL=0x00; //关闭计数器
30     SysTick->VAL =0X00; //清空计数器
31 }
32
33
34
35 /*毫秒级别延时*/
36 void delay_ms(u16 nms)
37 {
38     u32 temp;
39     SysTick->LOAD = 9000*nms;//载入初值,72M/8=9M,也就是1/9us,9*1/9us,所以是执行9000次
40     SysTick->VAL=0X00;//清空计数器,清空后,就自动设置自己设定的计数器的值
41     SysTick->CTRL=0X01;//使能,减到零动作(不发生中断),采用外部时钟
42
43     do
44     {
45           temp=SysTick->CTRL;//标志位,等到一直减到0
46          }while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
47
48     SysTick->CTRL=0x00; //关闭计数器
49     SysTick->VAL =0X00; //清空计数器
50 }

 1 /*pbdata.h*/
 2
 3 #ifndef _pbdata_H
 4 #define _pbdata_H
 5
 6 #include"stm32f10x.h"
 7
 8 /*自定义全局变量*/
 9 extern u8 dt;
10
11 /*自定义函数*/
12 void delay(u32 nCount);
13 void delay_us(u32 nus);
14 void delay_ms(u16 nms);
15
16 #endif

8、定时器使用例子下载

http://download.csdn.net/detail/a1181803348/8737749

时间: 2024-10-14 00:08:02

3、SysTick定时器:的相关文章

SysTick 定时器的使用

SysTick是STM32中的一个24位的定时器. Cortex‐M3处理器内部包含了一个简单的定时器.因为所有的CM3芯片都带有这个定时器,软件在不同 CM3器件间的移植工作得以化简.该定时器的时钟源可以是内部时钟,或者是外部时钟.不过,STCLK的具体来源则由芯片设计者决定,因此不同产品之间的时钟频率可能会大不相同,你需要查找芯片的器件手册来决定选择什么作为时钟源. Cortex-M3 的内核中包含一个 SysTick 时钟.SysTick 为一个 24 位递减计数器,SysTick 设定初

STM32学习及应用笔记一:SysTick定时器学习及应用

这几年一直使用STM32的MCU,对ARM内核的SysTick计时器也经常使用,但几乎没有仔细了解过.最近正好要在移植一个新的操作系统时接触到了这块,据比较深入的了解了一下. 1.SysTick究竟是什么? 关于SysTick在STM32的资料中并没有详细的介绍,这可能由于SysTick是ARM内核的东西.在<STM32F10xxx参考手册>.<STM32F4xx参考手册>以及<STM32F7xx参考手册>中,介绍时钟的时候仅仅是在使用树上简单的画出了HCLK时钟经过8

关于STM32的systick定时器的详细说明

SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15).在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基.例如,为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统:或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关.因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律. Cortex‐M3处理器内部包含了一个

Systick定时器

Systick定时器,是一个简单的定时器,对于CM3,CM4内核芯片,都有Systick定时器.相当于系统的"心跳". 固件库中的Systick相关函数: SysTick_CLKSourceConfig() //Systick时钟源选择 misc.c文件中 SysTick_Config(uint32_t ticks) //初始化systick,时钟为HCLK,并开启中断 //core_cm3.h/core_cm4.h文件中 Systick中断服务函数: void SysTick_Han

关于嵌入式学习随笔-&gt;5《Systick定时器》

1.什么是Systick定时器? --->Systick定时器是一个简单的滴答定时器,对于ST的M3.M4.M7内核芯片,都有滴答定时器. --->Systick滴答定时器常常用来做延迟,或者时时操作系统的心跳时钟.这样可以节省MCU的资源,不用另外浪费一个定时器.比如UCOS系统中,分时复用,需要一个最小的时间戳,一般在STM32+UCOS系统中,都采用Systick滴答定时器做UCOS的心跳时钟. --->Systick定时器就是一个系统滴答定时器,一个24位的倒计数定时器,记到0时

Systick定时器详解

Systick定时器,是一个简单的定时器,对于CM3,CM4内核芯片,都有Systick定时器. Systick定时器常用来做延时,或者实时系统的心跳时钟.这样可以节省MCU资源,不用浪费一个定时器.比如UCOS中,分时复用,需要一个最小的时间戳,一般在STM32+UCOS系统中,都采用Systick做UCOS心跳时钟. Systick定时器就是系统滴答定时器,一个24位的倒计数定时器,计到0时,将从RELOAD寄存器中自动重装载定时初值.只要不把它在SysTick 控制及状态寄存器中的使能位清

SysTick—系统定时器

本章参考资料<ARM Cortex?-M4F 技术参考手册> -4.5 章节 SysTick Timer(STK), 和4.48 章节 SHPRx,其中 STK 这个章节有 SysTick 的简介和寄存器的详细描述.因为SysTick 是属于 CM4 内核的外设,有关寄存器的定义和部分库函数都在 core_cm4.h 这个头文件中实现.所以学习 SysTick 的时候可以参考这两个资料,一个是文档,一个是源码. SysTick 简介SysTick-系统定时器是属于 CM4 内核中的一个外设,内

STM32 的系统滴答定时器( Systick) 彻底研究解读

作者:王健 前言 SysTick 比起那些 TIM 定时器可以说简单多啦~~~~~哥的心情也好了不少, 嘎嘎!! ARM Cortex-M3 内核的处理器内部包含了一个 SysTick 定时器,它是一个24 位的倒计数定时器,注意,是倒计数! 当计到 0 时它就会从 LOAD 寄存器中自动重装载定时初值.只要不把 CTRL 寄存器中的 ENABLE 为清 0,它就永不停息! 遗憾的是,SysTick 定时器在<STM32 参考手册>里一个屁都没放,只有在<ARM Cortex-M3 技术

Cortex系统定时器--SysTick

1.SysTick寄存器结构 SYSTICK 寄存器结构,SysTick_TypeDeff,在文件"stm32f10x_map.h"中定义如下: typedef struct  {     vu32 CTRL;      vu32 LOAD;      vu32 VAL;      vuc32 CALIB;  } SysTick_TypeDef; SysTick 外设声明于文件"stm32f10x_map.h": #define SCS_BASE ((u32)0xE