stm32高级定时器pwm调试时输出,复位后不输出

经过查找后,问题的源头在于定时器配置的顺序有问题,换了配置的顺序就好了。之前先配置了定时器模式,再配置中断复位后不输出。之后先配置了中断,再配置定时器模式,工作正常。

/******************************************************************************                  
* @file     static void TIM3_GPIO_Config(void)
* @brief    定时器3 的引脚初始化
* @parameter    无
* @return          无
* @author            Love My BaoBaoGao                                                               
* @date               2018.12.15                        
******************************************************************************/
static void TIM1_GPIO_Config(void) 
{
  GPIO_InitTypeDef GPIO_InitStructure;

  /* GPIOA and GPIOB clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); 
	/* 设置TIM3CLK 为 72MHZ */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); 

  /* GPIOA and GPIOB clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); 

  /* GPIO复用功能初始化 */
  GPIO_InitStructure.GPIO_Pin =  Attract_Pushrod_Front_Pin;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;		    // 复用推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(Attract_Pushrod_Front_Port, &GPIO_InitStructure);

  /* GPIO复用功能初始化 */
  GPIO_InitStructure.GPIO_Pin =  Attract_Pushrod_Reverse_Pin;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;		    // 复用推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(Attract_Pushrod_Reverse_Port, &GPIO_InitStructure);

  /* GPIO复用功能初始化 */
  GPIO_InitStructure.GPIO_Pin =  Brush_Pushrod_Front_Pin;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;		    // 复用推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(Brush_Pushrod_Front_Port, &GPIO_InitStructure);


  
}
  /******************************************************************************                  
* @file    static void TIM3_NVIC_Config(void)
* @brief    配置嵌套向量中断控制器NVIC
* @parameter    无
* @return          无
* @author            Love My BaoBaoGao                                                               
* @date               2018.12.15                        
******************************************************************************/
static void TIM1_NVIC_Config(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  
  /* Configure one bit for preemption priority */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
  
  /* 配置TIM3_IRQ中断为中断源 */
  NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}
 /******************************************************************************                  
* @file     void DHT21_Init(void)
* @brief    配置TIM3输出的PWM信号的模式,如周期、极性、占空比

 * TIMxCLK/CK_PSC --> TIMxCNT --> TIMx_ARR --> TIMxCNT 重新计数
 *                    TIMx_CCR(电平发生变化)
 * 信号周期=(TIMx_ARR +1 ) * 时钟周期
 * 占空比=TIMx_CCR/(TIMx_ARR +1)
//定时器的周期为5ms。
 
* @parameter    无
* @return          无
* @author            Love My BaoBaoGao                                                               
* @date               2018.12.15                        
******************************************************************************/
static void TIM1_Mode_Config(void)
{
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;

  /* Time base configuration */		 
  TIM_TimeBaseStructure.TIM_Period = 100-1;       //当定时器从0计数到999,即为1000次,为一个定时周期
  TIM_TimeBaseStructure.TIM_Prescaler = (SystemCoreClock/100000)-1;	    //设置预分频:不预分频,即为72MHz
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;	//设置时钟分频系数:不分频(这里用不到)
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数模式
  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

  /* 配置定时器通道 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;	    //配置为PWM模式1
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 500;	//设置通道4的电平跳变值,输出另外一个占空比的PWM
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OC1Init(TIM1, &TIM_OCInitStructure);	//使能通道4
  TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
  TIM_ARRPreloadConfig(TIM1, ENABLE);			 // 使能TIM1重载寄存器ARR

  /* 配置定时器通道 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;	    //配置为PWM模式1
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 500;	//设置通道4的电平跳变值,输出另外一个占空比的PWM
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OC2Init(TIM1, &TIM_OCInitStructure);	//使能通道4
  TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);
  TIM_ARRPreloadConfig(TIM1, ENABLE);			 // 使能TIM1重载寄存器ARR

  /* 配置定时器通道 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;	    //配置为PWM模式1
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 500;	//设置通道4的电平跳变值,输出另外一个占空比的PWM
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OC3Init(TIM1, &TIM_OCInitStructure);	//使能通道4
  TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);
  TIM_ARRPreloadConfig(TIM1, ENABLE);			 // 使能TIM1重载寄存器ARR

  /* TIM1 enable counter */
  TIM_Cmd(TIM1, ENABLE);                   //使能定时器1

  TIM_CtrlPWMOutputs(TIM1, ENABLE);

  TIM_ITConfig(TIM1,TIM_IT_Update, ENABLE);
}

工作异常的配置

/******************************************************************************                  
* @file     void TIM3_Init(void)
* @brief    TIM3 输出PWM信号初始化,只要调用这个函数
  *         TIM3的四个通道就会有PWM信号输出
* @parameter    无
* @return          无
* @author            Love My BaoBaoGao                                                               
* @date               2018.12.15                        
******************************************************************************/
void TIM1_Init(void)
{
	TIM1_GPIO_Config();
 
	TIM1_Mode_Config();
       TIM1_NVIC_Config();
}

工作正常的配置

/******************************************************************************                  
* @file     void TIM3_Init(void)
* @brief    TIM3 输出PWM信号初始化,只要调用这个函数
  *         TIM3的四个通道就会有PWM信号输出
* @parameter    无
* @return          无
* @author            Love My BaoBaoGao                                                               
* @date               2018.12.15                        
******************************************************************************/
void TIM1_Init(void)
{
	TIM1_GPIO_Config();
    TIM1_NVIC_Config();
	TIM1_Mode_Config();
    
}

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
除了TIM6和TIM7以外的定时器,其他定时器都可以用来产生PWM输出。其中高级定时器TIM1和TIM8可以同产生多达7路的PWM输出,而通用定时器也能同产生多达4路的PWM。此外,STM32定时器还具有输入捕获功能,可以用于对输入信号的频率、占空比、高低脉宽等参数的计算。对于PWM输入捕获,可以通过设置定时器的通道来实现。例如,通过利用TIM3_CH1作为PWM输出,TIM2_CH2进行捕获,可以测量出PWM的频率和占空比。具体步骤如下:首先设置PWM输出频率为1KHz,占空比为50%。为了实现PWM输入捕获,TIM2占用了2个通道,其中第2通道的电平变化会被第1通道和第2通道引脚检测到。假设输入的PWM从低电平开始跳变,在第一个上升沿到来,1,2通道同检测到上升沿。而从机设置为复位模式,将TIM2的计数值复位至0,此不会产生一个中断请求。下一个到来的电平是下降沿,此通道1发生捕获事件,将计数值存入通道1的CCR1里。然后是第二个上升沿到来后,此通道2发生捕获事件,将此的计数值存入通道2的CCR2里。复位模式此又将TIM2计数值复位至0,等待第二个下降沿到来。一次捕获过程完成,则PWM的频率f=72M/CCR2,占空比duty=(CCR1/CCR2) X 100%。综上所述,STM32定时器可以实现PWM输入捕获功能,并可以用来测量PWM的频率和占空比。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [stm32定时器部分学习(通用定时器的用法、PWM、输入捕获)](https://blog.csdn.net/non_mainstream/article/details/79221519)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [stm32定时器pwm模式输入捕获](https://blog.csdn.net/qq_29413829/article/details/52743273)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值