STM32-Systick滴答定时器-延时函数

1.STM32-Systick滴答定时器

  • Systick定时器,是一个简单的定时器,对于ST的CM3,CM4,CM7内核芯片,都有Systick定时器。

  • Systick定时器常用来做延时,或者实时系统的心跳时钟。这样可以节省MCU资源,不用浪费一个定时器。比如UCOS中,分时复用,需要一个最小的时间戳,一般在STM32+UCOS系统中,都采用Systick做UCOS心跳时钟。

  • Systick定时器就是系统滴答定时器,一个24 位的倒计数定时器,计到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。

  • SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。

  • Systick中断的优先级也可以设置。

  • 4个Systick寄存器

    CTRL             SysTick 控制和状态寄存器  
    LOAD             SysTick 自动重装载除值寄存器 
    VAL              SysTick 当前值寄存器  
    CALIB            SysTick 校准值寄存器
    

可在core-core_cm7.h文件中找到

typedef struct
{__IOM uint32_t CTRL;                   /*!< Offset: 0x000 (R/W)  SysTick Control and Status Register */__IOM uint32_t LOAD;                   /*!< Offset: 0x004 (R/W)  SysTick Reload Value Register */__IOM uint32_t VAL;                    /*!< Offset: 0x008 (R/W)  SysTick Current Value Register */__IM  uint32_t CALIB;                  /*!< Offset: 0x00C (R/ )  SysTick Calibration Register */
} SysTick_Type;

SysTick 控制和状态寄存器- CTRL:

在这里插入图片描述

对于STM32,外部时钟源是 HCLK(AHB总线时钟)的1/8。内核时钟是 HCLK时钟。配置函数:HAL_SYSTICK_CLKSourceConfig();

SysTick重装载数值寄存器-LOAD

在这里插入图片描述

SysTick当前数值寄存器-VAL

在这里插入图片描述

HAL库中的Systick相关函数:

stm32f7xx_hal_cortex.c文件中:HAL_SYSTICK_CLKSourceConfig () ; //Systick时钟源选择

如果SysTick的时钟源自HCLK,假设外部晶振为25M,倍频到216MHZ,那么SysTick的时钟即为216MHZ,也就是SysTick的计数器VAL每减1,就代表时间过了1/216us。

void HAL_SYSTICK_CLKSourceConfig(uint32_t CLKSource)
{/* Check the parameters */assert_param(IS_SYSTICK_CLK_SOURCE(CLKSource));if (CLKSource == SYSTICK_CLKSOURCE_HCLK){SysTick->CTRL |= SYSTICK_CLKSOURCE_HCLK;}else{SysTick->CTRL &= ~SYSTICK_CLKSOURCE_HCLK;}
}

可以看一下CLKSource可以有哪几种:找到IS_SYSTICK_CLK_SOURCE的定义,发现可以为SYSTICK_CLKSOURCE_HCLK和SYSTICK_CLKSOURCE_HCLK_DIV8,也就是不分频或者8分频。

#define IS_SYSTICK_CLK_SOURCE(SOURCE) (((SOURCE) == SYSTICK_CLKSOURCE_HCLK) || \((SOURCE) == SYSTICK_CLKSOURCE_HCLK_DIV8))

core_cm7.h文件中:SysTick_Config (uint32_t ticks) //初始化systick,时钟为HCLK,并开启中断。

ticks:经过多少个systick周期发生一次中断。用来配置SysTick定时器经过多少个ticks发生一次中断。

__STATIC_INLINE uint32_t 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_LOAD_RELOAD_Msk,由于Systick是一个24 位的倒计数定时器,所以值不能太大。

#define SysTick_LOAD_RELOAD_Msk            (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/)

Systick中断服务函数:void SysTick_Handler (void);

2.delay函数

//初始化延迟函数
//当使用ucos的时候,此函数会初始化ucos的时钟节拍
//SYSTICK的时钟固定为AHB时钟的1/8
//SYSCLK:系统时钟频率
void delay_init(u8 SYSCLK)
{
#if SYSTEM_SUPPORT_OS 						//如果需要支持OS.u32 reload;
#endifHAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);//SysTick频率为HCLKfac_us=SYSCLK;						    //不论是否使用OS,fac_us都需要使用
#if SYSTEM_SUPPORT_OS 						//如果需要支持OS.reload=SYSCLK;					        //每秒钟的计数次数 单位为K	   reload*=1000000/delay_ostickspersec;	//根据delay_ostickspersec设定溢出时间//reload为24位寄存器,最大值:16777216,在216M下,约合77.7ms左右	fac_ms=1000/delay_ostickspersec;		//代表OS可以延时的最少单位	   SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;//开启SYSTICK中断SysTick->LOAD=reload; 					//每1/OS_TICKS_PER_SEC秒中断一次	SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //开启SYSTICK
#endif 
}				

在main中调用delay_init(216);//延时初始化。1微秒等于10的负6次方秒,1MHZ等于10^6赫兹。

fac_us=SYSCLK;系统时钟是216MHZ,fac_us=216意思是:systick运行1us,需要多少个systick周期。由于systick是216MHZ,所以需要216个周期。后面如果需要延时n个微秒,只需要n*fac_us即可。由于设置的SysTick频率为HCLK,所以调用delay_init函数中的参数SYSCLK就是216 。

delay_us函数思路:

在循环里检测当前值,如果当前值小于前一次的值,说明没有减到0,通过told-tnow就可以知道当前跑了几个周期。否则,说明已经溢出了,也就是说当前跑了reload-tnow+told个周期。最后如果时间超过/等于要延迟的时间,则退出。
在这里插入图片描述

//延时nus
//nus:要延时的us数.	
//nus:0~204522252(最大值即2^32/fac_us@fac_us=21)	    								   
void delay_us(u32 nus)
{		u32 ticks;u32 told,tnow,tcnt=0;u32 reload=SysTick->LOAD;				//LOAD的值	    	 ticks=nus*fac_us; 						//需要的节拍数 delay_osschedlock();					//阻止OS调度,防止打断us延时told=SysTick->VAL;        				//刚进入时的计数器值while(1){tnow=SysTick->VAL;	if(tnow!=told){	    if(tnow<told)tcnt+=told-tnow;	//这里注意一下SYSTICK是一个递减的计数器就可以了.else tcnt+=reload-tnow+told;	    told=tnow;if(tcnt>=ticks)break;			//时间超过/等于要延迟的时间,则退出.}  };delay_osschedunlock();					//恢复OS调度											    
}  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/560286.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为服务器更改从系统盘启动不了,华为服务器设置启动项

华为服务器设置启动项 内容精选换一换对于已安装Cloud-Init/Cloudbase-Init的云服务器&#xff0c;首次执行切换/故障切换操作&#xff0c;或者创建容灾演练后&#xff0c;系统第一次启动时会运行Cloud-Init/Cloudbase-Init&#xff0c;为云服务器重新注入初始化数据&#xff0…

STM32-NVIC中断优先级分组-中断优先级设置

STM32-中断优先级管理NVIC 1.NVIC中断优先级分组 NVIC的全称是Nested vectoredinterrupt controller&#xff0c;即嵌套向量中断控制器。STM32F中文参考手册中搜索向量表可以找到相应的中断说明。 CM4/CM7 内核支持256个中断&#xff0c;其中包含了16个内核中断和240个外部中…

hyper-v虚拟服务器内存满了,在Hyper-V Dynamic Memory里设置虚拟内存

Hyper-V R2 SP1版中加入了动态内存技术&#xff0c;关于内存分配的猜想也随之结束。当VMware可以自动进行虚拟内存分配的时候&#xff0c;Hyper-V通过动态内存让用户可以调整虚拟内存的设置。这种灵活性为主机内存分配方式提供了参考&#xff0c;有效提高了精确度和降低难度。通…

STM32-IO引脚复用-原理和使用

1.什么是端口复用&#xff1f; STM32有很多的内置外设(把一些功能ADC\看门狗…集中到芯片里面)&#xff0c;这些外设的外部引脚都是与GPIO复用的。也就是说&#xff0c;一个GPIO如果可以复用为内置外设的功能引脚&#xff0c;那么当这个GPIO作为内置外设使用的时候&#xff0c…

泰拉瑞亚服务器config修改,泰拉瑞亚配置怎么修改_泰拉瑞亚配置修改方法介绍...

泰拉瑞亚配置怎么修改呢&#xff0c;还有很多玩家还不知道的&#xff0c;下面小编为玩家们带来了泰拉瑞亚配置修改方法介绍&#xff0c;一起来看看吧。泰拉瑞亚配置修改方法介绍Config文件(1)Wiki链接http://terraria.gamepedia.com/Config.json_settings(2)关于Configconfig文…

STM32-UART-串口通信框图-波特率计算

1.处理器与外部设备通信的两种方式&#xff1a; 并行通信 传输原理&#xff1a;数据各个位同时传输。优点&#xff1a;速度快缺点&#xff1a;占用引脚资源多 串行通信 传输原理&#xff1a;数据按位顺序传输。优点&#xff1a;占用引脚资源少缺点&#xff1a;速度相对较慢…

java客户端与服务器信息加密,Java AES加密 - 在客户端和服务器之间发送初始化向量...

我在客户端生成初始化向量&#xff0c;其中消息被加密&#xff0c;然后与解密向量一起发送到服务器。Java AES加密 - 在客户端和服务器之间发送初始化向量客户端代码&#xff1a;String key1 "1234567812345678";byte[] key2 key1.getBytes();SecretKeySpec secret…

STM32-串口发送数据-过程与配置

串口发送过程配置流程 HAL库中串口寄存器定义文件&#xff1a; stm32f429xx.h F429芯片 stm32f767xx.h F767芯片 stm32f103xx.h F103芯片 stm32fnnnx.x.h 其他芯片 可以在其中找到USART_TypeDef&#xff1a;最终会映射到寄存器的地址。 typedef struct {__IO uint32_t CR1;…

STM32 串口接收流程-串口接收中断

串口接收 串口接收流程 编程USARTx_CR1的M位来定义字长。编程USARTx_CR2的STOP位来定义停止位位数。编程USARTx_BRR寄存器确定波特率。使能USARTx_CR1的UE位使能USARTx。如果进行多缓冲通信&#xff0c;配置USARTx_CR3的DMA使能&#xff08;DMAT)。使能USARTx_CR1的RE位为1使…

STM32-串口接收、发送数据实验-程序代码分析

串口通信实验 Printf支持 printf向串口发送一些字符串数据。如果使用串口2&#xff0c;可以修改while((USART1->SR&0X40)0);和USART1->DR (u8) ch; 中的USART1为USART2. //加入以下代码,支持printf函数,而不需要选择use MicroLIB #if 1 #pragma import(__use_…

STM32-外部中断配置-外部中断实验

STM32-外部中断原理与配置 IO口外部中断原理概述 STM32控制器支持的外部中断/事件请求 中断线M3M4M7EXTI线0~15:对应外部IO口的输入中断。√√√EXTI线16&#xff1a;连接到PVD输出。√√√EXTI线17&#xff1a;连接到RTC闹钟事件。√√√EXTI线18&#xff1a;连接到USB OTG…

STM32-独立看门狗原理-实验

独立看门狗原理概述 为什么要看门狗&#xff1a; 在由单片机构成的微型计算机系统中&#xff0c;由于单片机的工作常常会受到来自外界电磁场的干扰&#xff0c;造成程序的跑飞&#xff0c;而陷入死循环&#xff0c;程序的正常运行被打断&#xff0c;由单片机控制的系统无法继…

STM32-窗口看门狗-工作过程-配置-实验

窗口看门狗 窗口看门狗概述 之所以称为窗口就是因为其喂狗时间是一个有上下限的范围内(窗口&#xff09;&#xff0c;你可以通过设定相关寄存器&#xff0c;设定其上限时间&#xff08;下限固定&#xff09;。喂狗的时间不能过早也不能过晚。 而独立看门狗限制喂狗时间在0-x内…

python 列表、元组、集合、字典、循环遍历数据结构

python 列表、元组、集合、字典、数据结构的循环&#xff08;整理自python文档&#xff09;列表-list-用方括号标注&#xff0c;逗号分隔的一组值list 的 方法对list添加、插入、删除、查找、排列、翻转list.append(x)list.extend(iterable)list.insert(i, x)list.remove(x)lis…

音频和视频的基础知识

目录PCM-脉冲编码调制录音的原理记录声音-音频数字化音频数字化-PCM采样采样采样率采样定理量化位深度编码声道&#xff08;Channel&#xff09;比特率信噪比编码&#xff08;Encode&#xff09;解码&#xff08;Decode&#xff09;常见的音频编码和文件格式无损Monkeys AudioF…

神经网络算法-论证单层感知器的局限性

神经网络算法-论证单层感知器的局限性 今天课上学习了一个思路 将真值表转换到平面直角坐标系中 来论证线性可分还是不可分&#xff0c;挺有意思记录一下。 简单感知器模型实际上仍然是MP模型的结构&#xff0c;但是它通过采用监督学习来逐步增强模式划分的能力&#xff0c;达…

python 通过pip安装库 pycharm里面使用第三方库

安装所需的模块&#xff08;python&#xff09; pip 是 Python 包管理工具&#xff0c;该工具提供了对Python 包的查找、下载、安装、卸载的功能。 首先命令行输入pip3 --version查看是否有pip C:\Users\jym>pip3 --version pip 19.2.3 from d:\program files\python38\l…

python threading-单线程 多线程 主线程 子线程 setDeamon join

python threading-单线程 多线程 主线程 子线程 setDeamon join单线程多线程主线程和子线程setDaemon()join()测试多线程下程序运行的时间创建多个线程优化子线程单线程 用单线程 &#xff0c;做听音乐和看电影两件事儿&#xff0c;首先排一下顺序。 import timedef music():…

python 解决bytes和str之间 出现 TypeError的问题

解决TypeError: can only concatenate str (not “bytes”) to str 错误提示&#xff1a; pic_content pic_contentf.read() TypeError: can only concatenate str (not “bytes”) to str 首先来看代码&#xff1a; text_content HTTP/1.x 200 OK Content-Type: text/h…

python 实现TCP socket通信和 HTTP服务器、服务器和客户端通信python实例

python 实现TCP socket通信和 HTTP服务器、服务器和客户端通信实例socket是什么&#xff1f;服务器和客户端通信的流程python 实现TCP socket通信例子关于Host和PORT的设置socket函数socket编程思路基于TCP socket的HTTP服务器分析HTTP服务器代码服务器的response文本客户端的r…