STM32F1----TIM_GENERAL

2023-10-27

1.通用定时器PWM模式初始化流程
<1>建立GPIO、时基、输出比较结构体

 GPIO_InitTypeDef GPIO_InitStructure;                   
 TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
 TIM_OCInitTypeDef  TIM_OCInitStructure;

<2>使能定时器以及相关IO口时钟

 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);   //使能定时器3时钟
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟

<3>配置GPIO、时基、输出比较结构体并初始化

//初始化TIM3
    TIM_TimeBaseStructure.TIM_Period = arr;                 //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
    TIM_TimeBaseStructure.TIM_Prescaler =psc;               //设置用来作为TIMx时钟频率除数的预分频值 
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;            //设置时钟分割:TDTS = Tck_tim
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);         //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

    //初始化TIM3 Channel 1 PWM模式  
    TIM_OCInitStructure.TIM_OCMode      = TIM_OCMode_PWM2;       //选择定时器模式:TIM脉冲宽度调制模式2
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;     //输出极性:TIM输出比较极性高   TIM_OCPolarity_Low
    TIM_OCInitStructure.TIM_Pulse      = 1;
    TIM_OC1Init(TIM3, &TIM_OCInitStructure);                      //定时器通道一的初始化

<4>使能预装载寄存器

TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);             //使能预装载寄存器,这一步在大部分操作中可以省略。

<5>使能定时器

TIM_Cmd(TIM3, ENABLE);  

2.通用定时器结构体

  • 时基初始化结构体 >> TIM_TimeBaseInitTypeDef
typedef struct
{
  uint16_t TIM_Prescaler; /*定时器预分频设置。 value:(0~0xFFFF)*/
 
  uint16_t TIM_CounterMode;/*选择了计数器模式。Value:
#define TIM_CounterMode_Up                 ((uint16_t)0x0000) //TIM 向上计数模式
#define TIM_CounterMode_Down               ((uint16_t)0x0010) //TIM 向下计数模式
#define TIM_CounterMode_CenterAligned1     ((uint16_t)0x0020) //TIM 中央对齐模式 1 计数模式
#define TIM_CounterMode_CenterAligned2     ((uint16_t)0x0040) //TIM 中央对齐模式 2 计数模式
 
  uint16_t TIM_Period; /*设置了在下一个更新事件装入活动的自动重装载寄存器周期的值。value:0x0000~0xFFFF*/         
 
  uint16_t TIM_ClockDivision; /*设置定时器时钟CK_INT频率与死区发生器以及数字滤波器采样时钟频率分频化。Value:
#define TIM_CKD_DIV1                       ((uint16_t)0x0000)
#define TIM_CKD_DIV2                       ((uint16_t)0x0100)
#define TIM_CKD_DIV4                       ((uint16_t)0x0200)*/   
 
  uint8_t TIM_RepetitionCounter; /*是否使用重复定时器,当该值不为0的时候,计数器计数值达到周期数时,该值减1,计数器重新计数,当该值减到0的时候才会产生事件。*/
} TIM_TimeBaseInitTypeDef;  

备注:
若是主频72MHz、TIM_Prescaler的值设置为(72-1),则定时器时钟频率=72MHz/72=1MHz。知道频率就可以算周期了,用1/1MHz乘以TIM_Period的值就是定时的时间(周期),如果加入了重复定时器,那么还要乘以TIM_RepetitionCounter的值才是定时的时间(周期)。

  • 定时器比较输出初始化结构体 >> TIM_OCInitTypeDef
typedef struct
{
  uint16_t TIM_OCMode;/*比较输出模式选择,共8种。value:
	#define TIM_OCMode_Timing                  ((uint16_t)0x0000) // TIM 输出比较时间模式
	#define TIM_OCMode_Active                  ((uint16_t)0x0010) //TIM 输出比较主动模式
	#define TIM_OCMode_Inactive                ((uint16_t)0x0020) //TIM 输出比较非主动模式
	#define TIM_OCMode_Toggle                  ((uint16_t)0x0030) //TIM 输出比较触发模式
	#define TIM_OCMode_PWM1                    ((uint16_t)0x0060) //TIM 脉冲宽度调制模式 1 
	#define TIM_OCMode_PWM2                    ((uint16_t)0x0070) //TIM 脉冲宽度调制模式 2*/      
 
  uint16_t TIM_OutputState;/*比较输出使能,决定信号是否通过外部引脚输出。value:0(Disable)、1(Enable)。 */         
 
  uint16_t TIM_OutputNState; /*比较互补输出使能,决定互补信号是否通过外部引脚输出。value:0(Disable)、1(Enable)。*/
 
  uint16_t TIM_Pulse; /*比较输出的脉冲宽度,设置占空比。Value:0x0000~0xFFFF*/       
 
  uint16_t TIM_OCPolarity; /*比较输出极性,决定定时器通道有效电平的极性。Value:
	#define TIM_OCPolarity_High                ((uint16_t)0x0000)
	#define TIM_OCPolarity_Low                 ((uint16_t)0x0002)*/
 
  uint16_t TIM_OCNPolarity; /*比较互补输出极性,可选高电平有效、低电平有效。Value:
	#define TIM_OCNPolarity_High               ((uint16_t)0x0000)
	#define TIM_OCNPolarity_Low                ((uint16_t)0x0008)*/
 
  uint16_t TIM_OCIdleState;  /*空闲状态时通道输出电平设置,可选高电平、低电平。Value:
	#define TIM_OCNPolarity_High               ((uint16_t)0x0000)
	#define TIM_OCNPolarity_Low                ((uint16_t)0x0008)*/
 
  uint16_t TIM_OCNIdleState; /*空闲状态时互补通道输出电平设置,可选高电平、低电平,设定值必须跟TIM_OCIdleState相反。Value:
	#define TIM_OCNIdleState_Set               ((uint16_t)0x0200)
	#define TIM_OCNIdleState_Reset             ((uint16_t)0x0000)*/
 
} TIM_OCInitTypeDef;

备注:设置TIM_Pulse的值就可以改变输出波形的占空比了,如果不使用重复定时器,那么占空比=(TIM_Pulse+1)/(TIM_Period+1)x100%。

  • 定时器输入捕获初始化结构体 >> TIM_ICInitTypeDef
typedef struct
{
  uint16_t TIM_Channel; /*输入通道选择,共4个通道。Value:
#define TIM_Channel_1                      ((uint16_t)0x0000) //使用 TIM 通道 1 
#define TIM_Channel_2                      ((uint16_t)0x0004) //使用 TIM 通道 2 
#define TIM_Channel_3                      ((uint16_t)0x0008) //使用 TIM 通道 3
#define TIM_Channel_4                      ((uint16_t)0x000C) //使用 TIM 通道 4*/     
 
  uint16_t TIM_ICPolarity; /*输入捕获边沿触发选择,可选上升沿触发、下降沿触发。Value:
#define  TIM_ICPolarity_Rising             ((uint16_t)0x0000) //TIM 输入捕获上升沿
#define  TIM_ICPolarity_Falling            ((uint16_t)0x0002) //TIM 输入捕获下降沿*/
 
  uint16_t TIM_ICSelection; /*输入通道选择,共3个通道。Value:
#define TIM_ICSelection_DirectTI           ((uint16_t)0x0001)  //TIM 输入 2,3 或 4 选择对应地与 IC1 或 IC2 或IC3 或 IC4 相连       
#define TIM_ICSelection_IndirectTI         ((uint16_t)0x0002)  //TIM 输入 2,3 或 4 选择对应地与 IC2 或 IC1 或IC4 或 IC3 相连
#define TIM_ICSelection_TRC                ((uint16_t)0x0003)  //TIM 输入 2,3 或 4 选择与 TRC 相连*/
 
  uint16_t TIM_ICPrescaler; /*输入捕获通道预分频,共(1、2、4、8)种。Value:
#define TIM_ICPSC_DIV1                     ((uint16_t)0x0000) //TIM 捕获在捕获输入上每探测到一个边沿执行一次
#define TIM_ICPSC_DIV2                     ((uint16_t)0x0004) // TIM 捕获每 2 个事件执行一次
#define TIM_ICPSC_DIV4                     ((uint16_t)0x0008) //TIM 捕获每 4 个事件执行一次
#define TIM_ICPSC_DIV8                     ((uint16_t)0x000C) //TIM 捕获每 8 个事件执行一次*/
 
  uint16_t TIM_ICFilter;   /*输入捕获滤波器设置,value:0x0~0x0F。一般不用,设置为0*/
} TIM_ICInitTypeDef;

备注:定时器捕获信号,可以测量输入信号的脉宽和测量PWM输入信号的频率和占空比;信号的来源可以来自其他的定时器或者外部引脚;滤波器的作用是排除高频的干扰,采样的频率必须大于等于两倍的输入信号。

3.通用定时器PWM输出例程

#include "tim1.h"

void TIM3_PWM_Init(u16 arr,u16 psc)
{  
     GPIO_InitTypeDef GPIO_InitStructure;                   
     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
     TIM_OCInitTypeDef  TIM_OCInitStructure;

     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);   //使能定时器3时钟
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟
    
     //GPIO口初始化     
     GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;          //IO复用推挽输出
     GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
     GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
     GPIO_Init(GPIOA, &GPIO_InitStructure);           
     GPIO_ResetBits(GPIOA,GPIO_Pin_6);                      //输出低     

    //初始化TIM3
    TIM_TimeBaseStructure.TIM_Period = arr;                 //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
    TIM_TimeBaseStructure.TIM_Prescaler =psc;               //设置用来作为TIMx时钟频率除数的预分频值 
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;            //设置时钟分割:TDTS = Tck_tim
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);         //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

    //初始化TIM3 Channel 1 PWM模式  
    TIM_OCInitStructure.TIM_OCMode      = TIM_OCMode_PWM2;       //选择定时器模式:TIM脉冲宽度调制模式2
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
    TIM_OCInitStructure.TIM_OCPolarity  = TIM_OCPolarity_High;     //输出极性:TIM输出比较极性高   TIM_OCPolarity_Low
    TIM_OCInitStructure.TIM_Pulse       = 1000;					  //比较值
    TIM_OC1Init(TIM3, &TIM_OCInitStructure);                      //定时器通道一的初始化
            
    TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);//使能输出比较预装载
    TIM_ARRPreloadConfig(TIM2, ENABLE);//使能自动重装载的预装载寄存器允许位
    
    TIM_Cmd(TIM3, ENABLE);                                        //使能TIM3
    
}

通用定时器配置为PWM输出模式时,只需要配置TIM_OCInitStructure.TIM_OCMode、TIM_OCInitStructure.TIM_OutputState、TIM_OCInitStructure.TIM_OCPolarity、TIM_OCInitStructure.TIM_Pulse这4个成员变量。其他的都不用配置。

4.TIM2定时器4路PWM输出例程

uint16_t TIM2_CCR1_Val;
uint16_t TIM2_CCR2_Val;
uint16_t TIM2_CCR3_Val;
uint16_t TIM2_CCR4_Val;
 
void pwm_init(void)
{
    GPIO_InitTypeDef 			GPIO_InitStructure; 
    TIM_TimeBaseInitTypeDef 	TIM_TimeBaseInitStructure;
    TIM_OCInitTypeDef 			TIM_OCInitStructure;
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
 
    TIM_TimeBaseInitStructure.TIM_Period = 1999;//10KHz
    TIM_TimeBaseInitStructure.TIM_Prescaler = 359;
    TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM2, & TIM_TimeBaseInitStructure);
    
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;    
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; 
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
        
    TIM_OCInitStructure.TIM_Pulse = TIM2_CCR1_Val;	 //设置比较值  
    TIM_OC1Init(TIM2, &TIM_OCInitStructure);		 //通道1输出使能
    TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);//使能预装载器
    
    TIM_OCInitStructure.TIM_Pulse = TIM2_CCR2_Val;		
    TIM_OC2Init(TIM2, &TIM_OCInitStructure);
    TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);
 
    TIM_OCInitStructure.TIM_Pulse = TIM2_CCR3_Val;	
    TIM_OC3Init(TIM2, &TIM_OCInitStructure);
    TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);
    
    TIM_OCInitStructure.TIM_Pulse = TIM2_CCR4_Val;	
    TIM_OC4Init(TIM2, &TIM_OCInitStructure);
   
	TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);//使能输出比较预装载
    TIM_ARRPreloadConfig(TIM2, ENABLE);//使能自动重装载的预装载寄存器允许位

    TIM_Cmd(TIM2, ENABLE);
}

/*调用此函数完成四路占空比实时变化的PWM波*/
void set(uint16_t TIM2_CCR1_Val,uint16_t TIM2_CCR2_Val,uint16_t TIM2_CCR3_Val,uint16_t TIM2_CCR4_Val)
{
	TIM_SetCompare2(TIM3,TIM2_CCR1_Val);
	TIM_SetCompare2(TIM3,TIM2_CCR2_Val);
	TIM_SetCompare2(TIM3,TIM2_CCR3_Val);
	TIM_SetCompare2(TIM3,TIM2_CCR4_Val);	
}

5.通用定时器输入捕获


 
void TIM5_Cap_Init(u16 arr,u16 psc)
{	 
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
   	NVIC_InitTypeDef NVIC_InitStructure; 
 	TIM_ICInitTypeDef  TIM5_ICInitStructure;   	//定时器5通道1输入捕获配置
 
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);	//使能TIM5时钟
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能GPIOA时钟
	
	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;  //PA0 清除之前设置  
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0 输入  
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	GPIO_ResetBits(GPIOA,GPIO_Pin_0);						 //PA0 下拉
	
	//初始化定时器5 TIM5	 
	TIM_TimeBaseStructure.TIM_Period = arr; //设定计数器自动重装值 
	TIM_TimeBaseStructure.TIM_Prescaler =psc; 	//预分频器   
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  
	//初始化TIM5输入捕获参数
	TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=01 	选择输入端 IC1映射到TI1上
  	TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;	//上升沿捕获
  	TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上
  	TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;	 //配置输入分频,不分频 
  	TIM5_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
  	TIM_ICInit(TIM5, &TIM5_ICInitStructure);
	
	//中断分组初始化
	NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;  //TIM3中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  //先占优先级2级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //从优先级0级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
	NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 
	
	TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允许更新中断 ,允许CC1IE捕获中断	
	
   	TIM_Cmd(TIM5,ENABLE ); 	//使能定时器5
 
}
 
u8  TIM5CH1_CAPTURE_STA=0;	//输入捕获状态		    				
u16	TIM5CH1_CAPTURE_VAL;	//输入捕获值
 
//定时器5中断服务程序	 
void TIM5_IRQHandler(void)
{ 
 
 	if((TIM5CH1_CAPTURE_STA&0X80)==0)//还未成功捕获	
	{	  
		if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)
		 
		{	    
			if(TIM5CH1_CAPTURE_STA&0X40)//已经捕获到高电平了
			{
				if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
				{
					TIM5CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次
					TIM5CH1_CAPTURE_VAL=0XFFFF;
				}else TIM5CH1_CAPTURE_STA++;
			}	 
		}
	if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)//捕获1发生捕获事件
		{	
			if(TIM5CH1_CAPTURE_STA&0X40)		//捕获到一个下降沿 		
			{	  			
				TIM5CH1_CAPTURE_STA|=0X80;		//标记成功捕获到一次高电平脉宽
				TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5);
		   		TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获
			}else  								//还未开始,第一次捕获上升沿
			{
				TIM5CH1_CAPTURE_STA=0;			//清空
				TIM5CH1_CAPTURE_VAL=0;
	 			TIM_SetCounter(TIM5,0);
				TIM5CH1_CAPTURE_STA|=0X40;		//标记捕获到了上升沿
		   		TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);		//CC1P=1 设置为下降沿捕获
			}		    
		}			     	    					   
 	}
 
    TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位
 
}

输入捕获的一般步骤

  • 1.初始化定时器和通道对应IO的时钟; 初始化IO口,模式为输入。
  • 2.调用函数:GPIO_Init();
  • 3.初始化定时器ARR,PSC。调用函数:TIM_TimeBaseInit();
  • 4.初始化输入捕获通道。调用函数:TIM_ICInit();
  • 5.如果要开启捕获中断。调用函数:TIM_ITConfig();NVIC_Init();
  • 6.使能定时器。调用函数:TIM_Cmd();
  • 7.编写中断服务函数。调用函数:TIMx_IRQHandler()。

6.通用定时器库函数

  • 初始化相关
void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
  • 参数设置相关函数
void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);
void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2);
void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3);
void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4);
  • 中断相关函数
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);
/*
@arg TIM_IT_Update: TIM update Interrupt source
  *     @arg TIM_IT_CC1: TIM Capture Compare 1 Interrupt source
  *     @arg TIM_IT_CC2: TIM Capture Compare 2 Interrupt source
  *     @arg TIM_IT_CC3: TIM Capture Compare 3 Interrupt source
  *     @arg TIM_IT_CC4: TIM Capture Compare 4 Interrupt source
  *     @arg TIM_IT_COM: TIM Commutation Interrupt source
  *     @arg TIM_IT_Trigger: TIM Trigger Interrupt source
  *     @arg TIM_IT_Break: TIM Break Interrupt source
*/

7.通用定时器补充

  • 1.通用定时器基本介绍

    • 通用定时器包括TIM2、TIM3、TIM4和TIM5
    • STM32通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成。
    • 每个定时器都是完全独立的,没有互相共享任何资源。它们可以一起同步操作。
    • 定时器可以进行定时器基本定时,输出4路PWM,脉冲输入捕获
  • 2.输入捕获 (捕获边沿信号,上升沿和下降沿)

    • 首先我们需要以一定的频率检测电平的跳变,然后对部分跳变(也就是部分输入的波形)进行过滤------ 这就是定时器里面的滤波器的任务
    • 指定输入滤波器时钟频率,首先是系统时钟分给定时器72Mhz,我们首先初始化定时器的时候指定了TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; 没有分频,输入给滤波器的时钟频率还是72MHz,TIM_ClockDivision也可以指定为2分频或者4分频
    • 波形过滤(TIM_ICFilter),这里有一个指定过滤器的参数(参考芯片手册),例如我们设置参数为0101(二进制),采样频率(fsampling)为 滤波器频率/2 = 36Mhz,N=8.当检测到一个上升沿的时候,再以fsampling频率连续8次检测到高电平才确认是一个有效的上升沿,这样可以滤除那些高电平脉宽低于8个采样周期的脉冲信号,从而达到滤高频波的效果。
    • 配置输入分频(TIM_ICPrescaler),如果我们设置不分频,一个边沿(上升沿或者下降沿)就触发一次捕获,二分频就是两次边沿触发捕获,这里这个分频可以为1,2,4,8。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32F1----TIM_GENERAL 的相关文章

  • 使用 ARM NEON 内在函数添加 alpha 和排列

    我正在开发一个 iOS 应用程序 需要相当快地将图像从 RGB gt BGRA 转换 如果可能的话 我想使用 NEON 内在函数 有没有比简单分配组件更快的方法 void neonPermuteRGBtoBGRA unsigned char
  • 用于 RHEL 的 gdb-multiarch

    我正在尝试寻找方法来运行gdb 多架构RHEL 中的命令 我已经安装了用于 ARM 处理的 QEMU 模拟器 我想安装GDB进行调试 我能够安装GDB 多体系结构在 Ubuntu 中运行命令成功 sudo apt get GDB multi
  • 尝试使用 qemu-arm 运行arm二进制文件时如何解决“加载共享库时出错”?

    我正在运行 Linux Mint 14 并安装了 qemu qemu user 和 gnueabi 工具链 我编译了 test carm linux gnueabi gcc test c o test 当我尝试跑步时qemu arm usr
  • arm-thumb指令集的blx指令如何支持4MB范围

    读自https www keil com support man docs armasm armasm dom1361289866046 htm https www keil com support man docs armasm arma
  • ARM 调用约定是否允许函数不将 LR 存储到堆栈中?

    正如标题所示 我在理解 ARM 架构的调用约定时遇到问题 特别是 我仍然很难知道当你调用子程序时 LR 寄存器会发生什么 我认为 当您进入子程序时 处理 LR 寄存器的最明显 最安全的方法是将其存储到堆栈中 但该行为没有出现在文档中 因此我
  • 如何使用 Neon SIMD 将无符号字符转换为有符号整数

    如何转换变量的数据类型uint8 t to int32 t使用霓虹灯 我找不到执行此操作的任何内在因素 假设您想要将 16 x 8 位整数的向量转换为 4 个 4 x 32 位整数的向量 您可以通过首先解压缩为 16 位 然后再次解压缩为
  • 为什么 i2c_smbus 函数不可用? (I2C——嵌入式Linux)

    有很多参考使用i2c smbus 开发嵌入式 Linux 软件时在 I2C 总线上进行通信的函数 什么时候i2c smbus函数如i2c smbus read word data在软件项目中引用了 ARM8 处理器错误 例如 i2c smb
  • 产生并处理软件中断

    有人可以告诉我如何在Linux下生成软件中断然后用request irq处理它吗 或者也许这是不可能的 您可以使用软中断来代替 您可以通过编辑 include linux interrupt h 来定义您的 sofirq 然后使用函数 ra
  • 是否可以将 SpaCy 安装到 Raspberry Pi 4 Raspbian Buster

    我一整天都在安装 SpaCy sudo pip install U spacy Looking in indexes https pypi org simple https www piwheels org simple Collectin
  • ARM 系统调用的接口是什么?它在 Linux 内核中的何处定义?

    我读过有关 Linux 中的系统调用的内容 并且到处都给出了有关 x86 架构的描述 0x80中断和SYSENTER 但我无法追踪 ARM 架构中系统调用的文件和进程 任何人都可以帮忙吗 我知道的几个相关文件是 arch arm kerne
  • 如何设置 CMake 与 clang 交叉编译 Windows 上的 ARM 嵌入式系统?

    我正在尝试生成 Ninja makefile 以使用 Clang 为 ARM Cortex A5 CPU 交叉编译 C 项目 我为 CMake 创建了一个工具链文件 但似乎存在错误或缺少一些我无法找到的东西 当使用下面的工具链文件调用 CM
  • 为什么 GCC 交叉编译不构建“crti.o”?

    在尝试为arm构建gcc 4 x x交叉编译器时 我陷入了缺失的困境crti o文件在 BUILD DIR gcc子目录 An strace在顶层Makefile表明编译后的xgcc正在调用交联器ld with crti o 作为一个论点
  • ARM Chromebook 上的 Android 开发环境?

    我尝试了多次安装和使用安卓工作室 https developer android com studio index html on an ARM Chromebook C100P https archlinuxarm org platfor
  • 什么是遗留中断?

    我正在开发一个项目 试图弄清楚 ARM 架构的全局中断控制器中如何处理中断 我正在使用 pl390 中断控制器 我看到有一条线被称为传统中断 它绕过了分配器逻辑 假设有 2 个中断可以被编程为传统中断 任何人都可以帮助解释一下什么是遗留中断
  • 架构armv7的重复符号

    尝试在我现有的应用程序中使用 Layar SDK 时出现以下错误 我该如何解决这个问题 Ld Users pnawale Library Developer Xcode DerivedData hub afxxzaqisdfliwbzxbi
  • 为arm构建WebRTC

    我想为我的带有arm926ej s处理器的小机器构建webrtc 安装 depot tools 后 我执行了以下步骤 gclient config http webrtc googlecode com svn trunk gclient s
  • ARM Cortex-M3 启动代码

    我试图了解 STM32 微控制器的 Keil realview v4 附带的初始化代码是如何工作的 具体来说 我试图了解堆栈是如何初始化的 In the 文档 http infocenter arm com help index jsp t
  • 上下文切换到安全模式(arm trustzone)的成本是多少

    我试图了解在arm中可信 安全 和非安全模式之间来回切换的成本 从非安全世界转移到安全世界时到底需要发生什么 我知道需要设置 ns 位 基于某些特殊指令 需要刷新和更新页表 刷新和更新处理器缓存 还有什么需要发生的吗 处理器缓存 它们是分段
  • .ko 文件是如何构建的

    我正在尝试将我自己的驱动程序移植到Beagle 板 xm arm cortex A8 在移植时我试图弄清楚如何 ko文件实际构建 在我们的Makefile我们只有一个命令来构建 o file 怎样是一个 ko文件已建立 使用Linux 2
  • 错误:-march= 开关的值错误

    我写了一个Makefile 但无法让它工作 我有一个选项应该选择编译到哪个处理器 然而 当我跑步时make从命令行它说 tandex tandex P 6860FX emulators nintendo sdks 3DS SDK HomeB

随机推荐

  • 用神经辐射场在大场景中漫游

    目录 前言 介绍 背景 改进 NeRF 以编码大型场景 在训练数据中获得足够的观点 动态对象移除 应用 结论 参考 前言 最近一直在做NeRF相关工作 偶然看到台湾智慧实验室一篇文章 Hovering Around a Large Scen
  • 毕业设计 基于单片机的多功能遥控器设计

    0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新和亮点 往往达不到毕业答辩的要求 这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求 为了大家能够顺利以及最少的精力通过毕设 学长分享优质毕业设计项
  • unity 获取复杂物体(模型)中心点

    Unity 获取复杂物体 模型 中心点 1 获取物体中心点 public Vector3 GetCenter GameObject target Renderer mrs target gameObject GetComponentsInC
  • 阿里云云效:代码提交使用

    最近采用阿里云的云效作为管理工具之一 确实蛮不错自动化部署自动化合并代码 但是还是有一定的不同之处 比如我今天提交代码 编码五分钟提交大半天 找了别人也不清楚什么问题 其实是搞错了人家的代码发布流程 首先提交代码第一步 云效创建分支 云效最
  • CSS实现旋转风车

    CSS实现旋转风车 使用css实现旋转风车主要是运用border和css动画来实现的 效果图如下 一 制作风车 首先观察风车是由8个相等形状大小的三角形旋转组成的 可以发现都是围绕一个中心点旋转组成的 所以我们可以先用border画出一个中
  • 系统管理员设置了系统策略禁止进行此安装怎么解决

    最近一位用户在电脑下载安装软件时 系统出现提示 系统管理员设置了系统策略 禁止进行此安装 这该怎么办呢 既然系统管理员禁止了程序安装 那么我们只要开启相应的安装权限就可以了 下面 小编给大家讲解系统管理员设置了系统策略禁止进行此安装的处理方
  • MYSQL中的CREATE TEMPORARY TABLE

    Posted on 八月 19 2008 by arrowpig1979 记录一下今天的一个BUG FIXING 早上收到一个BUG 说有一个到模块A的调用B 多执行几次以后就会出错 错误信息显示SQL ERROR 因为CDC SBE就我最
  • Parker - 最高效的自动标注工具

    http www getmarkman com http www cutterman cn zh parker
  • vue3时间插件——Moment.js使用

    在日期时间这一块在js中是有体现的 但是用起来不是特别方便 尤其是在vue框架中 我们也不可能去那样使用 显得很笨拙麻烦 所以给大家这次带来一个好用的时间插件 就是Moment时间插件 很小巧 使用也方便 也兼容vue3 下面来详细介绍一下
  • 网络层:IP协议

    本博文分享的是网络层的IP协议 从IP协议的基本概念 协议格式开始分析并分享出来 IP协议的基本概念 不同于讨论TCP UDP时只讨论通信主机之间的关系 在讨论IP协议中 会加上主机之间的网络来一起进行讨论分析 主机 一般配有IP地址 路由
  • 【vision transformer】LETR论文解读及代码实战(一)

    LETR Line Segment Detection Using Transformers without Edges 基于vision transformer DETR 提取wireframe的网络框架 截止日前实现了sota性能 论文
  • C3P0连接池的断开自动重联功能

    问题背景 Java后台日志发现Error updating database Cause com mysql jdbc exceptions jdbc4 CommunicationsException Communications link
  • 跨域问题(CORS / Access-Control-Allow-Origin)

    1 前言 最近在项目中 调用Eureka REST接口时 出现了CORS跨越问题 Cross origin resource sharing 在此与大家进行分享 避免多走些弯路 项目前端 http localhost 9000 通过Ajax
  • python对Json文件的操作

    深层嵌套的Json 使用方式 传递的是json转成str后的json data finder JsonPathFinder json data 寻找所有的cursor字段 path list finder finder find all c
  • React:阻止默认事件

    在html页面中直接通过return false即可阻止默认事件 a href 点击 a 而在react中需要使用e preventDefault function PreventDe return a href console log 阻
  • C++11 -- lambda表达式

    文章目录 lamaba表达式的引入 lambda表达式语法 lamabda达式各部分说明 捕获列表说明 lamaba表达式底层原理探索 lamaba表达式的引入 在C 11之前 如果我们想对自定义类型Goods排序 可以根据姓名 价格 学号
  • git 代码不同版本的对比(IDEA)

    一 和远程文件进行对比 开发过程中我们经常需要在版本的基础上对比和上个版本的代码的区别 那 使用IDEA工具如何对比提交的不同的版本代码呢 打开我们项目的代码 以GIT版本控制为例 找到需要比较的类 右键点击类会弹出如下的选项 选择git
  • 攻防世界ctf-misc-新手联系区-1

    攻防世界ctf misc 新手联系区 1 签到题 比较简单 Most flags are in the form flag xxx for example flag th1s s a d4m0 4la9 flag th1s s a d4m0
  • excel求方差和标准差的函数_Excel标准差_计算函数Stdev和StdevP的使用方法

    Excel标准差 计算函数Stdev和StdevP的使用方法 Excel标准差核算共有六个函数 它们分别用于核算样本标准差和整体标准差 其间一些函数只能核算数值 另一些函数除能核算数值外还能核算文本和逻辑值 另外 假如要求核算满足指定条件的
  • STM32F1----TIM_GENERAL

    1 通用定时器PWM模式初始化流程 lt 1 gt 建立GPIO 时基 输出比较结构体 GPIO InitTypeDef GPIO InitStructure TIM TimeBaseInitTypeDef TIM TimeBaseStru