单脉冲,
终于弄出来了!!!!!!来来回回放弃了三次
和我之前想的一样,他就是个让定时器只能出来一次脉冲
单脉冲模式就是配置定时器,在各种正常的定时器输出模式下,通过不让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_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平;
//在向下计数时,一旦TIMx_CNT>TIMx_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
}
手册这东西,你不懂的时候怎么看也看不懂,这都是啥啥啥,图也看不懂,字也看不懂,就觉得对对对,说的很有道理,但就是不懂。
这个是手册上的时序图,很形象的,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模式、输出极性、计数方向,看着办就是了。