stm32 定时器3产生指定数量的脉冲

本文介绍如何使用STM32的定时器3配置PWM输出,并实现通过中断进行脉冲计数的方法。重点讲解了定时器初始化设置、PWM频率与占空比配置过程,以及中断服务函数中脉冲计数的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、场景描述:利用PB5产生一定数量的脉冲信号。PB5是定时器3的第2通道。

二、产生PWM代码:

void Timer3_Configuration(void )
{ 
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;

	TIM_DeInit(TIM3);
	 // ƵÂÊ30K
	//Õ¼¿Õ±È50%
 // TIM_TimeBaseStructure.TIM_Period = 100-1; 
	//TIM_TimeBaseStructure.TIM_Prescaler =24-1;
	
	 // ƵÂÊ20K
	//Õ¼¿Õ±È50%
//	TIM_TimeBaseStructure.TIM_Period = 100-1; 
	//TIM_TimeBaseStructure.TIM_Prescaler =36-1;
	
	// ƵÂÊ10K
	//Õ¼¿Õ±È50%
//	TIM_TimeBaseStructure.TIM_Period = 100-1; 
//	TIM_TimeBaseStructure.TIM_Prescaler =72-1;
	
	// ƵÂÊK
	//Õ¼¿Õ±È50%
	TIM_TimeBaseStructure.TIM_Period = 300-1; 
	TIM_TimeBaseStructure.TIM_Prescaler =72-1;

	// ƵÂÊ1K
	//Õ¼¿Õ±È10%
	//TIM_TimeBaseStructure.TIM_Period = 1000-1; 
	//TIM_TimeBaseStructure.TIM_Prescaler =72-1;
	
	TIM_TimeBaseStructure.TIM_ClockDivision = 0;
	//ʱÖÓ·ÖÆµ
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
	//TIMÏòÉϼÆÊý
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
	TIM_ClearFlag(TIM3,TIM_FLAG_Update);         
	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); 
	
	   
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
	//PWM1λÕý³£Õ¼¿Õ±Èģʽ£¬pwm2Ϊ·´¼«ÐÔģʽ
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	//ʹÄÜÊä³ö
	TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
	//»¥²¹Êä³ö¹¦ÄܽûÖ¹

	TIM_OCInitStructure.TIM_Pulse = 30;
	//Õ¼¿Õʱ¼ä

	TIM_OC2Init(TIM3,&TIM_OCInitStructure);        //ͨµÀ2
	TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
	
//	TIM_CtrlPWMOutputs(TIM3,ENABLE);


	TIM_ARRPreloadConfig(TIM3, ENABLE);
	//ʹÄÜTIMxÔÚARRPÉϵÄÔ¤×°ÔØ¼Ä´æÆ÷
	//TIM_Cmd(TIM3, ENABLE);
	
	TIM_Cmd(TIM3, DISABLE);
	//ʹÄÜTIM3
	   
	
}

三、引脚初始化


可以看出来,PB5复用功能是I2C的功能,需要进行重映射。

        GPIO_InitStructure .GPIO_Pin=GPIO_Pin_8 ;
	GPIO_InitStructure .GPIO_Speed =GPIO_Speed_10MHz;			
	GPIO_InitStructure .GPIO_Mode =GPIO_Mode_Out_PP ;//
	GPIO_Init (GPIOB ,&GPIO_InitStructure );
	GPIO_ResetBits(GPIOB,GPIO_Pin_8);
	GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);

四、脉冲计数

void TIM3_IRQHandler(void)
{
	if(TIM_GetITStatus (TIM3 ,TIM_IT_Update )!=RESET )
		{
			MD_Pulse_Cnt++;
		}
		TIM_ClearITPendingBit(TIM3 ,TIM_IT_Update );
}
void main()
{
    if(MD_Pulse_Cnt>500)
    TIM_Cmd(TIM3,DISABLE);
       
}

五、总体思路。

在定时器初始化中打开中断,然后在中断里进行脉冲计数。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值