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

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

    关注

    6078

    文章

    45628

    浏览量

    675485
  • 寄存器
    +关注

    关注

    31

    文章

    5625

    浏览量

    130655
  • 定时器
    +关注

    关注

    23

    文章

    3378

    浏览量

    125094
  • STM32单片机
    +关注

    关注

    59

    文章

    553

    浏览量

    60892
  • Systick
    +关注

    关注

    0

    文章

    67

    浏览量

    14040
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Renesas 7544 系列单片机:技术剖析与设计要点

    Renesas 7544 系列单片机:技术剖析与设计要点 在电子设计领域,单片机作为核心控制元件,其性能和特性对整个系统的稳定性和功能实现起着关键作用。今天,我们就来深入探讨一下 Re
    的头像 发表于 04-13 14:20 191次阅读

    Infineon XC87xCLM 8位单片机功能特性与设计要点解析

    Infineon XC87xCLM 8位单片机功能特性与设计要点解析 在电子设计领域,单片机作为核心部件,其性能和特性对整个系统的稳定性和功能实现
    的头像 发表于 03-30 14:40 376次阅读

    单片机高频调试技巧

    %的调试翻车,都是供电或时钟问题,先排查这一步,能节省大量时间: 供电排查:用万用表测量单片机VCC、GND电压(STM32一般3.3V),确认电压稳定,没有虚焊、接触不良; 时钟排查:STM32调试前
    发表于 03-12 10:10

    小白也能听懂的单片机知识路径

    尝试新的想法和技术,不断挑战自我,实现创新。 从51单片机STM32单片机,这是一条充满挑战与机遇的学习之路。通过不断努力和实践,只要保持对技术的热爱和坚持,一定能够成为
    发表于 02-04 16:44

    CW32系统滴答SysTick定时器详解

    _CTRL_TICKINT_Msk| SysTick_CTRL_ENABLE_Msk; 设置SysTick IRQ中断使能,并开启SysTick定时器 4.
    发表于 01-21 07:20

    编写简单高效单片机汇编程序

    独立的任务,这样既能减少代码重复,也便于维护和调试。 计时模块:利用单片机定时器,精确控制时钟的秒脉冲。 显示模块:用循环或查表法实现不同的时间显示,这能减少不必要的分支跳转指令
    发表于 11-24 07:00

    使用系统定时SysTick实现精确延时微秒和毫秒函数

    到 0 时,将从RELOAD 寄存器中自动重装载定时初值,开始新一轮计数。使用内核的SysTick定时实现
    发表于 11-20 07:12

    PWM、定时器、SysTick 区别及应用场景

    单片机和嵌入式开发中,经常会遇到PWM(脉宽调制)、定时器、SysTick(系统滴答定时器)这几个词。很多初学者容易把它们混为一谈,以为都是“定时
    的头像 发表于 11-17 10:53 865次阅读
    PWM、<b class='flag-5'>定时</b>器、<b class='flag-5'>SysTick</b> 区别及应用场景

    浮思特 | 智能洗衣背后的静默力量,ABOV单片机如何实现精准控制?

    日常生活中,洗衣已成为不可或缺的家电产品。随着技术进步,现代洗衣不仅具备基础的洗涤功能,还融入了触摸控制、多电机驱动、烘干一体等智能化技术。这些复杂功能背后,离不开高性能
    的头像 发表于 10-16 09:52 887次阅读
    浮思特 | 智能洗衣背后的静默力量,ABOV<b class='flag-5'>单片机</b>如何<b class='flag-5'>实现</b>精准控制?

    SysTick系统滴答定时器简介

    SysTick—系统定时器是属于CM33内核中的一个外设,内嵌在NVIC中。系统定时器是一个24bit的向下递减的计数器,计数器每计数一次的时间为 1/SYSCLK,一般我们设置系统时钟SYSCLK等于 200MHz。当重装载数
    的头像 发表于 09-23 09:50 1916次阅读
    <b class='flag-5'>SysTick</b>系统滴答<b class='flag-5'>定时</b>器简介

    单片机原理及应用详解

    单片机(Microcontroller Unit, MCC)  是一种集成计算机核心功能(CPU、存储器、I/O接口等)的微型芯片,广泛应用于嵌入式系统中。以下是其原理及应用的详细介绍: 一、单片机
    的头像 发表于 08-11 13:57 2998次阅读

    瑞萨RA MCU众测宝典 SysTick之RA0E1定时器点灯

    嵌入式小百科将和大家一起,基于【RA-Eco-RA0E1-32PIN-V1.0】开发板,一步步实现SysTick定时器点灯,感受时间控制在嵌入式开发中的奇妙作用。 开启宝典 #Systic
    的头像 发表于 08-05 14:50 3727次阅读
    瑞萨RA MCU众测宝典  <b class='flag-5'>SysTick</b>之RA0E1<b class='flag-5'>定时</b>器点灯

    怎么测单片机系统频率

    单片机系统频率是指单片机工作时的时钟频率,它直接影响单片机的运行速度和处理能力,准确测量系统频率对单片机应用开发、程序调试和性能优化具有重要意义。测量
    的头像 发表于 07-25 11:39 1204次阅读

    单片机怎么驱动电机?

    在各类自动化设备和智能装置中,电机是重要的执行部件,而单片机作为控制核心,需要通过特定的方式驱动电机运转。单片机驱动电机并非直接连接即可,而是要根据电机类型和功率,搭配合适的驱动电路,才能实现稳定
    的头像 发表于 07-25 09:31 1464次阅读

    使用USB转TTL串口板和ST-LINK调试下载器给STM32单片机下载程序

    本文详细介绍如何使用ST-LINK/V2和USB转TTL串口板为STM32单片机下载程序,包括STM32启动模式、JTAG与SWD接口对比、驱动安装及官方软件STM32ST-LINKU
    的头像 发表于 06-20 17:26 3400次阅读
    使用USB转TTL串口板和ST-LINK调试下载器给<b class='flag-5'>STM32</b><b class='flag-5'>单片机</b>下载程序