SysTick

本文详细介绍了STM32的SysTick定时器,包括其24位递减特性、内核嵌套、NVIC中的位置。讲解了系统滴答校准值、四个寄存器的作用,以及如何计算定时时间。还提供了固件库中的相关函数和中断服务函数的示例,展示了如何用SysTick实现延迟和中断。强调了SysTick在实时系统中的应用,并给出了非中断和中断两种写法的示例代码。
摘要由CSDN通过智能技术生成

概述

SysTick:  24位,只能递减,存在于内核,嵌套在NVIC中,所有Cortex-M内核的单片机都具有这个定时器

系统滴答校准值固定为9000,当系统滴答时钟设定位9MHz(HCK/8的最大值),产生1ms时间的基准.

4个systick寄存器:

         CTRL 控制和状态寄存器

                  

         LOAD:自动重装载初值寄存器

                  

         VAL:当前值寄存器

                  

         CALIB:校准值寄存器                  

                 

Sys Tick定时时间计算:

         t=reload*(1/CLk)     CLK位系统时钟

         CLK=72M时,t=(72)*(1/72M)=1us

         CKL=72M时t=(72000)*(1/72M)=1ms

在core_cm3.h中

typedef struct

{

  __IO uint32_t CTRL; //控制状态寄存器                    

  __IO uint32_t LOAD;   //重装载寄存器               

  __IO uint32_t VAL;     //当前值寄存器

  __I  uint32_t CALIB;    //校准寄存器

} SysTick_Type;

static __INLINE uint32_t SysTick_Config(uint32_t ticks)

         {

//判断tick的值是否大于2^24.如果大于,则不符合规定

           if (ticks > SysTick_LOAD_RELOAD_Msk)

     return (1);                                                                                                                                                   //初始化reload寄存器的值

SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;     

//配置中断优先级,配置为15,默认最低的优先级,     

 NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); 

//初始化counter的值为0      

SysTick->VAL   = 0;                         

//配置SysTick时钟为72M

//使能中断

//使能SysTick

SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |

                                                  SysTick_CTRL_TICKINT_Msk |

                                                  SysTick_CTRL_ENABLE_Msk;    

           return (0);                                            

         }

固件库中systick相关函数:

SysTick_CLKSourceConfig()//systick时钟源选择.在misc.c文件中

SYSTick_Config(uint32_t ticks)//初始化Systick时钟为HCLK,并开启中断,在core_cm3.h或core_CM4.h中

中断服务函数:

Void SysTick_Handler(void)

用中断的方式实现delay 函数:

总结:

         我们只需要设置好LOAD的值,VAL清零,CTRL配置好就能使用了,将systick用来定时也是可以的,但是一般将其用在实时系统中.

寄存器非中断写法:

/*看看就好,别太当真,因为这个东西一般用来做rtos,而且这样写其实是有问题的,这种做法对一个工程来说不能保证工程的实时性*/



#include"mydelay.h"
 
 void SysTick_Delay_Ms(u32 ms)
 {
	 u32 i;

	 SysTick->LOAD=72000-1;//重装载值

	 SysTick->VAL   = 0; /*初始化val值,val将会取load的值71999数到0将会计数72000次.我们使用的                                                        
                         时72M时钟,频率是1/72000000,那么计数72000次则等于1/1000s=1ms*/

	 SysTick->CTRL =0x05; /*使能SysTick,不开启中断   0000 0000 0000 0000 0000 0000 0000  
                            0101*/
	 for(i=0;i<ms;i++)
	 {
	 
		while(!((SysTick->CTRL)&(1<<16)));/*当第一次进入时,SysTick还没有计算满,所以该位为0, 
                              直到Systick计算满了,第16位为0,跳出while循环,并自动置0*/
	 }
 
	 SysTick->CTRL &=~SysTick_CTRL_CLKSOURCE_Msk;//清除一处标志位
	 
 } 
#ifndef _MYDELAY_H_
#define _MYDELAY_H_

#include"stm32f10x.h"

void SysTick_Delay_Ms(u32 ms);

#endif

中断写法:

 #include"mydelay.h"
 u32 i;
 void  my_delay_init(void)
 {
	 SysTick->LOAD=72000-1;//重装载值

	 SysTick->VAL   = 0; //初始化val值,val将会取load的值71999数到0将会计数72000次.我们使用                                                    
                       的时72M时钟,频率是1/72000000,那么计数72000次则等于1/1000s=1ms,

	 SysTick->CTRL =0x07; //使能SysTick,开启中断      //0 0000 0000 0000  0111

	 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//设置中断优先级分组

	NVIC_SetPriority(SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);//设置中断优先
    级,1<<__NVIC_PRIO_BITS) - 1这句的意思时1左移4位为10000,然后减一就是1111,那么这里就是设置    
    了一位抢占(抢占优先级为1),三位响应(响应优先级为7).
 
 }
 
 void SysTick_Delay_Ms(u32 ms)
 {
	
	while(ms!=i)
		;
		i=0;
	
	 
 } 

void SysTick_Handler(void)	
{
	//这里可以加中断触发条件,因为说实话一般不会用到systick
		i++;	

}
 
#ifndef _MYDELAY_H_
#define _MYDELAY_H_

#include"stm32f10x.h"

void  my_delay_init(void);
void SysTick_Delay_Ms(u32 ms);


#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

入门->放弃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值