0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用STM32单片机systick来实现延时定时功能

电子设计 来源:CSDN博主 作者:hurryddd 2021-02-14 06:25 次阅读

1、前言

CM4内核的处理和CM3一样,内部都包含了一个SysTick定时器,SysTick 是一个24 位的倒计数定时器,当计到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息。这样可以用systick来实现延时定时功能,不用再占用系统定时器。systick也多用做系统的时钟节拍,如freeRTOS等OS,再启动调度器的时候,就会将systick配置成其系统时钟,给系统提供心跳。systick中有4个寄存器CTRL、LOAD、VAL、CALIB

pIYBAF_9XjWAZY1uAAQTsF9Rra4795.png

2、systick配置注意事项

使用CubeMX配置生成的代码中,会自动生成一个 SystemClock_Config() 的函数,用于配置单片机时钟,其中就会配置systick

void SystemClock_Config()
{
    ...........
    LL_SYSTICK_SetClkSource(LL_SYSTICK_CLKSOURCE_HCLK);
    LL_SetSystemCoreClock(32000000);
#ifndef SYSTICK_IRQ
    LL_Init1msTick(32000000); //使能systick但是不开启systick中断
#else
    SysTick_Config(SystemCoreClock / 1000);//使能systick同时开启systick中断
#endif
}

但是这里 需要注意的是,是不是需要开启 systick 中断!!!!

1、如果只是想用systick来作为延时用,程序不想被中断打断,就只需要使能systick而不用开启systick中断,调用 LL_Init1msTick 即可

void LL_Init1msTick(uint32_t HCLKFrequency)
    ---> LL_InitTick(HCLKFrequency, 1000U);
        ---> __STATIC_INLINE void LL_InitTick(uint32_t HCLKFrequency, uint32_t Ticks)
            {
                  /* Configure the SysTick to have interrupt in 1ms time base */
                  SysTick->LOAD  = (uint32_t)((HCLKFrequency / Ticks) - 1UL);  /* set reload register */
                  SysTick->VAL   = 0UL;  /* Load the SysTick Counter Value */
                  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
                                   SysTick_CTRL_ENABLE_Msk; /* Enable the Systick Timer */
            }

但是需要自己编写延时函数,不能使用HAL库提供的HAL_Delay()。原因如下:HAL_Delay的实现是依靠一个uwTickFreq变量,uwTickFreq是在HAL_IncTick中累加的,需要在 SysTick_Handler中断函数中周期调用,这样HAL_Delay才会有一个基准

__weak void HAL_IncTick(void)
{
  uwTick += uwTickFreq;
}
__weak uint32_t HAL_GetTick(void)
{
  return uwTick;
}
__weak void HAL_Delay(uint32_t Delay)
{
  uint32_t tickstart = HAL_GetTick();
  uint32_t wait = Delay;
 
  /* Add a period to guaranty minimum wait */
  if (wait < HAL_MAX_DELAY)
  {
    wait += (uint32_t)(uwTickFreq);
  }
 
  while((HAL_GetTick() - tickstart) < wait)
  {
  }
}

自定义的us延时

void my_delay_us(uint32_t nus)
{		
	uint32_t temp;	
	uint32_t fac_us = SystemCoreClock/1000000;	  //为系统时钟的1/1000000  	
	SysTick->LOAD   = nus*fac_us; 			      //时间加载	  		 
	SysTick->VAL    = 0x00;        			      //清空计数器
	SysTick->CTRL  |= SysTick_CTRL_ENABLE_Msk ;	  //开始倒数	  
	do
	{
		temp = SysTick->CTRL;
	}
	while((temp & 0x01) &&! (temp&(1 << 16)));	 //等待时间到达   
	SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;	 //关闭计数器
	SysTick->VAL = 0X00;      					 //清空计数器	 
}

2、如果想用systick座系统的时钟节拍,需要开启systick中断,可以直接调用 SysTick_Config 来配置,也可以使用 HAL_Init 来配置,HAL_Init 配置最终也会调用 SysTick_Config 函数

 HAL_Init(void)
    ---> HAL_InitTick(uint32_t TickPriority)
        ---> SysTick_Config(uint32_t ticks)
            {
              if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)
              {
                return (1UL);                                                   /* Reload value impossible */
              }
            
              SysTick->LOAD  = (uint32_t)(ticks - 1UL);                         /* set reload register */
              NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */
              SysTick->VAL   = 0UL;                                             /* 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 (0UL);                                                     /* Function successful */
            }

这样配置完成之后,还需要再systick的中断中调用 osSystickHandler 和 HAL_IncTick

void SysTick_Handler(void)
{
	osSystickHandler();//为OS提供系统时钟节拍
	HAL_IncTick();//为HAL库提供时钟基准
}

编辑:hfy

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6032

    文章

    44513

    浏览量

    632696
  • 寄存器
    +关注

    关注

    31

    文章

    5308

    浏览量

    119978
  • 定时器
    +关注

    关注

    23

    文章

    3237

    浏览量

    114434
  • STM32单片机
    +关注

    关注

    59

    文章

    549

    浏览量

    58632
  • Systick
    +关注

    关注

    0

    文章

    62

    浏览量

    13042
收藏 人收藏

    评论

    相关推荐

    stm32单片机用什么软件编程

    STM32单片机是一种广泛应用于嵌入式系统领域的微控制器,具有高性能、低功耗、丰富的外设接口等特点。要对STM32单片机进行编程,需要选择合适的软件工具。 概述
    的头像 发表于 09-02 10:16 959次阅读

    stm32单片机引脚介绍及功能

    特点,广泛应用于工业控制、消费电子、医疗设备、智能家居等领域。本文将介绍STM32单片机的引脚及其功能。 1. 引脚概述 STM32单片机
    的头像 发表于 09-02 09:38 3598次阅读

    简述单片机定时器的工作原理

    单片机定时器的工作原理是一个复杂而精细的过程,它涉及到单片机内部的多个组件和机制。
    的头像 发表于 08-19 18:20 1110次阅读

    stm32单片机的优势有哪些?

    STM32作为一款强大而多功能单片机,凭借其性能、功能、开发者生态系统以及广泛的应用领域,成为了众多单片机中的佼佼者。无论是专业开发者
    发表于 07-29 09:29

    揭秘:单片机硬件与软件延时之大不同!

    普及一下延时相关概念和分类。硬件延时:指利用具有计数功能的硬件进行延时。比如:定时器(Timer)、实时时钟(RTC)、系统滴答
    的头像 发表于 07-25 08:11 723次阅读
    揭秘:<b class='flag-5'>单片机</b>硬件与软件<b class='flag-5'>延时</b>之大不同!

    Systick到底是用作延时好还是用作定时好?都有什么优缺点?

    功能,作基础定时用,而不建议用作延时功能,方便后面程序移植. 最好有个定论,方便后面程序的移植,不能各自玩各自的,一个公司里面写程序的风格和标准需要统一。 想问下各位,
    发表于 04-08 07:37

    单片机定时器的用法

    本章以CW32通用定时器为例介绍单片机定时器的用法。
    的头像 发表于 01-04 10:37 1340次阅读
    <b class='flag-5'>单片机</b><b class='flag-5'>定时</b>器的用法

    STM32单片机的特点和功能是什么

    STM32单片机是一款基于ARM Cortex-M内核的32位闪存微控制器,由STMicroelectronics公司(意法半导体)生产。STM32单片机具有高性能、低功耗、丰富的外设
    的头像 发表于 01-03 15:33 1.2w次阅读

    51单片机定时定时1秒程序流水灯结果分析

    51单片机是一种广泛应用的嵌入式微控制器,具有高性能、低功耗、易扩展等优势。在实际应用中,定时器常用于定时操作,如控制程序运行时间、生成精确的时间延时等。本文将详细介绍51
    的头像 发表于 12-26 14:57 6595次阅读

    AvR单片机1us延时函数数怎么写

    在编写AvR单片机的1us延时函数之前,我们首先需要了解几个关键概念。 单片机延时函数是通过控制器在特定的时间间隔内执行一系列的指令
    的头像 发表于 12-26 14:02 1135次阅读

    stm32delay函数怎么写

    STM32延时函数可以使用SysTick定时实现Sy
    的头像 发表于 12-21 17:53 2419次阅读

    CKS32F4xx系列MCU SysTick定时器的原理及使用方法

    本课将为大家讲解CKS32F4xx系列产品的SysTick定时器原理及使用方法。SysTick定时器也叫SysTick滴答
    的头像 发表于 12-18 09:21 1254次阅读
    CKS32F4xx系列MCU <b class='flag-5'>SysTick</b><b class='flag-5'>定时</b>器的原理及使用方法

    STM32单片机常用的引脚及功能

    STM32单片机是由意法半导体公司(STMicroelectronics)推出的一种高性能、低功耗的微控制器。它具有丰富的外设功能和强大的处理能力,广泛应用于各种嵌入式系统的开发中。 在STM
    的头像 发表于 12-07 16:22 2.1w次阅读

    单片机的GPIO如何实现触摸按键的功能呢?

    单片机的GPIO如何实现触摸按键的功能呢? 触摸按键是一种使用触摸电容技术实现的按键,它通过利用人体的电容
    的头像 发表于 12-07 11:43 3795次阅读

    systick_handler无法进入怎么解决

    种情况下,我们需要采取一些措施解决这个问题。 在解决这个问题之前,我们需要了解一下SysTick模块和其相关概念。 首先,SysTick是一个与外设模块时钟频率相对应的计数器,它通过加载一个初始值和递减计数来
    的头像 发表于 12-01 15:36 4434次阅读