SysTick-系统定时器

基于野火指南者STM32

SysTick-系统定时器

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

在这里插入图片描述

counter在时钟的驱动下,从reload初值开始往下递减计数到0,产生中断和置位COUNTFLAG标志。然后又从reload值开始重新递减计数,如此循环。


在这里插入图片描述

1-t:一个计数循环的时间,跟reload和CLK有关

2-CLK:72M或者9M,由CTRL寄存器配置

3-RELOAD:24位,用户自己配置

t = reload * ( 1/clk )

Clk = 72M时,t = (72) *(1/ 72 M )= 1US

Clk = 72M时,t = (72000) *(1/ 72 M )= 1MS

SysTick寄存器结构体

在固件库文件:core_cm3.h中定义

在这里插入图片描述

SysTick配置库函数

在固件库文件:core_cm3.h中定义

在这里插入图片描述

1-STM32里面无论是内核还是外设都是使用4个二进制位来表示中断优先级。

2-中断优先级的分组对内核和外设同样适用。当比较的时候,只需要把内核外设的中断优先级的四个位按照外设的中断优先级来分组来解析即可,即人为的分出抢占优先级和子优先级。

bsp_systick.h

#ifndef _BSP_SYSTICK_H
#define _BSP_SYSTICK_H


#include "stm32f10x.h"
#include "core_cm3.h"


void SysTick_Delay_us(uint32_t us);
void SysTick_Delay_ms(uint32_t ms);


#endif /*_BSP_SYSTICK_H*/

bsp_systick.c

#include "bsp_SysTick.h"

#if 0
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{ 
	//判断Tick的值是否大于2^24
  if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */
  // 初始化reload寄存器的值                                               
  SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* set reload register */
  //配置优先级;左移4位减一=15,最低优先级
	NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Cortex-M0 System Interrupts */
  //初始化counter的值为0
	SysTick->VAL   = 0;     
	/* Load the SysTick Counter Value */
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk | 
                   SysTick_CTRL_TICKINT_Msk   | 
                   SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */
  return (0);                                                  /* Function successful */
}

#endif
void SysTick_Delay_us(uint32_t us)
{
	uint32_t i;
	SysTick_Config(72);
	for(i=0;i<us;i++)
	{
		while(!((SysTick->CTRL) & (1<<16)));
	}
	SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;

}

void SysTick_Delay_ms(uint32_t ms)
{
	uint32_t i;
	SysTick_Config(72000);
	for(i=0;i<ms;i++)
	{
		while(!((SysTick->CTRL) & (1<<16)));
	}
	SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;

}

main.c

#include "stm32f10x.h"	
#include "bsp_led.h"
#include "bsp_SysTick.h"


int main(void)
{
	
	LED_GPIO_Config();
	
	while(1)
	{
		LED_G(0);
		SysTick_Delay_ms(1000);
		LED_G(1);
		SysTick_Delay_ms(1000);
	}
}	

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值