STM32:基本定时器原理和定时程序

STM32——TIMER(定时器)篇 使用纯软件(CPU死等)的方式实现定时(延时)功能缺点:1. 延时不准确 2. CPU死等。主要特性:16位递增计数器(计数值:0~65535)16位预分频器(分频系数:1~65536)可用于触发DAC在更新事件(计数器溢出)时,会产生中断/DMA请求主要特性:16位递增、递减、中心对齐计数器(计数值:0~65535)16位预分频器(分频系数:1~65536)可用于触发DAC、ADC在更新事件、触发事件、输入捕获、输出比较时,会产生中断/DMA请求。 阅读详情

一、初识定时器TIM

        定时器就是计数器,定时器的作用就是设置一个时间,然后时间到后就会通过中断等方式通知STM32执行某些程序。定时器除了可以实现普通的定时功能,还可以实现捕获脉冲宽度,计算PWM占空比,输出PWM波形,编码器计数等。

STM32共11个定时器,2个高级控制定时器TIM1和TIM8,4个通用定时器TIM2~TIM5,两个基本定时器TIM6和TIM7,两个看门狗定时器和一个系统滴答定时器Systick.
高级定时器TIM1和TIM8的时钟由APB1产生,其它六个通用定时器的时钟由APB2产生。它们的最大频率都可以配置成系统时钟的频率。

定时器种类位数计数模式捕获/比较通道应用场景
通用定时器
TIM2~TIM5
16向上,向下,双向4定时计数,PWM,输入捕获,输出比较
高级定时器
TIM1和TIM8
16向上,向下,双向4在通用的基础上,多了刹车信号输入,死区时间互补输出等工业电机功能
基本定时器
TIM6和TIM7
16向上,向下,双向4定时计数

二、基本定时器

(1)计数功能原理

        在上一期文章提到,时钟树提供稳定频率的方波信号,APB1上的时钟线连接了基本定时器和通用寄存器,APB2上的时钟线连接了高级定时器。

        对于实现计数功能,只需要一个寄存器就可以满足,寄存器只需要读到时钟信号的上升沿数值就加1。假如72MHZ的时钟信号作为输入,当该寄存器数值累加到7.2*10^7,就代表时间过去了1秒。但是寄存器通常只有16bit,最多能计数 65536个数。因此在该寄存器前面还要加一个类似的计数器,当计数满足条件时才往后续电路发送高电平,预分频器就可以充当这个角色,其本质也是一个16bit的计数器。当只需要将其设置为n-1,就可以进行n分频,从0开始计数,一直计数到n-1才会向后续电路发送高电平。预分频器最多可以进行65536分频。因此一个由预分频器和一个计数器组合成的定时器,最多可以计数65536^2次。m个定时器串联,就可以计数65536^(2*m)次。 

(2) 自动重装载寄存器

         自动重装载寄存器,它的作用就是实时监控计数器的值是否与自己的值相同。当计数器的值与自己的值相同时,便将计数器重置为0,并触发定时器更新中断。

(3)影子寄存器

        所谓的影子寄存器就是某个寄存器的拷贝。在上图中工作在一线的预分频器和自动重装载寄存器其实都是自己的影子寄存器。当定时器正在工作时,如果重新设置预分频器值或者重新这是自动重装载寄存器的值,那么只有当计数器和自动重装载寄存器的值一样时才会将新值更新到自身影子寄存器中。也就是给定时器设置的新参数值要等下个计数周期才生效。

        自动重装载寄存器可以根据程序员选择是否开启影子寄存器。如果不开启,那么将自动重装载寄存器数值调小时,可能会错过计数器的值,使计数器一路上到65536才会归0。

三、定时程序

(1)准备工作

为了发送数据进行模拟,需打开USART2用于设置模式为“异步”,在NVIC Settings中打开中断,打上√,在DMA Settings,打开DMA传输功能,添加传输通道。

为提高计数精度,将外部时钟源设置为"晶振",在时钟设置界面中的HCLK的频率设置为72MHZ,自动调整其它器件的时钟频率。

对于我使用的STM32F108T6芯片只有4个定时器,即1个高级,3个通用寄存器。虽然没有基本定时器,但是这些定时器都包含了基本定时器功能。只需要对定时器的时钟源选择 Internal Clock (内部时钟源)就算打开了定时器。因为本次模拟的时钟频率是72MHZ,设置预分频器7200,自动重装载寄存器为10000,那么完成一个周期的计数就是1s,也就是1s触发一次定时器更新中断。同第一步类似,TIM也可以开启中断和DMA通道。保存并生成代码。

(2)实现定时任务和获取计数器数值:

以下示例代码为开启TIM中断和USART2中断实现,以及开启了自动重装载寄存器的影子寄存器

1.开启定时器

HAL_TIM_Base_Start(&htim);        //用阻塞的方式开始定时器

HAL_TIM_Base_Start_IT(&htim);        //用中断(非阻塞)的方式开始定时器

HAL_TIM_Base_Start_DMA(&htim);    //用DMA(非阻塞)的方式开始定时器

2.中断回调函数

在路径 ~/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c中

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

当计数器数值和自动重装载寄存器值一样时调用

3.读写定时器中寄存器的宏定义操作

__HAL_TIM_GET_ANTORELOAD //获取自动重装载寄存器数值

__HAL_TIM_SET_ANTORELOAD //设置自动重装载寄存器数值

__HAL_TIM_GET_COUNTER        //获取计数器数值

__HAL_TIM_SET_COUNTER        //设置计数器数值

__HAL_TIM_SET_PRESCALER    //设置预分频器数值

4.示例代码

/* USER CODE BEGIN Includes */
#include <string.h>
#include <stdio.h>
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/
TIM_HandleTypeDef htim4;

UART_HandleTypeDef huart2;
DMA_HandleTypeDef hdma_usart2_rx;
DMA_HandleTypeDef hdma_usart2_tx;

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_DMA_Init(void);
static void MX_USART2_UART_Init(void);
static void MX_TIM4_Init(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
char message2[]="☺☹";
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
	if(htim == &htim4){
		HAL_UART_Transmit_IT(&huart2, (uint8_t*)message2,strlen(message2));
	}
}
/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_USART2_UART_Init();
  //TIM4的初始化
  MX_TIM4_Init();
  /* USER CODE BEGIN 2 */
  //用中断的方式开启定时器
  HAL_TIM_Base_Start_IT(&htim4);
  int counter = 0;
  char message[20];
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  counter = __HAL_TIM_GET_COUNTER(&htim4);
	  sprintf(message,"counter:%d",counter);
	  //每隔100ms发送 counter计数器数值
	  //HAL_UART_Transmit_IT(&huart2, (uint8_t*)message,strlen(message));
	  //延迟100ms
	  HAL_Delay(100-1);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

STM32F1 定时器解析 PWM控制就是对脉冲的宽度进行调制的技术,即通过一系列脉冲宽度进行调制,来等效地获得所需要的波形(含形状和幅值)。PWM控制的基本原理是面积等效原理,芯片输出的TTL电平只有高电平和低电平,如果要获得一个介于二者之间或者其他数值的电平时就需要用到PWM技术,可以通过改变高电平所占整个电平周期的时间来实现。高电平所占整个电平周期的时间称为占空比,也就是说可以通过改变占空比来获得需要的波形,电平波形的有效值就是需要获得的电平值。 阅读详情

相关推荐

STM32---基本定时器(含源码)小白可入

本节我们学习了STM32定时器中的基本定时器,主要内容包括:定时器的概述、基本定时器的内容、相关寄存器的讲解,实验的配置步骤与相关库函数,,最后利用实验证明了的基本定时器的使用。

m0_56399733的博客 4897

STM32-定时器详解

定时器作为微控制器不可缺少的外设,在STM32中也是如此。相信不少初学者学到定时器的时候对STM32的学习热情就大打折扣甚至想要放弃了,因为这一部分知识确实比较复杂。但是,如果你在之前对GPIO、串口通信、外部中断的学习中把这些外设掌握了的话,学习这个新知识并不难。 例本章共计1万余字,从STM32定时器的原理、寄存器介绍、定时器配置以及定时器的几个常用的功能(如定时器中断、定时器输出比较PWM波形、定时器输入捕获测电平长度、定时器编码器模式应用等)的使用方法来教大家掌握定时器这一外设。

qq_44016222的博客 18万+

STM32--基本定时器&&通用定时器

1.定时器概述 定时器分为基本定时器,通用定时器,高级定时器。 例如:STM32F10x系列包含4个通用定时器(TIM2~TIM5但是STM32F103Rx系列只有3个通用定时器(TIM2~TIM4))。这些通用定时器是完全独立的,不共享任何资源。每个定时器都包含一个16位的计数器(计算范围:0~65535),并且这些定时器都可以通过预分配器来对输入的时钟源进行分频(分频就是降低计数频率),来满足更长的的计时要求。通用定时器除了基本的定时功能以外,还具有输入捕获(测量输入信号脉冲长度)、输出比较(产生输

qq_45604814的博客 8135

STM32定时器

STM32的定时器主要分为三种:高级定时器(TIM1/TIM8)、通用定时器(TIM2-TIM5)、基本定时器(TIM6/TIM7),基本功能不多做介绍,到处都有。

zhuxinmingde的博客 5348

STM32基本定时器TIM6和TIM7

1. STM32上定时器的分类前面学习了STM32系统定时器SysTick,它的主要作用是为OS提供系统滴答,当然我们也可以利用它实现了精准延时。在STM32单片机中,除了属于CM3内核中的一个外设的系统定时器外,还有几个属于片上外设的定时器:基本定时器(TIM6和TIM7)、通用定时器(TIM2/3/4/5)和高级定时器(TIM1和TIM8)。强调,这里指的是除互联型的STM32F1系列单片机。

echo_bright_的博客 1万+

STM32定时器原理和使用

STM32微控制器提供了一系列的定时器模块(TIM),不同型号的STM32有不同数目和类型的定时器。

STONE的博客 1297

STM32F4定时器中断理解

作用: 1.使用定时器可以替代延延时函数,延时函数占用CPU。 2.定时器计算固定脉冲,时间可准确计算: 公式: Ft=168Mhz/4*时钟分频 Tout(us)=((arr+1)*(psc+1))/Ft(Mhz) arr:自动重装载值 psc:定时器分频 (分频系数) //-1为参考手册要求 Ft:定时器时钟频率 Mhz 例: 定时器时钟84Mhz,8400分频,500重装值 Tout=(8400*500)/84M=0.05us=500ms 500ms定时器溢出一次

wu58430的博客 3884

STM32 定时器原理

/使能TIMx外设。TIM2-TIM5可以有向上计数、向下计数、向上向下双向计数三种计数模式 ——向上计数模式中,计数器从0计数到自动重装溢出值(TIMx_ARR计数器内容),然后重新从0开始计数并且产生一个计数器溢出事件 ——向下计数模式中,计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入值重新开始,并产生一个计数器向下溢出事件 ——中央对齐模式(向上/向下计数),是计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;

2301_79990172的博客 1168

STM32定时器中断

定时器中断则是通过时钟定时计数达到设定值时触发中断,进行中断服务函数的处理任务,定时器中断相比软件延时更加准确,且不占用CPU资源。

qq_52791446的博客 1万+

STM32:STM32定时器:STM32基本定时器和看门狗定时器讲解

看门狗定时器(Watchdog Timer, WDT)在嵌入式系统中扮演着至关重要的角色,主要用于监控系统的运行状态,防止程序跑飞或陷入死循环。当系统正常运行时,看门狗定时器会被定期“喂狗”,即重置其计数器,以保持其不触发。一旦系统出现异常,未能在规定时间内重置看门狗定时器,计数器将溢出,触发系统复位,从而确保系统能够从异常状态中恢复,继续正常运行。在STM32微控制器中,看门狗定时器的使用尤为关键,因为它能够帮助开发者在无人值守的环境中,提高系统的稳定性和可靠性。

kkchenjj的博客 1166

逆向工程师视角:拆解DataDome滑块验证码的3层防护机制与绕过思路

本文从逆向工程师视角,深入剖析DataDome滑块验证码的三层核心防护机制。第一层通过动态加密参数实现会话绑定与抗重放;第二层采集TLS指纹、鼠标轨迹动力学等多维行为数据进行一致性验证;第三层则是基于机器学习的后端异步风险决策引擎。文章不仅拆解了其技术原理,更分享了模拟、钩取等超越单纯工具调用的底层分析与绕过思路。

f6g7h8i9j的博客 729

STM32定时器详解

定时器作为微控制器不可缺少的外设,在STM32中也是如此。相信不少初学者学到定时器的时候对STM32的学习热情就大打折扣甚至想要放弃了,因为这一部分知识确实比较复杂。但是,如果你在之前对GPIO、串口通信、外部中断的学习中把这些外设掌握了的话,学习这个新知识并不难。例本章共计1万余字,从STM32定时器的原理、寄存器介绍、定时器配置以及定时器的几个常用的功能(如定时器中断、定时器输出比较PWM波形、定时器输入捕获测电平长度、定时器编码器模式应用等)的使用方法来教大家掌握定时器这一外设。

zhuxinmingde的博客 7877

从零构建机械臂规划栈:Pinocchio、OMPL与Ruckig的工程化融合实践

本文详细介绍了如何从零构建机械臂规划栈,通过融合Pinocchio、OMPL和Ruckig三大核心组件,实现高性能的机械臂运动规划与轨迹生成。文章深入探讨了技术选型、工程架构设计及实战优化技巧,特别针对逆解、路径规划和轨迹平滑等关键环节提供了实用解决方案,适用于工业场景中的高实时性需求。

weixin_29072299的博客 433

STM32定时器基本原理

目录 一、STM32定时器 二、通用定时器 1、通用定时器的功能特点 2、可产生中断或DMA的事件 3、计数器模式 4、工作过程 5、计数器时钟源选择 6、计数器时基单元 7、定时器同步 一、STM32定时器 STM32中定时器可分为高级定时器、通用定时器、基本定时器三类,他们都是由一个可编程的16位预分频器(TIMX_PSC)驱动的16位 自动装载计数器(TIMX_CNT...

hurryddd 1万+

告别图像畸变:手把手教你用HALCON的`gen_image_to_world_plane_map`做高精度视觉测量

本文详细解析了HALCON的`gen_image_to_world_plane_map`算子在工业视觉测量中的应用,通过精确的几何变换消除透视畸变,提升测量精度。文章涵盖相机标定、世界坐标系建立、实战应用及性能优化,适用于液晶屏质检、金属板检测等场景,帮助工程师实现高精度视觉测量。

weixin_28718487的博客 421

抖音直播间人气接口算法 抖音协议

抖音直播间人气接口算法 抖音协议 抖音算法

Q44804487的博客 1万+

STM32——定时器

STM32定时中断的实现

Black__goat的博客 4768

【NLP】文献翻译4——CH-SIMS:中文多模态情感分析数据集与细粒度的模态注释

CH-SIMS: A Chinese Multimodal Sentiment Analysis Dataset with Fine-grained Annotations of Modality摘要1. 介绍2. 相关工作2.1 多模态数据集2.2 多模态情感分析2.3 多任务学习3. CH-SIMS 数据集3.1 数据获取3.2 标注3.3 特征提取4. 多模式多任务学习框架4.1 单模态子网4.2 特征融合网络4.3 优化目标5. 实验5.1 基准5.2 实验的细节5.3 结果和讨论5.3.1 与

YoungSeng's Blog 1万+

STM32定时器及输出PWM完成呼吸灯

通过本次实验,了解到了可以使用定时器实现时间的控制和如何用PWM完成呼吸灯的设置,开心!!!

2301_77119177的博客 3183

Matt Pocock Skills — AI 编码代理技能包介绍与使用指南

《Matt Pocock Skills:AI编码代理技能包指南》 摘要: Matt Pocock Skills是一套开源AI编码代理技能包,旨在解决AI辅助开发中的四大痛点:需求理解偏差、token浪费、代码质量差和架构腐化。该技能包包含多种实用工具:/grill-with-docs用于需求对齐,/tdd实现测试驱动开发,/diagnose提供规范化调试流程,/triage管理issue生命周期。核心思想包括:通过拷问式对齐确保需求理解一致,建立共享领域语言提高沟通效率,快速反馈闭环加速开发,以及持续架构维

qq_45859163的博客 2219

芯片原厂linux驱动开发的分享

大家好,我是XX,来自湖南XX学院,电子信息18级,也曾在创新基地控制组学习过两三年,毕业后就职于一家芯片原厂的解决方案部,担任驱动工程师的职位,算上实习期,我的工作时长已有两年。在此我想将这两年期间学习与积累到的一些经验输出出来,与大家一同分享。知识面有限,只能简单介绍一些驱动开发方向的一些经验,且由于经验尚浅,文中难免会有一些疏漏和错误之处,还请大家积极地批评指正。

嵌入式技术开发 845

STM32定时器原理及应用

定时器原理定时器本质上是一个计数器。如果输入的是一个恒定的脉冲信号源(时钟信号)就可以根据定时器的计数(脉冲个数)和时钟频率计算出时间。2. 定时器分类大容量的STM32F103xx增强型系列产品包含最多2个高级控制定时器,4个通用定时器,2个基本定时器,1个实时时钟,2个看门狗定时器和1个系统滴答定时器。高级定时器、通用定时器、基本定时器都是由一个可编程的驱动的16位构成。定时器通常按计时方式和功能特点进行分类:(1)按功能特点分类。

香草味冰淇淋 2502

性能优化-高通cDSP(QDSP6)架构详解

高通cDSP开发的商业价值30秒快速认识高通cDSP开发的商业价值【高通cDSP旨在处理一些简单但需要大量计算的场景,如图像处理、科学计算、AI训练、计算机视觉等。这些场景使用CPU来运算会极大的降低CPU的吞吐量,因此利用现代寄存器较宽的特性设计出了适配数据并行的DSP芯片,cDSP就是典型的代表。利用cDSP+CPU既可以满足一般的使用场景,也可以完成现代图像和视频数据的处理。

发狂的小花的博客 5942

STM32之定时器

TIM(Timer)定时器定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时(定时时间最大—>频率最低:65536*65536/72M)不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等多种功能根据复杂度和应用场景分为了高级定时器、通用定时器、基本定时器三种类型。

qq_15434925的博客 2627

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

上一篇: STM32:时钟树原理概要
下一篇: 文件共享服务(一)——DAS、NAS、SAN存储类型
superSmart_Dong
博客等级 码龄10年 678粉丝 167原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值