STM32单脉冲模式,定时器3 CH2触发CH1输出,寄存器式配置。

单脉冲,
终于弄出来了!!!!!!来来回回放弃了三次
和我之前想的一样,他就是个让定时器只能出来一次脉冲

单脉冲模式就是配置定时器,在各种正常的定时器输出模式下,通过不让CNT重装(CNT是猜的),就是让定时器装满之后不更新寄存器,这样下一个脉冲就出不来

注意配置输出时要注意各种重装,只是输出的重装就可以,

// TIM3->CCMR1|=1<<2; //OC1FE:输出比较1 快速使能
// TIM3->CCMR1|=1<<3; //OC1PE:输出比较1预装载使能 1:开启TIMx_CCR1寄存器的预装载功能,读写操作仅对预装载寄存器操作,TIMx_CCR1的预装载值在更新事件到来时被传送至当前寄存器中。
上面这俩货在我的PWM输出中,一直没注意到,有他们在,只有输出,不用触发信号时时很正常的波形,完全按照周期arr,翻转CCRx,加上之后出来的波形和输出比较一样,有效翻转波形的时间等于arr

下面是整个的调试过程。
1、首先调出个正常的PWM输出,
2、配置输入和定时器触发模式。
3、TIM3->CR1|=1<<3;//TIMx_CR1寄存器中的OPM=’1’,在下一个更新事件(当计数器从自动装载值翻转到0)时停止计数。
结束,只需调用配置函数就可以了,不需要中断或者主函数做什么操作。

留下个程序 以免以后找不到了
后面我再根据手册说一下,正统点

#define Psc      (u16)71
#define t_DELAY   (u16)550
#define t_PULSE   (u16)350
//● t DELAY 由写入TIMx_CCR1寄存器中的值定义。
//● t PULSE 由自动装载值和比较值之间的差值定义(TIMx_ARR - TIMx_CCR1)
 
 主函数调用这个函数 
TIM3_OnePulse(Psc,t_DELAY,t_PULSE);//71 1Mhz 1us  7199  10K  100us   35999 2K 20us

/*
先做一个CH1捕获,CH2PWM的模式
*/
void TIM3_OnePulse(u16 Psc,u16 t_DELAY,u16 t_PULSE)
{
	//CH2输入捕获 
	/*开时钟*/
	RCC->APB1ENR|=1<<1; 	//TIM3时钟使能 	
  /*CH1 CH2IO口设置,不重映射   CH1-PA6   CH2-PA7*/
	RCC->APB2ENR|=1<<2;    	//使能PORTA时钟	
	GPIOA->CRL&=0X00FFFFFF;	//PA6输出  PA7输入
	GPIOA->CRL|=0X8B000000;	// 
	
  TIM3->ARR=t_PULSE+t_DELAY;			//设定计数器自动重装值  周期
	TIM3->PSC=Psc;			//预分频器
	
//在从TI2输入脚上检测到一个上升沿开始,延迟t DELAY 之后,在OC1上产生一个长
//度为t PULSE 的正脉冲。
//假定TI2FP2作为触发1:
TIM3->CCMR1|=1<<8;//● 置TIMx_CCMR1寄存器中的CC2S=’01’,把TI2FP2映像到TI2。
TIM3->CCER&=~(1<<5);//● 置TIMx_CCER寄存器中的CC2P=’0’,使TI2FP2能够检测上升沿。
TIM3->SMCR|=6<<4;//● 置TIMx_SMCR寄存器中的TS=’110’,TI2FP2作为从模式控制器的触发(TRGI)。
TIM3->SMCR|=6<<0;//● 置TIMx_SMCR寄存器中的SMS=’110’(触发模式),TI2FP2被用来启动计数器。

//● t DELAY 由写入TIMx_CCR1寄存器中的值定义。
//● t PULSE 由自动装载值和比较值之间的差值定义(TIMx_ARR - TIMx_CCR1)。 
	TIM3->CR1|=0<<5;   //计数器边沿对齐  CMS[1:0]:00:边沿对齐模式。计数器依据方向位(DIR)向上或向下计数
	TIM3->CR1|=0<<4;   //DIR:方向   0:计数器向上计数;1:计数器向下计数.
	
//  TIM3->CCMR1|=1<<2;   //OC1FE:输出比较1 快速使能
//	TIM3->CCMR1|=1<<3;   //OC1PE:输出比较1预装载使能  1:开启TIMx_CCR1寄存器的预装载功能,读写操作仅对预装载寄存器操作,TIMx_CCR1的预装载值在更新事件到来时被传送至当前寄存器中。
	TIM3->CCMR1|=6<<4;   //OC1M[2:0]:输出比较1模式  
	                          //在向上计数时,一旦TIMx_CNTTIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。
	TIM3->CCMR1|=0<<7;   //OC1CE:输出比较1清0使能 0:OC1REF 不受ETRF输入的影响;1:一旦检测到ETRF输入高电平,清除OC1REF=0。
  TIM3->CCMR1|=0<<0;   //CC1S[1:0]:捕获/比较1 选择,00:CC1通道配置为输出
/*CH1 CCER控制输出使能和极性*/	
	TIM3->CCER|=1<<0;   	//OC1 输出使能	
  TIM3->CCER|=1<<1;    //CC1P:输入/捕获1输出极性 0:OC1高电平有效
	
//   TIM3->CR1|=1<<7;   	//ARPE使能        自动重装载

  TIM3->CCR1=t_DELAY;
  TIM3->CR1|=1<<3;//TIMx_CR1寄存器中的OPM=’1’,在下一个更新事件(当计数器从自动装载值翻转到0)时停止计数。
  TIM3->CR1|=0x01;    	//使能定时器3 

}

手册这东西,你不懂的时候怎么看也看不懂,这都是啥啥啥,图也看不懂,字也看不懂,就觉得对对对,说的很有道理,但就是不懂。
STM32单脉冲模式,定时器3 CH2触发CH1输出,寄存器式配置。_第1张图片

这个是手册上的时序图,很形象的,X轴是时间,那个小阶梯就是计数器CNT,从0开始注意他不是立刻就开始加的,看一下TI2那个触发,表示的是TI2有一个上升沿触发之后,定时器开始计数,也就是老生常谈的定时器触发模式,

//● 置TIMx_SMCR寄存器中的SMS=’110’(触发模式),TI2FP2被用来启动计数器。

然后计数器CNT开始加数,加加加,加到CNT=CCR1,触发了输出的工作,输出电平开始反转,直到CNT=ARR,电平变回去,这样,关于单脉冲延时一段时间后发一个持续多久的脉冲,就出来了。
这个脉冲从触发到出现,T_Delay=CCR1,脉冲宽度T_PULSE=arr-CCR1。单脉冲完成。

关于出现的这个脉冲的高低问题,涉及到:
1、PWM模式 PWM1和2的输出极性是反的;
2、TIM3->CCER|=1<<1; //CC1P:输入/捕获1输出极性 0:OC1高电平有效
3、 TIM3->CR1|=0<<4; //DIR:方向 0:计数器向上计数;1:计数器向下计数.
这三个PWM模式、输出极性、计数方向,看着办就是了。

你可能感兴趣的:(工作杂谈)