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.csdn.net/FuYYZ/article/details/114346235


总结

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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
首先,需要明确的是使用外部32.768KHz晶振的延时函数需要使用RTC定时器,因为RTC定时器使用的是低速外部晶振。以下是修改后的代码: ```c static __IO uint32_t delay_ms_ticks; static inline void delay_init(void) { RCC->APB1ENR1 |= RCC_APB1ENR1_PWREN; // Enable power interface clock PWR->CR1 |= PWR_CR1_DBP; // Enable access to RTC, backup and power registers RCC->BDCR |= RCC_BDCR_RTCEN; // Enable RTC clock RCC->BDCR |= RCC_BDCR_RTCSEL_LSE; // Select low speed external oscillator as RTC clock RTC->WPR = 0xCA; // Unlock write protection RTC->WPR = 0x53; RTC->ISR |= RTC_ISR_INIT; // Enter initialization mode while (!(RTC->ISR & RTC_ISR_INITF)); // Wait for initialization flag to be set RTC->PRER = (127 << 16) | (255); // Set prescaler values for 32.768KHz oscillator RTC->ISR &= ~RTC_ISR_INIT; // Exit initialization mode RTC->WPR = 0xFF; // Lock write protection } static inline void delay_ms(uint16_t ms) { delay_ms_ticks = ms; while (delay_ms_ticks); } __weak void RTC_WKUP_IRQHandler() { if (delay_ms_ticks > 0) { delay_ms_ticks--; } } ``` 在上述代码中,我们首先使能了PWR、RTC和BKP的时钟,并且解锁了RTC写保护。然后选择了低速外部晶振作为RTC时钟源,并且设置了对应的预分频器值。最后,我们将写保护锁定,并在RTC的WKUP中断句柄中进行延时操作。需要注意的是,在这里我们使用了RTC的WKUP中断而不是SysTick中断来进行延时,因为我们现在使用的是RTC定时器
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

图个吉利儿

欢迎大家一起学习!

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

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

打赏作者

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

抵扣说明:

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

余额充值