【STM32 单脉冲,步进电机精准脉冲输出记录,执行一条语句输出指定脉冲,结束并触发中断】

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;
  }

测试

执行完一次后才更新的

在这里插入图片描述

立即更新并执行输出的

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值