Advertisement

STM32F103单片机编程与SysTick系统定时器学习:延时函数解析

  •  5星
  •     浏览量: 0
  •     大小:None
  •      文件类型:DOCX


简介:
本文章深入探讨了基于STM32F103芯片的单片机编程技巧,并详细解析了如何利用SysTick系统定时器实现精准延时功能,适用于嵌入式开发初学者和进阶者。 学习STM32F103单片机编程中的SysTick系统定时器是一个重要的环节。这里主要关注`SysTick_Type`结构体的四个变量:为什么设置为`SysTick->CTRL=0x00000005;`可以开启计时,而设置为`SysTick->CTRL=0x00000004;`则关闭定时器。 STM32F103单片机基于ARM Cortex-M3内核设计,广泛用于嵌入式系统开发。其中的SysTick(系统滴答定时器)是Cortex-M系列处理器内置的一个重要组件,主要用于实现精确延时和实时操作系统(RTOS)任务调度的功能。 SysTick是一个24位递减计数器,在每次重置到预设初始值后会再次开始计数。这使得它成为微秒级延时的理想选择。其配置通过`SysTick_Type`结构体中的四个成员完成,包括控制和状态寄存器(CTRL)、加载寄存器(LOAD)、当前值寄存器(VAL)以及校准寄存器(CALIB)。 1. `CTRL`: 控制和状态位的32位寄存器包含多个标志: - 位置0:COUNTFLAG,表示计数是否已到达零点。 - 位置1: CLKSOURCE, 设置为0时使用外部参考频率;设置为1则采用核心频率(内部)作为时钟源。 - 位置2: TICKINT,中断使能位。当此位设为1时,在每次计数到零后产生一个中断请求;否则不触发中断。 - 位置16:ENABLE, 控制定时器的开启与关闭。 2. `LOAD`: 设置SysTick的初始值寄存器。 3. `VAL`: 显示当前计数值或重置该值至0的操作。 4. `CALIB`: 提供系统时钟频率精度信息,通常不直接操作此寄存器。 在延时函数`delay_us`中,首先计算所需计数的次数并设置到LOAD寄存器。接着清零VAL寄存器,并将CTRL寄存器第16位设为1(即`SysTick->CTRL=0x00000005;`),启动定时器。在循环中通过检查COUNTFLAG位来判断计数是否完成,一旦计数结束则跳出循环。最后关闭定时器,将CTRL寄存器第16位置零(即设置为`SysTick->CTRL=0x00000004;`)。 延时函数的精度受系统工作频率影响,在此示例中假设使用72MHz的主频,则每计数一次代表大约13.89纳秒。因此,最大允许延迟值为72,000,000除以(72次/微秒),即约等于233毫秒。 综上所述,STM32F103的SysTick定时器通过正确配置`SysTick_Type`结构体中的寄存器来实现精确延时。实际应用中必须考虑系统频率稳定性以及计数溢出处理以确保功能准确可靠;在RTOS等复杂场景下,则可以配合中断服务例程进行任务调度管理。

全部评论 (0)

还没有任何评论哟~
客服
客服
  • STM32F103SysTick
    优质
    本文章深入探讨了基于STM32F103芯片的单片机编程技巧,并详细解析了如何利用SysTick系统定时器实现精准延时功能,适用于嵌入式开发初学者和进阶者。 学习STM32F103单片机编程中的SysTick系统定时器是一个重要的环节。这里主要关注`SysTick_Type`结构体的四个变量:为什么设置为`SysTick->CTRL=0x00000005;`可以开启计时,而设置为`SysTick->CTRL=0x00000004;`则关闭定时器。 STM32F103单片机基于ARM Cortex-M3内核设计,广泛用于嵌入式系统开发。其中的SysTick(系统滴答定时器)是Cortex-M系列处理器内置的一个重要组件,主要用于实现精确延时和实时操作系统(RTOS)任务调度的功能。 SysTick是一个24位递减计数器,在每次重置到预设初始值后会再次开始计数。这使得它成为微秒级延时的理想选择。其配置通过`SysTick_Type`结构体中的四个成员完成,包括控制和状态寄存器(CTRL)、加载寄存器(LOAD)、当前值寄存器(VAL)以及校准寄存器(CALIB)。 1. `CTRL`: 控制和状态位的32位寄存器包含多个标志: - 位置0:COUNTFLAG,表示计数是否已到达零点。 - 位置1: CLKSOURCE, 设置为0时使用外部参考频率;设置为1则采用核心频率(内部)作为时钟源。 - 位置2: TICKINT,中断使能位。当此位设为1时,在每次计数到零后产生一个中断请求;否则不触发中断。 - 位置16:ENABLE, 控制定时器的开启与关闭。 2. `LOAD`: 设置SysTick的初始值寄存器。 3. `VAL`: 显示当前计数值或重置该值至0的操作。 4. `CALIB`: 提供系统时钟频率精度信息,通常不直接操作此寄存器。 在延时函数`delay_us`中,首先计算所需计数的次数并设置到LOAD寄存器。接着清零VAL寄存器,并将CTRL寄存器第16位设为1(即`SysTick->CTRL=0x00000005;`),启动定时器。在循环中通过检查COUNTFLAG位来判断计数是否完成,一旦计数结束则跳出循环。最后关闭定时器,将CTRL寄存器第16位置零(即设置为`SysTick->CTRL=0x00000004;`)。 延时函数的精度受系统工作频率影响,在此示例中假设使用72MHz的主频,则每计数一次代表大约13.89纳秒。因此,最大允许延迟值为72,000,000除以(72次/微秒),即约等于233毫秒。 综上所述,STM32F103的SysTick定时器通过正确配置`SysTick_Type`结构体中的寄存器来实现精确延时。实际应用中必须考虑系统频率稳定性以及计数溢出处理以确保功能准确可靠;在RTOS等复杂场景下,则可以配合中断服务例程进行任务调度管理。
  • 51STM32C语言笔记
    优质
    本笔记深入浅出地讲解了基于51单片机和STM32单片机的C语言延时函数编写技巧,适合初学者快速掌握单片机编程基础。 51单片机C语言延时函数学习笔记以及STM32单片机的学习心得。
  • STM32F4 SysTick配置及精准毫秒级迟实现
    优质
    本文介绍了如何在STM32F4微控制器上配置SysTick定时器以实现精确的毫秒级延时功能,详细讲解了其工作原理和应用方法。 使用STM32F4的SysTick定时器配置延时函数时,请注意根据所用开发板的晶振频率调整stm32f4xx.h文件中的HSE_VALUE宏定义以及system_stm32f4xx.c文件中的PLL_M宏定义。
  • 优质
    本段介绍如何使用单片机构建定时器延时程序的方法和技巧,包括定时器的工作原理、初始化设置及常见应用场景。 本段落主要介绍了单片机定时器延时程序的相关内容。下面我们将进一步学习这一主题。
  • STM32 SysTick
    优质
    简介:STM32 SysTick定时器是Cortex-M内核的标准组成部分,提供了一个独立于硬件架构的基本定时功能,广泛应用于RTOS中的时间管理及任务调度。 STM32 SysTick系统定时器应用代码已编译成功!
  • STM32记录—SysTick
    优质
    本篇博客详细记录了作者在学习STM32微控制器过程中关于SysTick定时器的相关内容,包括其工作原理、配置方法及应用示例。 SysTick定时器是一个24位的倒计数定时器,在STM32单片机系统中扮演着重要角色。当计数值减至0后,它会自动从RELOAD寄存器重新加载初始值,并继续循环计数,除非在SysTick控制及状态寄存器中的使能位被清除。 SysTick定时器有以下几个关键用途: 1. 生成操作系统的时钟节拍:嵌入式系统中通常需要一个定时器来产生滴答中断作为时间基准。由于SysTick与NVIC紧密集成,它可以触发SYSTICK异常(异常号15),从而提供稳定的时钟节拍。 2. 方便代码移植性:Cortex-M3处理器内建了SysTick定时器,使得基于此处理器的软件在不同设备间易于移植,因为所有Cortex-M3芯片都包含这个定时器,并且使用方式和处理逻辑保持一致。 3. 时间测量与闹钟功能:除了用于操作系统之外,SysTick还可以用作时间测量或设定闹钟的功能。不过需要注意的是,在调试模式下处理器停止运行时,SysTick也会暂停计数。 要使SysTick定时器正常工作,需要执行以下步骤: - 配置计数器时钟源:通过设置CTRL寄存器中的CLKSOURCE位。 - 设置重载值:在RELOAD寄存器中设定初始值。 - 清除COUNTFLAG标志位:可通过读取或写入SysTick控制及状态寄存器(STCSR)或当前值寄存器(STCVR)实现。 - 启动定时器:设置CTRL寄存器中的ENABLE位以启动计时操作。 - 如果需要中断功能,还需开启相应的中断,并在服务例程中处理。 为了将SysTick用作系统时钟源: 1. 将STCSR的TICKINT位置为启用状态; 2. 若使用重定位向量表,则需设置SysTick异常的向量地址及提供相应服务例程入口点。 此外,SysTick还可以用来实现延时功能。这可以通过查询方式或中断方式来完成:查询模式是通过不断检查COUNTFLAG标志位判断计数是否结束;而中断模式则是在初始化阶段设定好定时值和中断,并在溢出时由相应的中断服务程序处理延时期满。 例如,以下是一个简单的配置函数示例,用于设置SysTick每1毫秒产生一次中断(假设系统主频为72MHz): ```c void SysTick_Configuration(void){ // 选择AHB总线作为计数器时钟源 SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK); // 设置SysTick优先级为3 NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick, 7); // 每毫秒触发中断,假设系统时钟频率为72MHz SysTick_SetReload(72000); // 启用SysTick的中断功能 SysTick_ITConfig(ENABLE); } ``` 以上内容概述了STM32单片机中SysTick定时器的基本知识及其应用。它在嵌入式系统开发过程中非常重要,提供了可靠的时间管理和同步机制支持。
  • STM32F103
    优质
    本简介讨论如何在STM32F103微控制器上实现准确的软件延时功能,包括常用的方法和注意事项。适合嵌入式开发初学者参考。 使用FOR循环并通过示波器观察,在STM32F103上实现的us、ms和s级别的延时存在一定精度误差,但不影响正常使用。
  • 使用C51
    优质
    本教程介绍如何利用C51编程语言为单片机开发高效的延时函数,帮助初学者掌握基础的硬件控制技巧。 参考了关于51单片机 Keil C 延时程序的研究文章,并亲自测试和计算了一些已有的延时函数。
  • 使用C51
    优质
    本简介介绍如何运用C51编程语言为单片机开发一个高效的延时函数。通过具体代码示例,讲解了延时函数的设计原理和实现方法。 参考了关于51单片机 Keil C 延时程序的研究文章,并亲自测试和计算了一些现有的延时函数。
  • 51
    优质
    本段落介绍51单片机中常用的延时函数的设计与实现方法,包括软件延时和硬件定时器延时两种方式,帮助初学者掌握基本编程技巧。 ### 51单片机延时函数解析 #### 前言 在嵌入式系统设计中,单片机作为核心部件,其控制程序的编写是实现系统功能的基础。其中,延时函数作为控制时间间隔的重要工具,在各种场合下都有着广泛的应用。本段落将详细介绍51单片机中几种常见的延时函数,包括毫秒级、秒级以及微秒级延时函数,并分析它们的工作原理及使用方法。 #### 延时函数概述 延时函数主要用于控制程序执行过程中的时间间隔,对于没有内置硬件定时器或需要更灵活控制延时的应用场景来说尤其重要。下面我们将逐一介绍这几种常见的延时函数。 ##### 1. 24MHz晶振下的毫秒级延时函数 **函数原型**: ```c void DelayMs_24M(unsigned int n); ``` **功能描述**:该函数用于24MHz晶振条件下实现毫秒级别的延时,参数`n`表示需要延时的毫秒数。 **工作原理**:通过循环计数的方式实现延时,每毫秒大约需要357个循环周期。 **代码示例**: ```c void DelayMs_24M(unsigned int n) { unsigned int i = 0, j = 0; for (i = 0; i < n; i++) for (j = 0; j < 357; j++); } ``` **注意事项**: - 循环次数的选择需要根据具体的晶振频率进行调整,以确保延时精度。 - 在高负载环境下,实际延时可能会受到一定影响。 ##### 2. 24MHz晶振下的秒级延时函数 **函数原型**: ```c void DelayS_24M(unsigned int n); ``` **功能描述**:该函数用于24MHz晶振条件下实现秒级别的延时,参数`n`表示需要延时的秒数。 **工作原理**:同样采用循环计数方式实现,每秒大约需要54053个循环周期。 **代码示例**: ```c void DelayS_24M(unsigned int n) { unsigned int i = 0, j = 0; for (i = 0; i < n; i++) for (j = 0; j < 54053; j++); } ``` **注意事项**: - 需要注意循环次数与晶振频率之间的关系。 - 实际延时精度可能受到外部因素的影响。 ##### 3. 24MHz晶振下的微秒级延时函数 **函数原型**: ```c void Delay10Us_24M(unsigned int n); ``` **功能描述**:该函数用于24MHz晶振条件下实现微秒级别的延时,参数`n`表示需要延时的微秒数(单位:10微秒)。 **工作原理**:通过简单的循环计数实现,每次循环大约可以实现10微秒的延时。 **代码示例**: ```c void Delay10Us_24M(unsigned int n) { unsigned int i = 0; char j = 0; for (i = 0; i < n; i++) for (j = 0; j < 2; j++); } ``` **注意事项**: - 对于微秒级延时,循环次数的选择更加关键,需要准确计算。 - 实际应用中需要注意精度问题。 ##### 4. 12MHz晶振下的毫秒级延时函数 **函数原型**: ```c void DelayMs_12M(unsigned int n); ``` **功能描述**:该函数用于12MHz晶振条件下实现毫秒级别的延时,参数`n`表示需要延时的毫秒数。 **工作原理**:通过循环计数的方式实现延时,每毫秒大约需要123个循环周期。 **代码示例**: ```c void DelayMs_12M(unsigned int n) { unsigned int i = 0, j = 0; for (i = 0; i < n; i++) for (j = 0; j < 123; j++); } ``` **注意事项**: - 需要根据具体晶振频率调整循环次数。 - 实际延时可能受到外部干扰。 ##### 5. 12MHz晶振下的秒级延时函数 **函数原型**: ```c void DelayS_12M(unsigned int n); ``` **功能描述**:该函数用于12MHz晶振条件下实现秒级别的延时,参数`n`表示需要延时的秒数。 **工作原理**:采用循环计数