STM32通用定时器使用详解

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

本文详细介绍了STM32通用定时器的功能,包括基本定时、PWM输出和输入捕获,并提供了具体的配置方法和示例代码。适用于初学者快速掌握STM32通用定时器的应用。

1.通用定时器基本介绍

  • 通用定时器包括TIM2、TIM3、TIM4和TIM5
  • STM32通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成。
  • 每个定时器都是完全独立的,没有互相共享任何资源。它们可以一起同步操作。
  • 定时器可以进行定时器基本定时,输出4路PWM,输入捕获
  • 本文详细介绍这三个功能并且利用定时器3并且示例代码使用

2.开发环境

开发平台:keil5
单片机:STM32F103ZET6


#3.基本定时功能

## 3.1定时器时钟来源分析
STM32部分时钟树:
定时器部分时钟树
  3.1.1 首先我们我们的系统时钟(SYSCLK 72MHz) 经过AHB分频器给APB1外设,但是APB1外设最大的只能到36Mhz,所以必须要系统时钟的二分频。下面又规定了如果APB1预分频系数为1则频率不变,否则频率X2至定时器27**,**所以定时器27的时钟频率为还是72MHz

  3.1.2 分配给我们定时器的时钟是72MHz,我们可以根据自己的需求再设置定时器的分频,设置它的定时值

/*
	* 初始化定时器的时候指定我们分频系数psc,这里是将我们的系统时钟(72MHz)进行分频
	* 然后指定重装载值arr,这个重装载值的意思就是当 我们的定时器的计数值 达到这个arr时,定时器就会重新装载其他值.
		例如当我们设置定时器为向上计数时,定时器计数的值等于arr之后就会被清0重新计数
	* 定时器计数的值被重装载一次被就是一个更新(Update)
	* 计算Update时间公式
	Tout = ((arr+1)*(psc+1))/Tclk
	公式推导详解:
		Tclk是定时器时钟源,在这里就是72Mhz 
		我们将分配的时钟进行分频,指定分频值为psc,就将我们的Tclk分了psc+1,我们定时器的最终频率就是Tclk/(psc+1) MHz
		这里的频率的意思就是1s中记 Tclk/(psc+1)M个数 (1M=10的6次方) ,每记一个数的时间为(psc+1)/Tclk ,很好理解频率的倒数是周期,这里每一个数的周期就是(psc+1)/Tclk 秒
		然后我们从0记到arr 就是 (arr+1)*(psc+1)/Tclk
	举例:比如我们设置arr=7199,psc=9999
	我们将72MHz (1M等于10的6次方) 分成了(9999+1)等于 7200Hz
	就是一秒钟记录9000数,每记录一个数就是1/7200秒
	我们这里记录9000个数进入定时器更新(7199+1)*(1/7200)=1s,也就是1s进入一次更新Update
*/
//简单进行定时器初始化,设置 预装载值 和 分频系数
void MY_TIM3_Init(u16 arr,u16 psc){
	
	//初始化结构体
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
	
	//1.分配时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
	
	//2.初始化定时器相关配置
	TIM_TimeBaseStructure.TIM_Period = arr;
	TIM_TimeBaseStructure.TIM_Prescaler = psc;
	
	/*在这里说一下这个TIM_ClockDivision 是设置与进行输入捕获相关的分频
		设置的这个值不会影响定时器的时钟频率,我们一般设置为TIM_CKD_DIV1,也就是不分频*/
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
	
	//3.打开定时器
	TIM_Cmd(TIM3,ENABLE);
}

/****************** 主函数 ********************/
//在主函数中我们可以调用初始化
int main(){
	//定时器初始化
	MY_TIM3_Init(7199,9999);
	while(1){
		
		//检测更新标志位
		if(TIM_GetFlagStatus(TIM3,TIM_IT_Update)){
			//清除标志位
			TIM_ClearFlag(TIM3,TIM_IT_Update);
			//....(每隔一秒执行任务)
		}
		
	}
}

#4.定时器输出PWM # 4.1基本介绍   **4.1.1** **PWM**是脉冲宽度调制,我们是通过改变**脉冲的宽度**来达到改变**输出电压**的效果,本质上就是调节**占空比**实现的,STM32除了**基本定时器(TIM6,TIM7)不能输出PWM**以外,其它的定时器都具有输出PWM,其中**高级定时器(TIM1和TIM8)**还能输出**7**路PWM,**基本定时器(TIM2,TIM3,TIM4,TIM5)**也可以输出**4**路PWM > 输出**PWM**是很有用的,比如我们可以通过**控制电机**来玩小车,或者通过输出PWM改变LED的亮度,制造**呼吸灯**等等

  4.1.2 我们通用定时器能输出PWM的IO口是固定的,虽然我们可以通过重映射可以改变引脚,具体是哪一些IO口我们要通过查阅STM32的参考手册

这里涉及到一个重映射的概念,重映射就是管脚的外设功能映射到另一个管脚,但是不是可以随便映射的,具体对应关系参考手册上的管脚说明。这样优点是可以优化电路设计;扩展功能,减少外设芯片资源

/**
	定时器3,可产生四路的PWM输出,四个通道分别对应的引脚情况如下
	TIM3_CH1,TIM3_CH2,TIM3_CH3,TIM3_CH4
	没有重映像的对应情况:
	PA6,PA7,PB0,PB1
	部分重映像:
	PB4,PB5,PB0,PB1
	完全重映像:
	PC6,PC7,PC8,PC9	

	当我们的IO口不仅仅是做普通的输入输出使用的时候,作为别的外设(AD,串口,定时器等)的特定功能引脚,就需要开启外设.
	这里我们还需要开启APB2外设上的复用时钟AFIO,同时IO口采用的是复用输出!

	我们这里是没有使用重映射功能.
*/
// 宏定义
//判断当前是处于哪一种模式,以便于我们初始化IO口
#define NO_REAMP   0
#define PART_REAMP 1
#define FULL_REAMP 2

// ---> 这里是需要制定的参数

//指定这里的 当前的模式,我们给她默认指定是 没有重映射
#define CURRENT_MODE NO_REAMP 

//*************根据当前模式初始化IO口 函数
void MY_TIM3_GPIO_Init(void){
	
	GPIO_InitTypeDef 	GPIO_InitStructure;
	
	//1.开启AFIO时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	
	//2. 根据当前的重映像的模式 配置时钟 和 初始化相关引脚
	switch(CURRENT_MODE){
		
		//2.1 如果没有重映射
		case NO_REAMP:{
			
			// 时钟分配
			RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);
			// 初始化IO口
			GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
			GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
			GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
			GPIO_Init(GPIOA,&GPIO_InitStructure);
			GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
			GPIO_Init(GPIOB,&GPIO_InitStructure);
			
			break;
		}
		//2.2 部分重映射
		case PART_REAMP:{
			
			// 时钟分配
			RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
			// 初始化IO口
			GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
			GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
			GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_4|GPIO_Pin_5;
			GPIO_Init(GPIOB,&GPIO_InitStructure);
			
			break;
		}
		//2.3 全映射
		case FULL_REAMP:{
			
			// 时钟分配
			RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
			// 初始化IO口
			GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
			GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
			GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
			GPIO_Init(GPIOB,&GPIO_InitStructure);
			
			break;
		}
		default:break;
	}	
}

//***************** 定时器PWM输出初始化函数
void MY_TIM3_PWM_Init(u16 arr,u16 psc){
	
	//初始化结构体
	TIM_OCInitTypeDef TIM_OCInitstrcuture;
	
	//1.初始化定时器 和 相关的IO口
	MY_TIM3_Init(arr,psc); 
	MY_TIM3_GPIO_Init();
	
	//2.初始化PWM的模式
	
	/**
	选择PWM模式:
		PWM1模式:
			向上计数时,当我们 当前的 计数值 小于我们的设置阈值为有效电平,否则为无效电平,向下计数时与向上计数时相反
		PWM2模式:
			与PWM1模式向上向下计数时完全相反
	*/
	TIM_OCInitstrcuture.TIM_OCMode = TIM_OCMode_PWM1;
	TIM_OCInitstrcuture.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitstrcuture.TIM_OCPolarity = TIM_OCPolarity_High;   //输出电平为高,也就是有效电平为高
	TIM_OC1Init(TIM3,&TIM_OCInitstrcuture);						//这里是设置利用通道1输出
	
	//这里只初始化通道1,我们可以根据自己需求初始化其它通道
	
//	TIM_OC2Init(TIM3,&TIM_OCInitstrcuture);
//	TIM_OC3Init(TIM3,&TIM_OCInitstrcuture);
//	TIM_OC4Init(TIM3,&TIM_OCInitstrcuture);

	TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能预装载寄存器
}

//*********************主函数调用
int main(){
	
	//因为我们单片机引脚输出电压3.3V左右,我们设置预装载值为330
	MY_TIM3_PWM_Init(330,0);
	
	//我们初始化的时候选择的是PWM1模式,当计数值小于我们的设定值100时为有效电平,这里是高电平
	//所以对于的1通道(PA6)电压是大概就是 3.3 * (100/330) = 1V 左右,我们可以用万用表测量
	TIM_SetCompare1(TIM3,100);
	
	while(1);
}

#5.定时器输入捕获
## 5.1基本介绍

  • 上面介绍了定时器的四路通道可以输出PWM,同样的我们也可以捕获该定时器这四路通道上的边沿状态(上升沿,下降沿)

  • 由此可见基本定时器也不能进行输入捕获,没有思路通道

我们可以通过输入捕获的来测量高电平脉宽时间,首先捕获到高电平,记录下改时间,然后切换为捕获低电平,得到时间
## 5.2开发步骤
###   输入捕获 (捕获边沿信号,上升沿和下降沿)
   首先我们需要以一定的频率检测电平的跳变,然后对部分跳变(也就是部分输入的波形)进行过滤
      ------ 这就是定时器里面的滤波器的任务

  1. 指定输入滤波器时钟频率,首先是系统时钟分给定时器72Mhz,我们首先初始化定时器的时候指定了TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; 没有分频,输入给滤波器的时钟频率还是72MHz,TIM_ClockDivision也可以指定为2分频或者4分频
  2. 波形过滤(TIM_ICFilter),这里有一个指定过滤器的参数(参考芯片手册),例如我们设置参数为0101(二进制),采样频率(fsampling)为 滤波器频率/2 = 36Mhz,N=8.当检测到一个上升沿的时候,再以fsampling频率连续8次检测到高电平才确认是一个有效的上升沿,这样可以滤除那些高电平脉宽低于8个采样周期的脉冲信号,从而达到滤高频波的效果。
    这里写图片描述
  3. 配置输入分频(TIM_ICPrescaler),如果我们设置不分频,一个边沿(上升沿或者下降沿)就触发一次捕获,二分频就是两次边沿触发捕获,这里这个分频可以为1,2,4,8
//定时器输入捕获初始化
void MY_TIM3_Cap_Init(u16 arr,u16 psc){

	//初始化结构体
	TIM_ICInitTypeDef TIM_ICInitStructure;
	
	//1.初始化定时器 和 相关的IO口
	MY_TIM3_Init(arr,psc); 

	//这里的IO口根据自己需求改成输入,我这改成下拉输入,具体代码就不展现了
	MY_TIM3_GPIO_Init();
	
	//2.初始化定时器输入捕获
	TIM_ICInitStructure.TIM_Channel = TIM_Channel_1 ; // 设置输入捕获的通道
	
	//不使用过滤器,假设我们想使用,例如上述举例使用0101
	//我们就给TIM_ICFilter  = 0x05 ,(0000 0101),根据上表可以知道这个值范围(0x00~0x0F)
	TIM_ICInitStructure.TIM_ICFilter = 0x00;
	
	TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
	TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;		//配置输入分频,这里不分频,1次检测到边沿信号就发生捕获

	/*
		这里说一下定时器通道可以进行交叉捕获,通道1捕获通道2引脚上的边沿信号,通道2捕获通道1引脚,通道3可以捕获通道4对应引脚,... 
		但是只能相邻一对可以相互捕获,例如通道2不能捕获通道3引脚边沿信号
		TIM_ICSelection_DirectTI 表示直接捕获,通道1对应通道1引脚,通道2对应通道2引脚
		TIM_ICSelection_IndirectTI 表示进行交叉捕获
	*/
	TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射捕获对应通道的引脚
	TIM_ICInit(TIM3,&TIM_ICInitStructure);													
	
}
//****************主函数
int main(){
	//初始化输入捕获
	MY_TIM3_Cap_Init(1000,0);
	
	while(1){
		//检测是否捕获到上升沿
		if(TIM_GetFlagStatus(TIM3,TIM_IT_CC1)){
			TIM_ClearFlag(TIM3,TIM_IT_CC1);
			//捕获到上升沿之后的任务...
			//一般测量高电平脉宽,我们可以先捕获上升沿再捕获下降沿
			//TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling); 修改为下降沿捕获
		}
		
	}
}

#6.定时器中断
 1.谈及到中断,我们就必须涉及到NVIC,具体关于NVIC请参考我的另外一篇,这里是直接使用,我们使能定时器3中断并且配置完抢占优先级和响应优先级之后,再在主函数中使能其更新中断和输入捕获中断

//使能更新中断和输入捕获通道1的中断
TIM_ITConfig(TIM3,TIM_IT_Update|TIM_IT_CC1,ENABLE);

 2.我们使用中断的一个主要目的就是能够及时处理信息,不用在主函数的while循环里面等待

//定时器3的中断处理函数
void TIM3_IRQHandler(void){
	
	//1.判断是什么中断
	
	// 1.1定时器更新中断
	if(TIM_GetITStatus(TIM3,TIM_IT_Update)){
		//...处理定时器更新之后任务
	}
	// 1.2如果是定时器 通道1的捕获中断
	else if( TIM_GetITStatus(TIM3,TIM_IT_CC1) ){
			//处理输入捕获之后的任务
			//TIM_OC1PolarityConfig(TIM3,TIM_ICPolarity_Falling);更改为下降沿捕获
	}
	
	//2.最后将中断标志位都清理掉
	TIM_ClearITPendingBit(TIM3,TIM_IT_Update|TIM_IT_CC1);
}
STM32F1 定时器解析 PWM控制就是对脉冲的宽度进行调制的技术,即通过一系列脉冲宽度进行调制,来等效地获得所需要的波形(含形状和幅值)。PWM控制的基本原理是面积等效原理,芯片输出的TTL电平只有高电平和低电平,如果要获得一个介于二者之间或者其他数值的电平时就需要用到PWM技术,可以通过改变高电平所占整个电平周期的时间来实现。高电平所占整个电平周期的时间称为占空比,也就是说可以通过改变占空比来获得需要的波形,电平波形的有效值就是需要获得的电平值。 阅读详情

相关推荐

STM32同时使用多个定时器

  代码如下: void TIM2_IRQHandler ( void ) { if ( TIM_GetITStatus ( TIM2, TIM_IT_Update ) != RESET ) { /* user code */ } TIM_ClearITPendingBit ( TIM2, TIM_IT_Update ); } void TIM2_Int_Init ( u16 arr, u16 psc ) { TIM_TimeBaseInitTypeDef

健身房 8857

STM32-定时器详解

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

qq_44016222的博客 18万+

STM32定时器详解:从SysTick到RTC与通用定时器

定时器是嵌入式系统的核心组件,为各类时序控制提供硬件支持。其工作原理基于计数器与时钟源的组合,通过预分频和自动重载机制实现精确时间控制。在嵌入式开发中,定时器技术价值体现在实时性保障、低功耗管理和硬件加速等方面,广泛应用于PWM生成、输入捕获、任务调度等场景。以STM32为例,SysTick作为Cortex-M内核的系统节拍定时器,为RTOS提供基础时基;RTC模块则实现日历功能和低功耗唤醒;通用定时器支持PWM、输入捕获等丰富功能。掌握这些定时器资源的配置与优化技巧,是提升嵌入式系统性能的关键。

weixin_33314040的博客 335

STM32定时器

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

zhuxinmingde的博客 5349

STM32:STM32定时器:STM32通用定时器详解

脉冲宽度调制(Pulse Width Modulation,简称PWM)是一种对模拟信号电平进行数字编码的方法。通过高分辨率的数字计数器,PWM使用数字输出对模拟电路进行控制。在STM32中,通用定时器可以配置为PWM输出模式,用于控制电机速度、LED亮度等需要模拟信号的应用场景。

kkchenjj的博客 1894

(超详细)Qt入门和配置Visual Studio的Qt环境

内容写了Qt入门,创建并编写第一个Qt程序,以及配置VS编写Qt程序的环境。(超级详细)

LY549826LY549264的博客 7679

stm32通用定时器详解

在stm32的开发中我们经常会用到定时器,因此在学习stm32的过程中定时器是必须要学的,而定时主要又分为三大类分别为: 高级控制定时器(TIM1与TIM8) 通用定时器(TIM2~TIM5) 基本定时器(TIM6与TIM7) 今天我只要想给大家介绍的是第二种通用定时器(TIM2~TIM5),还是老样子我先以文字给大家简单概述,在通过视频详细为大家分析细节。 精通定时间的老油条勿喷!!!...

weixin_30527143的博客 922

从零搭建私有AI工作站:Ollama+DeepSeek+Dify本地化部署全攻略

本文提供了一份详尽的本地化AI工作站搭建指南,核心在于实现数据安全与离线可用。通过整合Ollama、DeepSeek与Dify三大工具,手把手教你完成从环境配置、模型部署到可视化应用构建的全过程,重点解决了Dify连接Ollama等关键步骤,助你打造一个完全自主可控的私有AI开发环境。

weixin_28396629的博客 311

STM32之通用定时器详解

PWM 核心参数频率:1 秒钟,PWM 输出波形的次数。需依据实际设备应用场景分析确定,不同场景对频率需求不同,如电机控制、LED 调光等场景,合适频率可保障功能稳定与效果。占空比:一个 PWM 周期内,高电平持续时间与整个 PWM 周期时间的比值,决定了有效电平在周期内的占比,影响输出能量、亮度等。实现依赖。

m0_74186706的博客 1538

别再手动查日志了!用Dify+Zabbix打造你的专属运维“嘴替”(保姆级配置流程)

本文详细介绍了如何利用Dify平台与Zabbix监控系统集成,构建智能运维对话系统,实现自然语言交互的运维管理。通过保姆级配置流程,帮助运维工程师提升查询效率、降低学习成本,打造企业级智能运维解决方案。

weixin_27298377的博客 456

树莓派作为Modbus服务器:pymodbus配置全记录

手把手教你用树莓派部署Modbus服务器,核心基于pymodbus实现数据通信与设备控制,涵盖配置步骤与常见问题,适合工业自动化场景应用。

weixin_42510201的博客 756

STM32_基础入门(十一)第二篇_通用定时器使用详解

STM32_基础入门(十一)第二篇_通用定时器使用详解

weixin_50546241的博客 1万+

Logisim 原码一位乘法器设计 图解及代码(计算机组成原理)

Logisim 原码一位乘法器设计 图解及代码(计算机组成原理) 包对

醉蕤的博客 4379

STM32通用定时器详解(Ⅰ)--基于HAL库和STM32CubeMX

本文详细介绍了STM32通用定时器的核心功能和工作原理。主要内容包括:1.通用定时器的三大计数模式(向上、向下、中心对齐)及其工作原理;2.输入捕获功能的实现机制,包括信号处理流程(滤波、边沿检测、触发控制)和四种输入模式(外部时钟模式1/2、内部触发);3.输出比较、DMA请求等扩展功能;4.基于STM32CubeMX的配置方法,包括从模式设置、触发源选择等关键参数。文章通过框图解析了信号处理路径,并比较了不同外部时钟模式的特点,为定时器应用开发提供了技术参考。

2501_94322729的博客 1141

2024年全国青少年信息素养大赛复赛真题(算法创意实践挑战赛C++试卷:带解析)

2024年全国青少年信息素养大赛复赛真题(算法创意实践挑战赛C++试卷:带解析)

王老师青少年编程 4786

DeerFlow 系列教程 第十一篇 | Sandbox 沙箱与 Memory 记忆——安全执行与持久认知

用户请求│▼Lead Agent├── 系统提示词组装│ ├── <memory> 段 ← Memory 系统注入用户记忆│ ├── <skill_system> 段│ └── <subagent_system> 段│├── 工具调用│ ├── read_file ├── Sandbox 系统提供隔离执行│ ├── write_file├── 路径虚拟化 + 安全验证│└── 对话结束│▼│├── 过滤消息(去除工具调用中间步骤)├── 检测纠正/强化信号。

weixin_43674738的博客 161

【STM32】 通用定时器 TIM 详解:从概念到 PWM 速通

本文详解STM32通用定时器TIM2~5的核心功能,对比基础定时器,突出其支持向上/向下/中央对齐计数、4个独立通道、多种时钟源及输入输出能力。重点解析输出比较机制,阐述PWM频率(由ARR/PSC决定)与占空比(由CCR决定)的计算关系,并通过“7步配置法”实现精准波形输出。强调“软件可调占空比”特性:仅需修改CCR,无需停机,硬件自动生效。深入剖析“时基、比较、DMA、中断”四模块协同机制,结合呼吸灯、舵机等实战场景,揭示如何高效利用定时器实现高精度、低延迟控制,是掌握STM32 PWM应用的关键指南。

专注后端与底层技术,分享实战干货与学习笔记,梦想进入字节跳动,步履不停,热爱不止。 584

生信技能53 - WisecondorX自动化批量npz转换和reference构建

wiseconrdoX分析CNV适用于CNVseq、NIPT和WGS等项目。

LittleComputerRobot的博客 465

STM32通用定时器原理与中断配置详解

定时器是嵌入式系统中实现精确延时、周期调度和事件触发的核心外设。其本质是一个可编程计数器,通过预分频器(PSC)和自动重装载寄存器(ARR)协同控制计数频率与周期,结合向上/向下/中央对齐等计数模式,满足不同实时性需求。在STM32中,通用定时器(如TIM2–TIM5)挂载于APB1总线,受APB1预分频影响,实际时钟频率常为PCLK1的2倍,这一关键特性直接决定中断精度。技术价值在于提供高可靠、低开销的时间基准,广泛应用于LED控制、ADC采样触发、RTOS滴答源及软件定时器心跳等场景。本文以TIM2为例

flink9streamer的博客 996

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

STM32中TIM定时器定时功能详解(适用基本,通用,高级定时器)

STM32中有三种定时器:高级定时器、通用定时器和基本定时器,它们的定时功能参数主要有计数器位数、计数模式、通道数量和功能、互补输出和死区功能等方面的区别。定时器的定时功能需要设置定时器时钟、预分频器、计数器、自动重载寄存器等参数,以及中断使能和中断服务函数,以实现指定的定时周期和定时任务。定时器的时钟源可以选择内部时钟或外部时钟,也可以通过其他定时器或捕获通道等方式提供时钟信号,以适应不同的应用场景。

qq_63091423的博客 2157

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

stm32定时2通道3映射_STM32通用定时器使用详解

1.通用定时器基本介绍通用定时器包括TIM2、TIM3、TIM4和TIM5STM32通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成。每个定时器都是完全独立的,没有互相共享任何资源。它们可以一起同步操作。定时器可以进行定时器基本定时,输出4路PWM,输入捕获本文详细介绍这三个功能并且利用定时器3并且示例代码使用2.开发环境开发平台:keil5单片机:STM32F103ZET63.基...

weixin_31321157的博客 2571

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

STM32---通用定时器框图详解

通用定时器可以划分为三个板块,蓝色部分时钟源,红色部分时基单元,橙色部分输入捕获和输出比较。下面是三个板块详解:时钟源详解:第一种,1 代表内部时钟源通道。第二种,2 代表外部时钟源通道TIMx_ERT,其内部又可以细分为上面通往ETRF的路,我们管它叫外部时钟源2,和下面通往TRGI的路我们管它叫做外部时钟源1。第三种,3 代表其他定时器时钟源通道。第四种,4 5代表输入捕获的时钟信号源,4通道可以来源于第一个输入捕获通道,5通道右边绿色部分他来源于第一个或者第二个输入捕获通道。

qq_58356691的博客 1497

STM32通用定时器PWM原理与HAL库配置详解

PWM(脉宽调制)是一种通过调节数字信号占空比来等效模拟输出的基础控制技术,广泛应用于LED调光、电机调速和电源管理等领域。其核心原理依赖于定时器的计数机制与比较匹配逻辑:以预分频器(PSC)和自动重装载值(ARR)共同设定波形周期,以捕获/比较寄存器(CCRx)动态控制高电平持续时间,从而实现占空比精确调节。该技术具备硬件自主运行、CPU零开销、响应实时性强等显著优势,特别适合资源受限的嵌入式系统。在STM32平台中,通用定时器(如TIM14)是实现PWM的关键外设,结合HAL库可快速完成时钟使能、GPI

weixin_30021053的博客 278
上一篇: NVIC 中断优先级管理详解
下一篇: Python 图片转数组,二进制互转
布鲁格若门
博客等级 码龄9年 431粉丝 43原创
评论 21
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

布鲁格若门

对你有用的话真是太好了

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值