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

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

    关注

    6074

    文章

    45340

    浏览量

    663562
  • 寄存器
    +关注

    关注

    31

    文章

    5589

    浏览量

    129064
  • 定时器
    +关注

    关注

    23

    文章

    3360

    浏览量

    121743
  • STM32单片机
    +关注

    关注

    59

    文章

    553

    浏览量

    60312
  • Systick
    +关注

    关注

    0

    文章

    67

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

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

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

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

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

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

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

    SysTick系统滴答定时器简介

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

    单片机怎么驱动电机?

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

    第十二章 SysTick——系统定时

    本章介绍了W55MH32的SysTick系统定时器,它是24位递减计数器,含4个寄存器,可配置定时、中断,用于产生时基 等。
    的头像 发表于 05-22 17:16 831次阅读
    第十二章 <b class='flag-5'>SysTick</b>——系统<b class='flag-5'>定时</b>器

    C51单片机及C语言知识点必备秘籍

    单片机关键知识点一览: 系列一 1:单片机简叙 2:单片机引脚介绍 3:单片机存储器结构 4:第一个单片机小程序 5:
    发表于 05-15 14:00

    新概念51单片机C语言教程入门、提高、开发、拓展全攻略

    库函数实现流水灯 第2篇 内外部资源操作篇 3.1 数码管显示原理 3.2 数码管静态显示 3.3 数码管动态显示 3.4 中断概念 3.5 单片机定时器中断 4.1 独立键盘检测 4.2 矩阵键盘
    发表于 04-15 13:57

    STM32F10xxx单片机编程手册

    电子发烧友网站提供《STM32F10xxx单片机编程手册.pdf》资料免费下载
    发表于 04-14 14:56 17次下载

    STM32F103x8 STM32F103xB单片机数据手册

    STM32F103x8STM32F103xB单片机数据手册
    发表于 04-14 14:55 6次下载

    0STM32中的SysTick是个啥?咋用?(可下载)

    Cortex-Mx内核内部包含了一个SysTick定时器,SysTick是一个24位的倒计数定时器,当计到0时,将从RELOAD寄存器中自动重装载
    发表于 04-01 14:52 0次下载

    瑞萨MCU RA8系列教程:RA8单片机SysTick使用描述

      每个Cortex-M内核都集成了一个SysTick模块,那是因为这个模块几乎是单片机项目必备的一个(定时器)功能。 不管是最新的Cortex-M85内核,还是经典的Cortex-M
    的头像 发表于 03-27 14:27 1607次阅读
    瑞萨MCU RA8系列教程:RA8<b class='flag-5'>单片机</b><b class='flag-5'>SysTick</b>使用描述

    STM32单片机最小系统电路设计

    单片机最小系统是指用最少的电路组成单片机可以工作的系统,通常最小系统包含:电源电路、时钟电路、复位电路、调试/下载电路,对于STM32还需要启动选择电路。总之,刚开始如果不太懂电路的话,就抄别人的电路,然后自己拼凑。
    的头像 发表于 03-12 14:09 1.7w次阅读
    <b class='flag-5'>STM32</b><b class='flag-5'>单片机</b>最小系统电路设计

    MH32F103A单片机 低价替代STM32,硬件完美兼容 主频可达216M

    、I2C、UART、USB 2.0全速串行通信接口、CAN总线控制器以及SDIO接口。 MH32F103A单片机可用于替代STM32103,替换简单,功能更强,价格更低。 应用场景 MH32F103A
    的头像 发表于 02-14 16:14 895次阅读
    MH32F103A<b class='flag-5'>单片机</b> 低价替代<b class='flag-5'>STM32</b>,硬件完美兼容 主频可达216M

    延时继电器功能汇总与应用

    延时继电器是一种在电气系统中广泛应用的控制元件,在电路中实现定时闭合或断开控制,为各种应用场景提供灵活的时间管理功能。 通常,聚英延时继电器
    的头像 发表于 01-17 16:03 1175次阅读