首页 > 其他分享 >STM32定时器篇——Systick定时器的使用(实现delay延时函数)

STM32定时器篇——Systick定时器的使用(实现delay延时函数)

时间:2024-06-15 18:29:05浏览次数:12  
标签:定时器 temp 寄存器 delay 计数器 Systick SysTick 时钟

一、Systick定时器的简介:

        Systick定时器就是系统滴答定时器,一个24 位的倒计数定时器对于CM3,CM4内核芯片,都有Systick定时器。当Systick计到0时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。l常用来做延时,或者实时系统的心跳时钟。这样可以节省MCU资源,不用浪费一个定时器。比如UCOS中,分时复用,需要一个最小的时间戳,一般在STM32+UCOS系统中,都采用Systick做UCOS心跳时钟。

二、Systick寄存器介绍:

1. SysTick控制和状态寄存器-CTRL

这个图片是截取的STM32F10xxx Cortex-M3编程手册,其中:

        第0位是SysTick定时器的使能位,为1则使能定时器;

        第1位位中断使能位,为1则产生中断,否则不动作;

        第2位为时钟源选择,为0则选择为外部时钟源(AHB总线时钟的1/8),为1则选择内核时钟;

        第16位相当于标志位,也就是SysTick数到0则该为1,读取该位后自动清零。 

 2. SysTick重装载数值寄存器

        为32位的寄存器(但也相当于24位的寄存器,因为第24到31位不用),主要作用就是当倒数到0时,将被重装载的值,也就相当于重装载寄存器。

3.SysTick当前值寄存器

        其主要作用就是记录当前倒计数器的值,写他时会清0,同时会清除COUNTFLAG标志位。

4.SysTick校准值寄存器

三、用SysTick定时器实现延时delay函数

        如果使用外部时钟源,其频率为72/8 = 9MHz,也就是记一次为1/9us,如果要定时1us则需要计数9次。总结起来就下面几步:

 1. 将定时值写入自动重装载寄存器LOAD

 2. 清空计数器:将VAl寄存器写入0

 3. SysTick定时器的使能:CTRL寄存器的第0位写1,当然此时还可以配置为外部时钟源;

 4.等待时间到达,也就是判断第16位是否为1;

 5.关闭计数器,也就是将CTRL第0位写0

 6.清空计数器:VAL寄存器清0

void delay_us(u32 xus)
{
    u32 temp;
    SysTick ->LOAD = 9*xus;//写入自动重装时间
    SysTick->VAL=0X00;//清空计数器
    SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源
    do{ temp = SysTick->CTRL;/***** 读取当前倒计数值 *****/ }
    while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
    SysTick->CTRL=0x00; //关闭计数器
    SysTick->VAL =0X00; //清空计数器
}

如果要写ms级的定时,可以直接调用delay_us函数1000次就是ims了,或者将9改为9000,如下:

void delay_ms(u16 nms)
{
 u32 temp;
 SysTick->LOAD = 9000*nms;
 SysTick->VAL=0X00;//清空计数器
 SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源
 do
 {
  temp=SysTick->CTRL;//读取当前倒计数值
 }while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
    SysTick->CTRL=0x00; //关闭计数器
    SysTick->VAL =0X00; //清空计数器
}

标签:定时器,temp,寄存器,delay,计数器,Systick,SysTick,时钟
From: https://blog.csdn.net/qq_62637071/article/details/139701909

相关文章

  • js之操作元素属性和定时器以及相关案例倒计时
    这里写目录标题一级目录二级目录三级目录WebAPIs01四、操作元素属性1.操作元素常用属性2.操作元素样式属性通过style属性操作css1.修改样式通过style属性引出2.如果属性有-连接符,需要转换为小驼峰命名法3.赋值的时候,需要的时候不要忘记加css单位通过className操作css......
  • 前端菜鸡流水账日记 -- setTimeout定时器
    中午好哇,一上午的时间过的真快,这都快要吃午饭啦,突击询问有想好吃什么吗???当然,这不是重点,重点是我今天要说的这个定时器,以及和他搭配的取消定时器,话不多说,开始我们的新内容setTimeout都不陌生就是定时器,他可以这样用setTimeout(()=>{dealData.forEach(e=>{if(aw......
  • 定时器-内核定时器
    在Linux内核中,定时器通过软件中断实现,而这个软件中断其实依赖于实际的物理定时器中断。概括来说,物理定时器会每隔一段时间发送一次中断,然后有一个全局变量jiffies就会加1,当到达某个阈值时,就会触发定时器软件中断。软件中断是在每次发生了硬件(物理)中断并处理中断后由内核去检查是否......
  • Multisim555定时器电路设计仿真
       最近在完成数电课设,需要用到555定时器产生一个秒脉冲,虽然网上有很多关于555的资料,但是按照他们的进行仿真波形一直不对。自己设计的占空比有不太准确,但是其实Multisim有提供555定时器电路设计向导,填好参数会自动生成电路。下面是仿真步骤:电路的R1和R2有参数要求,需要......
  • 定时器更新界面,线程报错
    项目场景:在javafx框架下使用线程更新UI的时候,出现无法正常更新UI。问题代码如下:packageclock;importjava.util.Calendar;importjava.util.GregorianCalendar;importjava.util.Timer;importjava.util.TimerTask;importjavafx.application.Application;importj......
  • CH32系列MCU SysTick使用与计算
    1、关于SysTickCH32F103/203:CH32F103/203为Cortex-M3内核,SysTick是一个24位的向下递减计数器,计数器每计数一次的时间可配置为1/时基。当SysTick重装载数寄存器的值递减到0的时候,产生一次中断。CH32F系列MCUSysTick由4个寄存器控制,具体如下图。具体介绍可参考《CM3权威指南》......
  • C51学习归纳5 --- 定时器
        个人觉得定时器是一个十分重要的内容,这东西忘简单说其实就是一个计数器,从设定的初始值开始加一操作,每当计数器满了,引发一次计数器中断,芯片的CPU过来进行中断处理,然后一直重复这样的过程。替代长时间的Delay,提高CPU的运行效率和处理速度。    首先,我们来考......
  • stm32系列--同一定时器双通道捕获
     voidTIM3_Cap_Init(u16arr,u16psc)//定时器3通道2输入捕获配置{TIM_ICInitTypeDefTIM_ICInitStructure;TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;NVIC_InitTypeDefNVIC_InitStructure;GPIO_InitTypeDefGPIO_InitStructure;R......
  • 用Redisson的延迟队列RDelayedQueue处理延迟任务或者定时任务
    什么是RedissonRedisson在基于NIO的Netty框架上,充分的利用了Redis键值数据库提供的一系列优势,在Java实用工具包中常用接口的基础上,为使用者提供了一系列具有分布式特性的常用工具类。什么是RDelayedQueue获取RDelayedQueue:public<V>RDelayedQueue<V>getDelayedQueue(R......
  • pvt对net delay的影响
    我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?拾陆楼知识星球入口有星球成员提问:pt中在同一个corner下的net的为啥在min和max的情况下读RC值是不一样的呢??不应该都是根据spef来的吗??回答:这个其实是个误区,相同RCcorner情况下我们看report_delay_calculation-from-......