STM32笔记之Systick系统滴答定时器

本文详细介绍了STM32中的Systick系统滴答定时器的配置与使用方法,包括定时器函数实现、代码示例及定时器初始化等关键步骤。适合初学者快速上手。

关于STM32学习分享

第四章 Systick系统滴答定时器

前言

单片机的Systick系统滴答定时器。


一、系统滴答定时器函数

static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */

SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register /
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /
set Priority for Cortex-M0 System Interrupts /
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 */
}

二、代码

1.systick.c

代码如下(示例):

#include "bsp_systick.h"

/*
定时器的完成是相对于外部时实的
当计数完成就做指令
*/

#define SystemCoreClock 72000000
uint32_t TimingDelay;

static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{ 
  if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */
                                                               
  SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* set reload register */
  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Cortex-M0 System Interrupts */
  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 */
}
//us延时
void SysTick_Delay_us(uint32_t us)
{
	uint32_t i;
	SysTick_Config(72);//系统时钟
	//循环一次为1微妙
	for(i=0;i<us;i++)
	{
		//连续扫描控制与状态寄存器,等待计数完成
		while(!(SysTick->CTRL &(1<<16)));
	}
	SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;
}

//ms延时
void SysTick_Delay_ms(uint32_t ms)
{
	uint32_t i;
	SysTick_Config(72000);//系统时钟
	//循环一次为1毫秒
	for(i=0;i<ms;i++)
	{
		//连续扫描控制与状态寄存器,等待计数完成
		while(!(SysTick->CTRL &(1<<16)));
	}
	SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;
}

///////系统时钟初始化,中断延时/////
void Systick_Init(void)
{
	//每100us进行一次中断,判断数值是否符合规则
	if(SysTick_Config(SystemCoreClock/10000)){//SystemCoreClock/10000=7200
			/* Capture error *///捕获错误
			while(1);//死循环
	}
}	

void TimingDelay_Decrement(void)
{
		if(TimingDelay!= 0x00){
			TimingDelay--;
			}
}

void Delay_us(__IO u32 nTime)//纳秒延时
{
	TimingDelay = nTime;
		while(TimingDelay != 0);
}

2.systick.h

代码如下(示例):

#ifndef _SYSTICK_H
#define _SYSTICK_H

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

void SysTick_Delay_ms(uint32_t ms);
void SysTick_Delay_us(uint32_t us);
void TimingDelay_Decrement(void);
void Delay_us(__IO u32 nTime);	
void Systick_Init(void);
#endif /*_SYSTICK_H*/

3.stm32f10x_it.c

代码如下(示例):

void SysTick_Handler(void)
{
	TimingDelay_Decrement();
}

3.main.c

代码如下(示例):


#include "stm32f10x.h"   // 相当于51单片机中的  #include <reg51.h>
#include "bsp_led.h"
#include "bsp_key.h"
#include "bsp_systick.h"

int main(void)
{
	LED_GPIO_Config();
	KEY_GPIO_Config();
	Systick_Init();
	while(1)
	{	
//绿蓝红三种颜色的流水点亮
		LED(ON);
		 SysTick_Delay_ms(100);
		LED(OFF);	
	}
}

该处使用的url网络请求的数据。
@https://blog.youkuaiyun.com/FuYYZ/article/details/114346235


总结

希望能给你有所收获!本文章知识点的学习来自野火教程,更多的知识在野火平台值得初学者去看看!一定有收获的!谢谢!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

图个吉利儿

欢迎大家一起学习!

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

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

打赏作者

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

抵扣说明:

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

余额充值