码迷,mamicode.com
首页 > 其他好文 > 详细

3、SysTick定时器:

时间:2015-05-25 20:17:12      阅读:248      评论:0      收藏:0      [点我收藏+]

标签:

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     
View Code
技术分享
 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 }
View Code
技术分享
 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
View Code

 

 


8、定时器使用例子下载

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

 

3、SysTick定时器:

标签:

原文地址:http://www.cnblogs.com/STM32bo/p/4528525.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!