STM32 单脉冲,步进电机精准脉冲输出记录,执行一条语句输出指定脉冲,结束并触发中断
设置成单脉冲后,中断更新后自动关闭定时器
代码
TIM_SelectOnePulseMode(TIM1, TIM_OPMode_Single); //定时器单脉冲模式
#define TIM_OPMode_Single ((uint16_t)0x0008)
重复写入更新定时器的数据,硬件仿真查看CEN位反复打勾去除
void Pulse_Control(u16 arr,u32 num)
{
// TIMx_PWM_Init(arr,71,10-1); //发送PWM脉冲个数--10
//TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_SetAutoreload(TIM1, arr);
TIM1->RCR=num-1;
TIM_SetCompare1(TIM1,arr/2); //设置占空比
// TIM1->EGR = TIM_PSCReloadMode_Immediate;
// TIM_TimeBaseStructure.TIM_Period = arr; //周期
// TIM_TimeBaseStructure.TIM_Prescaler =72-1;
// TIM_TimeBaseStructure.TIM_ClockDivision = 0;
// TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
// TIM_TimeBaseStructure.TIM_RepetitionCounter=2-1; //重复计数值
// TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
// TIM_SetAutoreload(TIM1, arr);
TIM_Cmd(TIM1,ENABLE);
TIM1->CNT=0; //计数清零
}
数据更新
TIM_GenerateEvent(TIM1, TIM_EventSource_Update); //软件方式产生更新事件
TIM1->EGR = TIM_PSCReloadMode_Immediate; //寄存器版本
STM32定时器初始化的时候默认会调用这个函数,触发一次更新事件
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct)
{
uint16_t tmpcr1 = 0;
/* Check the parameters */
assert_param(IS_TIM_ALL_PERIPH(TIMx));
assert_param(IS_TIM_COUNTER_MODE(TIM_TimeBaseInitStruct->TIM_CounterMode));
assert_param(IS_TIM_CKD_DIV(TIM_TimeBaseInitStruct->TIM_ClockDivision));
tmpcr1 = TIMx->CR1;
if((TIMx == TIM1) || (TIMx == TIM8)|| (TIMx == TIM2) || (TIMx == TIM3)||
(TIMx == TIM4) || (TIMx == TIM5))
{
/* Select the Counter Mode */
tmpcr1 &= (uint16_t)(~((uint16_t)(TIM_CR1_DIR | TIM_CR1_CMS)));
tmpcr1 |= (uint32_t)TIM_TimeBaseInitStruct->TIM_CounterMode;
}
if((TIMx != TIM6) && (TIMx != TIM7))
{
/* Set the clock division */
tmpcr1 &= (uint16_t)(~((uint16_t)TIM_CR1_CKD));
tmpcr1 |= (uint32_t)TIM_TimeBaseInitStruct->TIM_ClockDivision;
}
TIMx->CR1 = tmpcr1;
/* Set the Autoreload value */
TIMx->ARR = TIM_TimeBaseInitStruct->TIM_Period ;
/* Set the Prescaler value */
TIMx->PSC = TIM_TimeBaseInitStruct->TIM_Prescaler;
if ((TIMx == TIM1) || (TIMx == TIM8)|| (TIMx == TIM15)|| (TIMx == TIM16) || (TIMx == TIM17))
{
/* Set the Repetition Counter value */
TIMx->RCR = TIM_TimeBaseInitStruct->TIM_RepetitionCounter;
}
测试
执行完一次后才更新的
立即更新并执行输出的